当前位置:文档之家› 51单片机矩阵键盘程序示例

51单片机矩阵键盘程序示例

;lab5_asm
;vol
1.0
;zqy
;2012/2/18
;定义初始化
LED_CHABIT PSW数码管显示标志位,为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,#OFEH位选数据,选中个位数码管,置低为选中
MOVX@DPTR,脸选数据,对片外I/O 口的外设芯片访问
MOVDPTR,#8200H段选地址
MOVA,#OBFH段选数据,个位显示0
MOVX@DPTR, A
;定时器初始化
MOV IE,#82H开启定时器T0中断
MOV TMOD,#01H设定定时器T0为模式1
MOV TH0,#0D8H
MOV TL0,#0F0H装入初值,10MS 延时12MHZ
SETB TRC启动定时器T0
KEY:
;按键处理
LCALL KEY_START用判断有无键按下子程序
JZ KEY无键按下,重新扫描
LCALL KEY_DELAY键按下,延时去抖
LCALL KEY_START
JZ KEY
LCALL KEY_NEXT断哪一个键被按下LCALL DECODED® 译码
LCALL KEY_EN判断按键释放LJMP KEY
KEY_START:
MOV DPTR, #8000H键盘地址
MOV A,#0F0H
MOVX @DPTR,A亍全部输出0 NOP
NOP
NOP
MOVX A,@DPTR3 描键盘
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 SKEY不;为全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
SKEY 0列号译码
JB
ACC.0,SKEY1
JB
ACC.1,SKEY2
JB
ACC.2,SKEY3
JB
ACC.3,SKEY4
SKEY1:M0V A,#00存列号0 MOV R2,A
AJMP EKEY
SKE Y2:M0V A,#01存列号1 MOV R2,A
AJMP EKEY
SKEY3:M0V A,#02存列号2 MOV R2,A
AJMP EKEY
SKEY4: MOV A,#03存列号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,@DPTR3 描键盘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_TO:;中断服务程序,更改数码管显示
MOV R7,A
JB LED_CHA,DISP检查数码管显示标志位
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
NOP
MOV DPTR,#LED_TAB1
NOP
NOP
MOVC A,@A+DPTR
MOVDPTR, #82001■段选地址
MOVX @DPTR,A
JMP INT_EXIT
DISP_L:
CPL LED_CHA
MOVDPTR, #8200H段选地址
MOV A,#0
MOVX @DPTR,A
MOVDPTR,#8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA, #0FDH位选数据,选中十位数码管,置低为选中
MOVX@DPTR, A位选数据,对片外I/O 口的外设芯片访问
;判断需要显示的十位数字0 或1
MOV A,R0
NOP
MOV DPTR,#LED_TAB2
MOVC A,@A+DPTR
MOVDPTR, #8200H段选地址
MOVX @DPTR,A
INT_EXIT:
MOV IE,#82H
MOV TH0,#0D8H
MOV TLO,#OFOH装入初值,10MS延时
SETB TR0
MOV A,R7
MOV DPTR,#8000H
RETI
END12MHZ。

相关主题