一个案例带你了解独立式键盘设计原理

简介: 一个案例带你了解独立式键盘设计原理

单片机与4个独立按键S1~S4以及8只LED指示灯构成一个独立式键盘系统。4个按键接在P1.0~P1.3引脚,P3口接8只LED指示灯,控制8只LED指示灯的亮和灭,原理图如下。当按下S1按键时,P3口的8只LED指示灯正向流水点亮;当按下S2按键时,P3口的8只LED指示灯反向流水点亮;当按下S3按键时,P3口的4只LED指示灯高低交替点亮;当按下S4按键时,P3口的8只LED指示灯闪烁点亮;



25.png

由于本例中的4个按健分别对应4种不同的点亮功能,且具有不同的交理号"keyval" ,具体如下:


●按下S1按键时,keyval=1。


●按下S2按键时,keyval=2。


●按下S3按键时,keyval=3。


●按下S4按键时,keyval=4。


本例的独立式键盘的工作原理如下:


(1)首先判断是否有按键按下


将接有4个按键的P1口低4位(P1.0~P1.3)写人1,使PI口低4位为输人状态。然后读入低4位的电平,只要不全为1,则说明有键按下。读取方法如下:


P1 =0xff;


i((P1&0x0f)! =0x0f);



//读人的P1口低4位各按键的状态,按位与运算后的结果


//不是0xOf,表明低4位必有1位是0,说明有键按下



(2)按键去抖动


当判别有键按下时,调用软件延时子程序,延时约10 ms后再进行判别,若按键确实按下,则执行相应的按键功能,否则重新开始进行扫描。


(3)获得键号


确认有键按下时,可采用扫描方法,来判断哪个键按下,并获取键值。


代码实现


1.定义按键引脚

#include<reg52.h>
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
unsigned char keyval;

2. 主函数

void main()
{
  keyval=0;
  while(1)
  {
    key_scan();
    switch(keyval)
    {
      case 1:forward();
        break;
      case 2:backward();
        break;
      case 3:alter();
        break;
      case 4:blink();
        break;
    }
  }
}


3.键盘扫描函数

void key_scan()
{
  P1=0xff;
  if((P1&0x0f)!=0x0f)
  {
    delay10ms();
    if(S1==0)
    keyval=1;
    if(S2==0)
    keyval=2;
    if(S3==0)
    keyval=3;
    if(S4==0)
    keyval=4;
  }
}

4.正向流水点亮LED

void forward()
{
  P3=0xfe;
  led_delay();
  P3=0xfd;
  led_delay();
  P3=0xfb;
  led_delay();
  P3=0xf7;
  led_delay();
  P3=0xef;
  led_delay();
  P3=0xdf;
  led_delay();
  P3=0xbf;
  led_delay();
  P3=0x7f;
  led_delay();
}

5.反向流水点亮LED函数

void backward()
{
  P3=0x7f;
  led_delay();
  P3=0xbf;
  led_delay();
  P3=0xdf;
  led_delay();
  P3=0xef;
  led_delay();
  P3=0xf7;
  led_delay();
  P3=0xfb;
  led_delay();
  P3=0xfd;
  led_delay();
  P3=0xfe;
  led_delay();
}

6.交替点亮高低LED函数

void alter()
{
  P3=0x0f;
  led_delay();
  P3=0xf0;
  led_delay();
}

7.闪烁点亮LED函数

void blink()
{
  P3=0xff;
  led_delay();
  P3=0x00;
  led_delay();
}


8.流水灯显示延时函数

void led_delay(void)
{
  unsigned char i,j;
  for(i=0;i<220;i++)
  for(j=0;j<220;j++);
}

9.软件消抖延时函数

void delay10ms()
{
  unsigned char i,j;
  for(i=0;i<100;i++)
  for(j=0;j<100;j++);
}

这样我们一步步实现了独立式键盘设计。下面附上总程序。

