ORG 0000H
START:MOV R3,#08H
MOV 08H,#0H
MOV 09H,#0H
MOV 0AH,#0H
MOV 0BH,#0H
;MOV 08H,#3FH
;MOV 09H,#3FH
;MOV 0AH,#3FH
;MOV 0BH,#3FH
TEST: MOV P3,#0F0H ;P3.0~P3.3输出0,P3.4~P3.7输出1,作为输入位
MOV A,P3 ;读键盘,检测有无按键按下
ANL A,#0F0H ;屏蔽P3.0~3.3,检测P3.4~P3.7是否全为一
CJNE A ,#0F0H,HAVE ;P3.4~P3.7不全为1,有键按下
LJMP DIS ;P3.4~P3.7全为1,无键按下,转显示
HAVE: MOV A,#0FEH ;有键按下,逐行扫描键盘,置扫描初值
NEXT: MOV B,A ;扫描码暂存与B
MOV P3,A ;输出扫描码
READ: MOV A,P3 ;读键盘
ANL A,#0F0H ;屏蔽P3.0~P3.3,检测P3.4~P3.7是否全为1
CJNE A,#0F0H,YES ;P3.4~P3.7不全为一,该行有键按下
MOV A,B ;被扫描行无键按下,准备查下一行
RL A ;置下一行扫描码
CJNE A,#0EFH,NEXT ;未扫描到最后一行,则循环
YES: ACALL DAY ;延时,去抖动
AREAD:MOV A,P3 ;再读键盘
ANL A,#0F0H ;屏蔽P3.0~P3.3,保留P3.4~P3.7
MOV R2,A ;暂存列码
MOV A,B
ANL A,#0FH ;取行扫描码
ORL A,R2 ;行码,列码合并为键编码
YES1: MOV B,A ;键编码存于B
CJNE R3,#0CH,SAM38 ;转键分析处理程序
MOV R3,#08H
MOV 08H,#0H
MOV 09H,#0H
MOV 0AH,#0H
MOV 0BH,#0H
LJMP SAM38 ;转键分析处理程序
DAY: MOV R6,#0AH ;外循环10次 6MHz晶振
DL2: MOV R7,#7DH ;内循环7DH次
DL1: NOP
NOP ;空操作指令
DJNZ R6,DL1
DJNZ R7,DL2
RET
SAM38:MOV DPTR,#TAB2 ;置键码表首地址
MOV A,#0 ;表的起始位的偏移量为0
NEXT1:PUSH ACC ;MOV R3,A
MOVC A,@A+DPTR
CJNE A,B,AGAN ;将B中的值和键码表的值比较
LJMP SAM39
AGAN: POP ACC ;不相等,则比较下一个
INC A ;序号加1
CJNE A,#10H,NEXT1
PUSH ACC
LJMP SAM39
SAM39:MOV DPTR,#TAB1
POP ACC
MOVC A,@A+DPTR
;MOV DPTR,#0H
;MOV @R3+DPTR,A
CJNE R3,#0CH,SAM40
MOV R3,#08H
PUSH ACC
MOV A,R3
MOV R0,A
POP ACC
;MOV R0,R3
INC R3
MOV @R0,A
MOV A,#0H
MOV 09H,A
MOV 0AH,A
MOV 0BH,A
LJMP DIS
SAM40:;MOV R0,R3
PUSH ACC
MOV A,R3
MOV R0,A
POP ACC
MOV @R0,A
INC R3
LJMP DIS
DIS: MOV DPTR,#08H
MOV R0,#0 ;R0存放字形表偏移位
MOV R1,#01H ;R1存放数码表位选代码
DISP: MOV A,R0
MOVC A,@A+DPTR ;查字形码表
MOV P2,#0H ;清显示
;ACALL DAY
MOV P1,A ;送至P1口输出
;ACALL DAY
MOV A,R1
MOV P2,A ;输出位选码
ACALL DAY ;延时
;MOV A,R1
INC R0 ;指向下一位字形
RL A ;指向下一位
MOV R1,A
CJNE R1,#10H,DISP ;四个数码管是否显示完毕
LJMP TEST
TAB1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;"0----15"的字形码
TAB2: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH,0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H
END
|