实验功能:利用P3口接的8个按键,按下按键数码管显示按键序号,
实验原理:设置P3口为输入端口,设置一个保存按键值的单元40H,检测到有按键按下,将标志位置1,保存键值到40H单元,此后不断检测当前键值和保存在40H中的值是否相等,如果 相等说明按键一直按下,没有松手,我们不需要处理,直接返回。只有检测到当前按键值不等于40H单元保存的上一个按键值后,说明按键已经彻底释放,才进行后续的键值识别,确定具体是哪个按键按下,程序进行相应的处理。从而实现多个按键的检测。
实验平台:
keil51、Proteus
实验原理图:
/*按键一旦按下设置按下标志位,保存当前按键值,检测按键状态
和保存的值是否一致,不一致,表明按键已经释放,可以根据键值
进行处理了,从而完成一次按键的识别*/
//keyoff equ 0x0f ;设置低四位为输入
keyoff equ 0xff ;设置8个按键为输入
keyold equ 40h ;保存按键状态
key equ p3 ;按键输入口
main:
clr p2.0 ;位选配合板子
loop:
acall san
acall disp
sjmp loop
san:
mov key,#keyoff ; p3设置为输入
jnb f0,gg ;判断第一次是否按下
sjmp tt1 ;如果按下,转tt1,检测是否松手
gg: mov keyold,key ;读按键值到keyold
mov a,keyold ;暂存按键值
cjne a,#keyoff,tt ;判断是否按下,有按键按下转tt
sjmp keysan1 ; 没有按键按下转keysan1
tt: setb f0 ;第一次按下f0置一,
tt1:
mov a,keyold ;读取上一次按键值
cjne a,key,keysan2 ;比较上一次的按键值和这次是否相等,看是否松手,没有松手转keysan
mov keyold,key ;保存按键值,可以不要
sjmp keysan1 ;
keysan2:
clr f0 ;清除标志位,为下一次按键准备
// orl a,#0f0h ;通过该语句可以更改输入按键个数
cjne a,#0feh,k8
mov r2,#1
sjmp keysan1
k8: cjne a,#0fdh,k7
mov r2,#2
sjmp keysan1
k7: cjne a,#0fbh,k6
mov r2,#3
sjmp keysan1
k6: cjne a,#0f7h,k5
mov r2,#4
sjmp keysan1
k5 :cjne a,#0efh,k4
mov r2,#5
sjmp keysan1
k4: cjne a,#0dfh,k3
mov r2,#6
sjmp keysan1
k3: cjne a,#0bfh,k2
mov r2,#7
sjmp keysan1
k2: cjne a,#07fh,keysan1
mov r2,#8
keysan1:
nop ;在等待松手的时间里可以安排其他程序
ret
disp: ;显示按键值
mov a,r2
add a,#(tab-$-3)
movc a,@a+pc
mov p0,a
ret
tab: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H
end