单片机键盘扫描程序(汇编)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;单片机键盘扫描程序(汇编)
;键盘扫描程序;此程序比较复杂,不过如果你坚持的理解下去的话,还是能够理解的,比较经典
;最终是按键的值输出到数码管中(接在P2口)
ORG 0000H
START: MOV R0,#00H ;初始化程序,开始的延时是为了使硬件能够准备好
DJNZ R0,$
LOOP: MOV SP,#60H
CALL KEY
DISPLAY:
MOV A,R4
MOV DPTR,#TABLE ;定义字形表的起始地址
MOVC A,@A+DPTR ;TABLE为表的起始地址
MOV P2,A
SJMP LOOP
;子程序内容 ,P1口的第四位为行线,高四位为列线
KEY: PUSH PSW
PUSH ACC
MOV P1,#0F0H ;令所有的行为低电平,全扫描字-P1.0-P1.3,列为输入方式
;这一段只是验证有键按下,并不能判断是哪一行
MOV R7,#0FFH ;设置计数常数,作为延时
KEY1: DJNZ R7,KEY1
MOV A,P1 ;读取P1口的列值
ANL A,#0F0H ;判别有键值按下吗(当有键按下时,P1口的高四位就不全为1了,底四位还是都为0的)
;这个地方进行相或的原因,是因为要把底四位的0000变成1111,以便下一步进行求反
ORL A,#0FH //这个地方原版上没有,这是又加了,如果不加的的话,是不对的********
CPL A ;求反后,有高电平就有键按下
JZ EKEY;累加器为0则转移(意为求反后本来全为0的,如果有键按下时,求反后高四位就有1了),退出
LCALL DEL20ms ;有键按下,进行处理
;下面进行行行扫描,1行1行扫
SKEY: MOV A,#00H
MOV R0,A ;R0作为行计数器,开始初值为0
MOV R1,A ;R1作为列计数器,开始初值为0
MOV R2,#0FEH ;R2作为扫描暂存字,开始初值为1111 1110,(第四位作为行扫描字)
SKEY2: MOV A,R2
MOV P1,A ;输出行扫描字,1111 1110
NOP
NOP
NOP ;3个NOP操作使P1口输出稳定
MOV A,P1 ;读列值(和开始一样)
MOV R1,A ;暂存列值(第一次为**** 1110,既高四位有一位"可能"会为0)
ANL A,#0F0H ;取高四位,
ORL A,#0FH ;使第四位全部置1
CPL A
BIAOZHI:JNZ SKEY3 ;累加器为非0则转移指令(意思是判断到按键在这一行),转去处理
INC R0 ;如果按键没在这一行,行计数器加1
SETB C ;进位标志位加1,为了在左移的时候开始的低位0不在出现在低(循环一圈后)
MOV A,R2
RLC A ;带进位左移1位(形成下一行扫描字,再次扫描)
MOV R2,A
MOV A,R0
;把加1后的行计数器R0和总共扫描次数(4次比较)
CJNE A,#04H,SKEY2 ;(扫描完了么)书本上这个地方也有错误,书本上写的是:SKEY1
AJMP EKEY ;如果没有的话,退出
;有键按下后行扫描过后,此为确列行
SKEY3: MOV A,R1 ;
JNB ACC.4,SKEY5 ;直接寻址位为0咋转移指令
JNB ACC.5,SKEY6
JNB ACC.6,SKEY7
JNB ACC.7,SKEY8
AJMP EKEY //我自己感觉到这命令没有用处
SKEY5: MOV A,#00H ;存0列号
MOV R3,A
AJMP DKEY
SKEY6: MOV A,#01H ;存1列号
MOV R3,A
AJMP DKEY
SKEY7: MOV A,#02H ;存2列号
MOV R3,A
AJMP DKEY
SKEY8: MOV A,#03H ;存3列号
MOV R3,A
AJMP DKEY
;取出具体的行号,再加上列号,最终确认按键的号码
DKEY: MOV R4,#00H
MOV A,R0
MOV B,#04H
MUL AB ;让行号*4,第四位放在A中(总共就4行,相乘后一定<16,也就是只有第四位有值)
ADD A,R3 ;让行号和列号相加,最终确认任按键的具体号
MOV R4,A
EKEY: POP ACC
POP PSW
RET ;按键扫描处理函数
DEL20ms:
MOV R7,#2
DL2: MOV R6,#18
DL1: MOV R5,#255
DJNZ R5,$
DJNZ R6,DL1
DJNZ R7,DL2
RET
;此为共阴极数码管的数字表
TABLE: DB 3FH ;0
DB 06H ;1
DB 5BH ;2
DB 4FH ;3
DB 66H ;4
DB 6DH ;5
DB 7DH ;6
DB 27H ;7
DB 7FH ;8
DB 6FH ;9
DB 77H
DB 7CH
DB 39H
DB 5EH
DB 79H
DB 71H
END