您的位置 首页 主动

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

;这个相对起来比较难,如果理解不了的话,可以(返回日志目录,或者是本日志的右上角,你也可以看到)看上篇(课程设计:矩阵键盘,相对来说…

;这个相对起来比较难,假如了解不了的话,可以(回来日志目录,或者是本日志的右上角,你也可以看到)看上篇(课程设计:矩阵键盘,相对来说,十分简略了)

;键盘扫描程序;此程序比较复杂,不过假如你坚持的了解下去的话,仍是可以了解的,比较经典
;终究是按键的值输出到数码管中(接在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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/266714.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部