键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。
按钮开关的抖动问题
组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开
图1
图2
关s未被按下时,p1。0输入为高电平,s闭合后,p1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,p1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。
为使cpu能正确地读出p1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于硬件办法我们不介绍。软件法其实很简单,就是在单片机获得p1。0口为低的信息后,不是立即认定s1已被按下,而是延时10毫秒或更长一些时间后再次检测p1。0口,如果仍为低,说明s1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(p1。0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。
键盘与单片机的连接
图3
图4
1、通过1/0口连接。将每个按钮的一端接到单片机的i/o口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到p3.2 、p3.3、p3.4和p3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义如下:
p3.2:开始,按此键则灯开始流动(由上而下)
p3.3:停止,按此键则停止流动,所有灯为暗
p3.4:上,按此键则灯由上向下流动
p3.5:下,按此键则灯由下向上流动
updown equ 00h ;上下行标志
startend equ 01h ;起动及停止标志
lampcode equ 21h ;存放流动的数据代码
org 0000h
ajmp main
org 30h
main:
mov sp,#5fh
mov p1,#0ffh
clr updown ;启动时处于向上的状态
clr startend ;启动时处于停止状态
mov lampcode,#0feh ;单灯流动的代码
loop:
acall key ;调用键盘程序
jnb f0,lnext ;如果无键按下,则继续
acall keyproc ;不然调用键盘处理程序
lnext:
acall lamp ;调用灯显示程序
ajmp loop ;反复循环,主程序到此结束
delay:
mov r7,#100
d1: mov r6,#100
djnz r6,$
djnz r7,d1
ret
;----------------------------------------延时程序,键盘处理中调用
keyproc:
mov a,b ;从b寄存器中获取键值
jb acc.2,keystart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)
jb acc.3,keyover
jb acc.4,keyup
jb acc.5,keydown
ajmp key_ret
keystart:
setb startend ;第一个键按下后的处理
ajmp key_ret
keyover:
clr startend ;第二个键按下后的处理
ajmp key_ret
keyup: setb updown ;第三个键按下后的处理
ajmp key_ret
keydown:
clr updown ;第四个键按下后的处理
key_ret:ret
key:
clr f0 ;清f0,表示无键按下。
orl p3,#00111100b ;将p3口的接有键的四位置1
mov a,p3 ;取p3的值
orl a,#11000011b ;将其余4位置1
cpl a ;取反
jz k_ret ;如果为0则一定无键按下
acall delay ;不然延时去键抖
orl p3,#00111100b
mov a,p3
orl a,#11000011b
cpl a
jz k_ret
mov b,a ;确实有键按下,将键值存入b中
setb f0 ;设置有键按下的标志
k_ret:
orl p3,#00111100b ;此处循环等待键的释放
mov a,p3
orl a,#11000011b
cpl a
jz k_ret1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
ajmp k_ret
k_ret1:
ret
d500ms: ;流水灯的延迟时间
push psw
setb rs0
mov r7,#200
d51: mov r6,#250
d52: nop
nop
nop
nop
djnz r6,d52
djnz r7,d51
pop psw
ret
lamp:
jb startend,lampstart ;如果startend=1,则启动
mov p1,#0ffh
ajmp lampret ;不然关闭所有显示,返回
lampstart:
jb updown,lampup ;如果updown=1,则向上流动
mov a,lampcode
rl a ;实际就是左移位而已
mov lampcode,a
mov p1,a
lcall d500ms
ajmp lampret
lampup:
mov a,lampcode
rr a ;向下流动实际就是右移
mov lampcode,a
mov p1,a
lcall d500ms
lampret:
ret
end
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
2、采用中断方式:如图4所示。各个按钮都接到一个与非上,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的处理
深兰科技斩获“上海设计100+”和“设享奖EDW”大奖
Allegro推出新型双线单极霍尔效应开关系列
紫米近期将推10000mAh无线充MFi移动电源
NVIDIA已确认确认RTX 3080Ti/3070Ti/3060/3050
6C19小功率单端胆机制作
25课:单片机键盘接口程序设计
安全缆绳锁的特点介绍,它的安全系数怎么样
AD1580简介及应用
雷鸟创新消费级真AR眼镜亮相
电场风机远程监控系统的功能实现及应用优势分析
科技赋能产业 数据可视化和物联网的结合 数据化管理提高生产效率
TSMaster小程序启动和停止的自动化控制流程
嵌入式系统设计将如何访问存储设备
基于MSP430便携式心率测量系统电路设计图
Google I/O 2019: Android Q 来袭!暗黑模式也来了
揭底锂电行业10大黑马企业
飞创直线电机模组负载、速度、行程、使用环境常见问题
爱科技(AKG)K450 头戴式耳机现已在京东开启预售
施耐德电气软硬件一体化的楼宇住宅全行业解决方案赋能绿色发展
常用电气元件文字符号大全