|
4D顯示的程序,只有一位顯示。一直想寫個(gè)多位顯示的,沒成功,知道問題在于防抖處理,可是無法下手,最后放棄。今天再試,成功了。

;按下4X4矩陣鍵盤之0~9,依次在8 位數(shù)碼管上從最低位往高位顯示按鍵的鍵名。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 ;調(diào)用KEYSCAN,判斷是否有鍵按下
JB F0,$-2 ;無鍵按下,轉(zhuǎn)ACALL KEYSCAN,繼續(xù)掃描
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 ;設(shè)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 ;這里調(diào)用一次顯示子程序,按下按鍵,顯示保持連續(xù) 。
MOV A,P2
ANL A,#0F0H
ORL A,#0FH
CJNE A,#0FFH,KEY10 ;釋放
CLR F0 ;F0清0 ,表示按鍵按下過
INC R0 ;按鍵按下次數(shù),以確定顯示的位數(shù)
RET
DISP:
MOV A,30H
MOVC A,@A+DPTR ;取碼,關(guān)送顯示
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
|
|