4D显示的程序,只有一位显示。一直想写个多位显示的,没成功,知道问题在于防抖处理,可是无法下手,最后放弃。今天再试,成功了。

;按下4X4矩阵键盘之0~9,依次在8 位数码管上从最低位往高位显示按键的键名。8次后,从最低位重新开始。
;E:\DPJ\4X4KEY\4X4KEY_2.ASM 2012 01 03
ORG 00H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#60H
MOV DPTR,#TABLE
MOV A,#10
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV 33H,A
MOV 34H,A
MOV 35H,A
MOV 36H,A
MOV 37H,A
KEY:
ACALL KEYSCAN ;调用KEYSCAN,判断是否有键按下
JB F0,$-2 ;无键按下,转ACALL KEYSCAN,继续扫描
CJNE R0,#1,KEY_1
MOV 30H,R1
AJMP KEY ;R1为取码指针
KEY_1:
CJNE R0,#2,KEY_2
MOV 31H,R1
AJMP KEY
KEY_2:
CJNE R0,#3,KEY_3
MOV 32H,R1
AJMP KEY
KEY_3:
CJNE R0,#4,KEY_4
MOV 33H,R1
AJMP KEY
KEY_4:
CJNE R0,#5,KEY_5
MOV 34H,R1
AJMP KEY
KEY_5:
CJNE R0,#6,KEY_6
MOV 35H,R1
AJMP KEY
KEY_6:
CJNE R0,#7,KEY_7
MOV 36H,R1
AJMP KEY
KEY_7:
CJNE R0,#8,KEY_8
MOV 37H,R1
MOV R0,#0
KEY_8:
AJMP KEY
KEYSCAN: ;按键检测子程序
ACALL DISP
SETB F0 ;设F0=1
MOV R3,#0F7H ;行扫描指针初值(P2.3=0)
MOV R1,#00H ;取码指针初值
L2:
MOV A,R3 ;载入扫描指针
MOV P2,A ;输出至P2,开始扫描为0的一行
NOP
MOV A,P2 ;读入P2
SETB C
MOV R5,#4 ;检测P2.7~P2.4,共4 列
L3: ;检测4列
RLC A ;左移一位(P2.7~P2.4)
JNC KEY1 ;检测到C=0,表示被按下
INC R1 ;无键按下则取码指针加1
DJNZ R5,L3 ;4列检测完毕?
MOV A,R3 ;载入扫描指针
SETB C
RRC A ;扫描为0的下一行,
MOV R3,A ;存回R3扫描指针寄存器
JC L2 ;C=0,表示行扫描完毕
RT:
RET
KEY1:
ACALL D10MS ;防抖
KEY10:
ACALL DISP ;这里调用一次显示子程序,按下按键,显示保持连续 。
MOV A,P2
ANL A,#0F0H
ORL A,#0FH
CJNE A,#0FFH,KEY10 ;释放
CLR F0 ;F0清0 ,表示按键按下过
INC R0 ;按键按下次数,以确定显示的位数
RET
DISP:
MOV A,30H
MOVC A,@A+DPTR ;取码,关送显示
MOV P0,A
CLR P1.0
ACALL D1MS
SETB P1.0
MOV A,31H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.1
ACALL D1MS
SETB P1.1
MOV A,32H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.2
ACALL D1MS
SETB P1.2
MOV A,33H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.3
ACALL D1MS
SETB P1.3
MOV A,34H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.4
ACALL D1MS
SETB P1.4
MOV A,35H
MOVC A,@A+DPTR ;
MOV P0,A
CLR P1.5
ACALL D1MS
SETB P1.5
MOV A,36H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.6
ACALL D1MS
SETB P1.6
MOV A,37H
MOVC A,@A+DPTR
MOV P0,A
CLR P1.7
ACALL D1MS
SETB P1.7
RET
D10MS:
MOV R7,#10
ACALL D1MS
DJNZ R7,$-2
RET
D1MS:
MOV R5,#20
MOV R4,#25
DJNZ R4,$
DJNZ R5,$-4
RET
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H ;显示码表,共阴
END
|