ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: LCALL KEY_IN
MOV P1,A
LCALL DEL ; 延时去抖
AJMP MAIN
;======================================================================
; == == ==判断有无按键,无按键直接返回 ===========
KEY_IN: MOV P2,#0FH ;置列线为低电平,读行线状态(低四位,无按键则全为1)
MOV A,P2 ;读取中
ANL A,#0FH ;屏蔽高四位
MOV B,A
MOV P2,#0F0H ;置行线为低电平,读列线状态(低四位,无按键则全为1)
MOV A,P2
ANL A,#0F0H ;屏蔽低四位
ORL A,B ;高低四位重新组合
CJNE A,#0FFH,KEYSCAN
AJMP MAIN
;================================================================================
;//========= 键盘扫描程序 //================================
KEYSCAN:
MOV R1,#0 ;初始化列地址
MOV R3,#01111111B ;初始化扫描码
LOOP: MOV A,R3
RL A
MOV R3,A ;保留扫描码
MOV P2,A ;送扫描码
MOV A,P2 ;读键盘
ORL A,#0FH ;屏蔽低四位
CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键按下
INC R1 ;行地址加1,扫描下一行
CJNE R1,#4,LOOP ;行地址不等于4,继续扫描下一行
SJMP EXTI ;没有按键,返回
;================// //============================
NEXT31: JB ACC.4,NEXT32
MOV R2,#0 ;第1列有按键
SJMP NEXT5
NEXT32: JB ACC.5,NEXT33
MOV R2,#1 ;第2列有按键
SJMP NEXT5
NEXT33: JB ACC.6,NEXT34
MOV R2,#2 ;第3列有按键
SJMP NEXT5
NEXT34:
MOV R2,#3 ;第4列有按键
NEXT5: MOV A,R1 ;计算按键地址
RL A
RL A ;行地址乘4
ADD A,R2 ;加列地址
MOV DPTR,#KEYTAB
MOVC A,@A+DPTR
EXTI: MOV P2,#0FFH ;置键盘接口为高电平
RET
;===========// 延时子程序,0.1S延时 //====================
DEL: MOV R7,#1
DEL1: MOV R6,#200
DEL2: MOV R5,#248
HERE: DJNZ R5,HERE
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
;==========//按键名称码,共阴数码管//============================
KEYTAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
;====================================================================
END |