微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机键盘扫描程序(汇编)

单片机键盘扫描程序(汇编)

时间:11-18 来源:互联网 点击:
;这个相对起来比较难,如果理解不了的话,可以(返回日志目录,或者是本日志的右上角,你也可以看到)看上篇(课程设计:矩阵键盘,相对来说,非常简单了)

;键盘扫描程序;此程序比较复杂,不过如果你坚持的理解下去的话,还是能够理解的,比较经典
;最终是按键的值输出到数码管中(接在P2口)
ORG0000H
START:MOVR0,#00H;初始化程序,开始的延时是为了使硬件能够准备好
DJNZR0,$
LOOP: MOVSP,#60H
CALLKEY
DISPLAY:
MOV A,R4
MOV DPTR,#TABLE ;定义字形表的起始地址
MOVC A,@A+DPTR ;TABLE为表的起始地址
MOV P2,A
SJMPLOOP

;子程序内容,P1口的第四位为行线,高四位为列线
KEY: PUSHPSW
PUSHACC
MOVP1,#0F0H ;令所有的行为低电平,全扫描字-P1.0-P1.3,列为输入方式
;这一段只是验证有键按下,并不能判断是哪一行
MOVR7,#0FFH;设置计数常数,作为延时

KEY1:DJNZR7,KEY1

MOVA,P1;读取P1口的列值
ANLA,#0F0H;判别有键值按下吗(当有键按下时,P1口的高四位就不全为1了,底四位还是都为0的)
;这个地方进行相或的原因,是因为要把底四位的0000变成1111,以便下一步进行求反
ORLA,#0FH //这个地方原版上没有,这是又加了,如果不加的的话,是不对的********

CPLA;求反后,有高电平就有键按下
JZEKEY;累加器为0则转移(意为求反后本来全为0的,如果有键按下时,求反后高四位就有1了),退出
LCALLDEL20ms ;有键按下,进行处理

;下面进行行行扫描,1行1行扫
SKEY:MOVA,#00H
MOVR0,A ;R0作为行计数器,开始初值为0
MOVR1,A ;R1作为列计数器,开始初值为0
MOVR2,#0FEH ;R2作为扫描暂存字,开始初值为1111 1110,(第四位作为行扫描字)

SKEY2:MOVA,R2
MOVP1,A ;输出行扫描字,1111 1110
NOP

NOP
NOP ;3个NOP操作使P1口输出稳定
MOVA,P1 ;读列值(和开始一样)
MOVR1,A ;暂存列值(第一次为**** 1110,既高四位有一位"可能"会为0)
ANLA,#0F0H ;取高四位,
ORLA,#0FH ;使第四位全部置1
CPLA
BIAOZHI:JNZSKEY3;累加器为非0则转移指令(意思是判断到按键在这一行),转去处理

INCR0;如果按键没在这一行,行计数器加1
SETBC;进位标志位加1,为了在左移的时候开始的低位0不在出现在低(循环一圈后)
MOVA,R2
RLCA;带进位左移1位(形成下一行扫描字,再次扫描)
MOVR2,A
MOVA,R0
;把加1后的行计数器R0和总共扫描次数(4次比较)
CJNEA,#04H,SKEY2 ;(扫描完了么)书本上这个地方也有错误,书本上写的是:SKEY1
AJMPEKEY ;如果没有的话,退出

;有键按下后行扫描过后,此为确列行
SKEY3:MOVA,R1 ;
JNBACC.4,SKEY5 ;直接寻址位为0咋转移指令
JNBACC.5,SKEY6
JNBACC.6,SKEY7
JNBACC.7,SKEY8
AJMPEKEY //我自己感觉到这命令没有用处

SKEY5:MOVA,#00H ;存0列号
MOVR3,A
AJMPDKEY

SKEY6:MOVA,#01H ;存1列号
MOVR3,A
AJMPDKEY

SKEY7:MOVA,#02H ;存2列号
MOVR3,A
AJMPDKEY

SKEY8:MOVA,#03H ;存3列号
MOVR3,A
AJMPDKEY

;取出具体的行号,再加上列号,最终确认按键的号码
DKEY://MOVR4,#00H
MOVA,R0
MOVB,#04H
MULAB;让行号*4,第四位放在A中(总共就4行,相乘后一定<16,也就是只有第四位有值)
ADDA,R3;让行号和列号相加,最终确认任按键的具体号
MOVR4,A

EKEY:POPACC
POPPSW

RET ;按键扫描处理函数

DEL20ms:
MOVR7,#2
DL2: MOVR6,#18
DL1: MOVR5,#255
DJNZR5,$
DJNZR6,DL1
DJNZR7,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
DB77H
DB7CH
DB39H
DB5EH
DB79H
DB71H

END

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top