#include<reg52.h>
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
unsigned char keyval;
void key_scan()
{
  P1=0xff;
  if((P1&0x0f)!=0x0f)
  {
    delay10ms();
    if(S1==0)
    keyval=1;
    if(S2==0)
    keyval=2;
    if(S3==0)
    keyval=3;
    if(S4==0)
    keyval=4;
  }
}
void forward()
{
  P3=0xfe;
  led_delay();
  P3=0xfd;
  led_delay();
  P3=0xfb;
  led_delay();
  P3=0xf7;
  led_delay();
  P3=0xef;
  led_delay();
  P3=0xdf;
  led_delay();
  P3=0xbf;
  led_delay();
  P3=0x7f;
  led_delay();
}
void backward()
{
  P3=0x7f;
  led_delay();
  P3=0xbf;
  led_delay();
  P3=0xdf;
  led_delay();
  P3=0xef;
  led_delay();
  P3=0xf7;
  led_delay();
  P3=0xfb;
  led_delay();
  P3=0xfd;
  led_delay();
  P3=0xfe;
  led_delay();
}
void alter()
{
  P3=0x0f;
  led_delay();
  P3=0xf0;
  led_delay();
}
void blink()
{
  P3=0xff;
  led_delay();
  P3=0x00;
  led_delay();
}
void led_delay(void)
{
  unsigned char i,j;
  for(i=0;i<220;i++)
  for(j=0;j<220;j++);
}
void delay10ms()
{
  unsigned char i,j;
  for(i=0;i<100;i++)
  for(j=0;j<100;j++);
}
void main()
{
  keyval=0;
  while(1)
  {
    key_scan();
    switch(keyval)
    {
      case 1:forward();
        break;
      case 2:backward();
        break;
      case 3:alter();
        break;
      case 4:blink();
        break;
    }
  }
}


相关文章
|
开发工具 git
git,github,gitlab,码云的区别
码云https://gitee.com/enterprises?from=tg-6-7是开源中国社区推出的基于git的代码托管服务平台,基于gitlab。目前招商银行,中国科学技术大学,CSDN等多家企业和机构都在使用码云平台
1037 0
|
Android开发 芯片 开发者
Android MediaTek bootloader 的序列号长度 & 移除非字母和数字限制 SN-Writer工具支持写入
Android MediaTek bootloader 的序列号长度 & 移除非字母和数字限制 SN-Writer工具支持写入
401 0
|
小程序 前端开发 算法
小程序实现个人支付功能
1.小程序的支付功能一直有人咨询 2.以前一直以为个人开发者是不可以使用支付功能的 3.但是微信自己有个骚操作 ,所以个人也可以使用小程序功能 4.下面介绍
2159 0
小程序实现个人支付功能
|
JavaScript 容器
Ant Design Vue 中Drawer自定头部的样式、内容部分的样式、弹出层的样式
Ant Design Vue 中Drawer自定头部的样式、内容部分的样式、弹出层的样式
|
9月前
|
缓存 自然语言处理 Android开发
Magnet Axiom 9.5 新增功能概览 - 数字取证与分析
Magnet Axiom 9.5 新增功能概览 - 数字取证与分析
302 5
Magnet Axiom 9.5 新增功能概览 - 数字取证与分析
|
12月前
|
人工智能 运维 搜索推荐
CodeBuddy助力数学教学:数学老师直呼内行!
本文探讨AI在数学教学中的应用,解决传统教学中公式编辑耗时、互动题型开发难、学情分析不精准等问题。通过智能生成教学资源、设计互动题型、精准学情分析和个性化资源定制四大功能,大幅提升教学效率与质量。实际案例展示AI生成交互式函数图像课件和立体几何动态模型工具的效果。对比显示,AI辅助教学显著优于传统模式,助力教育数字化转型,推动精准化教学与教研资源共享。
771 0
|
传感器 Go 智能硬件
使用Golang开发硬件驱动
使用Golang开发硬件驱动
|
网络协议 网络虚拟化 网络架构
单臂路由实现VLAN间路由
本文介绍了单臂路由实现VLAN间路由的配置方法,包括网络设备的IP配置、交换机的VLAN划分、路由器的子接口配置以及ARP广播的设置,并通过ping测试验证了配置的正确性。
单臂路由实现VLAN间路由
|
云安全 存储 运维
首次全面解析云原生成熟度模型:解决企业「诊断难、规划难、选型难」问题
从“上云”到“云上”原生,云原生提供了最优用云路径,云原生的技术价值已被广泛认可。当前行业用户全面转型云原生已是大势所趋,用户侧云原生平台建设和应用云原生化改造进程正在加速。
3635 107
首次全面解析云原生成熟度模型:解决企业「诊断难、规划难、选型难」问题
|
Ubuntu
蓝易云 - Ubuntu18.04交叉编译curl-7.61.0
这样,curl就被交叉编译并安装到了/usr/arm-linux-gnueabihf目录下。你可以将其拷贝到目标机器上进行使用。
672 2