51单片机矩阵键盘程序示例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;lab5_asm
;vol
1.0
;zqy
;2012/2/18
;定义初始化
LED_CHABIT PSW.5;数码管显示标志位,为1显示十位,为0显示个位;数字0-9
ORG 00H
JMP START
ORG 000BH
JMP INT_T0;转到中断服务程序,更改数码管显示
ORG 0100H
LED_TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH
DB 0FDH,87H,0FFH,0EFH,0BFH
DB 86H,0DBH,0CFH,0E6H,0EDH,0FDH
LED_TAB2:
DB 0BFH,0BFH,0BFH,0BFH,0BFH
DB 0BFH,0BFH,0BFH,0BFH,0BFH
DB 86H,86H,86H,86H
DB 86H,86H,86H
START:
;工作寄存器和某些数据单元的初始化
MOV R0,#0
;数码管显示初始化
SETB LED_CHA
MOVDPTR, #8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA,#0FEH;位选数据,选中个位数码管,置低为选中
MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问
MOVDPTR,#8200H;段选地址
MOVA,#0BFH;段选数据,个位显示0
MOVX@DPTR, A
;定时器初始化
MOV IE,#82H;开启定时器T0中断
MOV TMOD,#01H;设定定时器T0为模式1
MOV TH0,#0D8H
MOV TL0,#0F0H;装入初值,10MS延时12MHZ
SETB TR0 ;启动定时器T0
KEY:
;按键处理
LCALL KEY_START;调用判断有无键按下子程序
JZ KEY;无键按下,重新扫描
LCALL KEY_DELAY;有键按下,延时去抖LCALL KEY_START
JZ KEY
LCALL KEY_NEXT;判断哪一个键被按下LCALL DECODE;键值译码
LCALL KEY_END;判断按键释放
LJMP KEY
KEY_START:
MOV DPTR, #8000H;键盘地址
MOV A,#0F0H
MOVX @DPTR,A;行全部输出0
NOP
NOP
NOP
MOVX A,@DPTR;扫描键盘
CPL A;取正逻辑,1为按下
ANL A,#0FH
RET
KEY_NEXT:
MOV R1,#0;扫描行计数器
MOV R2,#0;扫描列计数器
MOV R3,#0FEH;首行扫描字送R3 MOV DPTR, #8000H
MOV A,R3
MOVX @DPTR,A
MOVX A,@DPTR
CPL A
ANL A,#0FH
MOV R4,#4
S0123: JNZ SKEY0;不为全0,有键按下;全为0,进行下一行扫描
INC R1;行计数器加1
MOV A,R3
RL A
MOV R3,A
MOV DPTR,#8000H
MOVX @DPTR,A
NOP
NOP
NOP
MOVX A,@DPTR
CPL A
ANL A,#0FH
DJNZ R4,S0123
LJMP KEY
EKEY:
RET
SKEY0:;列号译码
JB
ACC.0,SKEY1
JB
ACC.1,SKEY2
JB
ACC.2,SKEY3
JB
ACC.3,SKEY4
SKEY1:MOV A,#00H;存列号0 MOV R2,A
AJMP EKEY
SKEY2:MOV A,#01H;存列号1 MOV R2,A
AJMP EKEY
SKEY3:MOV A,#02H;存列号2
MOV R2,A
AJMP EKEY
SKEY4: MOV A,#03H;存列号3 MOV R2,A
AJMP EKEY
DECODE:
;行号在R1,列号在R2
;键值译码
MOV A,R1
MOV B,#04H
MUL AB
ADD A,R2
INC A
MOV R0,A
RET
KEY_END:
MOV DPTR,#8000H;键盘地址MOVX A,@DPTR;扫描键盘CPL A;取正逻辑,1为按下ANL A,#0FH
JNZ KEY_END
LCALL KEY_DELAY
JNZ KEY_END
RET
KEY_DELAY:
MOV R5,#10H
DS1:MOV R6,#0FFH
DS2:NOP
DJNZ R6,DS2
DJNZ R5,DS1
RET
INT_T0:;中断服务程序,更改数码管显示
MOV R7,A
JB LED_CHA,DISP_L;检查数码管显示标志位
CPL LED_CHA
MOVDPTR, #8200H;段选地址
MOV A,#0
MOVX @DPTR,A
MOVDPTR,#8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA, #0FEH;位选数据,选中个位数码管,置低为选中
MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问
;判断需要显示的个位数字
MOV A,R0