1、键盘与的连接
图3键盘连接
图4单片机与键盘接口图
2、通过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
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
关于C语言基础知识点介绍
基于PWM控制与超级电容器控制的电压暂降抑制装置设计
OpenHarmony当前进展和未来趋势
SK电讯完成第二代英特尔芯片测试,改善流量的延迟和抖动性能
荷兰输电系统运营商TSO获得2.5亿欧元贷款
单片机键盘程序设计给出一个例程
荣耀70搭载天玑9000高端旗舰芯片,打造同级最强产品
聚科照明披露上半年绩报 销售总收入达6616万
最新的调谐解调片上系统(SoC)方案DIB7090P和DIB
华为荣耀V9,这就是我们想要的手机?
号称“最实惠的家用轿车”的神车卡罗拉配置有点牛逼!
关于智能驾驶引爆的无限可能的分析和介绍
机器人:人工智能的新应用
J6051系留多旋翼无人机技术的应急通信方案
下一代Mac将采用更先进全新电源管理技术
如何重新定义Wi-Fi功能?
4348块电池板如何将光转化成电
电流探头测小电流怎么测
Verilog CIC滤波器设计
“老公休息舱”能做些什么?“老公休息舱”使用情况