;*************** 键盘扫描子程序 ****************************
;功能:键盘扫描并得到键码,入口参数:无
;出口参数:键码值存于A
;***********************************************************
KEY: MOV P0, #0FH ;A1-A4输出,B1-B4输入,输
;入者对应锁存先写 "1"
MOV A, P0 ;读取键盘状况
CJNE A,#0FH, K11 ;有键按下
K10: AJMP KEY ;无键按下
K11: ACALL DELAY ;去抖动
MOV P0, #0FH
MOV A, P0 ;再读键盘状况
CJNE A, #0FH, K12 ;确有键盘按下
SJMP K10 ;误动作
K12: MOV B,A ;存列值
MOV P0, #0EFH ;按键在Ai行
MOV A, P0
CJNE A, #0EFH,K13 ;键在A4
MOV P0, #0DFH
MOV A, P0
CJNE A, #0DFH,K13 ;键在A3行
MOV P0, #0BFH
MOV A,P0
CJNE A, #0BFH,K13 ;键在A2行
MOV P0, #7FH
MOV A, P0原文请找QQ324.9114
CJNE A,#7FH, K13 ;键在A1行
AJMP K10 ;多键同时按下
K13: ANL A, #0F0H ;得行值
ORL A, B ; 得按下键的行列值
MOV B, A ;暂存键值
MOV R1, #16 ;16个键
MOV R2, #0 ;设置取键码的计数指针初值
MOV DPTR,#TABLE1 ;键值表首址
K14: MOV A,R2
MOVC A, @A+DPTR ;从键值表中取键值
CJNE A, B, K16 ;与按下键,键值比较
MOV P0,#0FH ;相等,则完成以下步骤
K15: MOV A, P0
CJNE A, #0FH, K15 ;等释放
ACALL DELAY ;去抖动
MOV A, R2 ;按键放开,载入计数指针值
MOV DPTR,#TABLE2 ;键码表首地址
MOVC A,@A+DPTR ;查键码表得到键码值存于A
RET
K16: INC R2 ;不相等,则继续访问键值表
DJNZ R1,K14
AJMP K10 ;多键同时按下处理
;************* 延时子程序 ********************************
DELAY: MOV R7,#20H ;延时,步进电机转速为20毫秒
D1: MOV R6,#248
DJNZ R6,$
毕业论文http://www.751com.cn/ DJNZ R7,D1
RET
;********************* 键值表 ******************************
TABLE1: DB 0EEH, 0DEH, 0BEH, 07EH ;键值
DB 0EDH, 0DDH, 0BDH, 07DH
DB 0EBH, 0DBH, 0BBH, 07BH
DB 0E7H, 0D7H, 0B7H, 077H
;******** ************* 键码表******************************
TABLE2: DB 01H,02H,03H,0CH ; 键盘码
DB 04H,05H,06H,0DH
DB 07H,08H,09H,0EH