DATA1 EQU 30H ;
DATA2 EQU 31H ;
DATA3 EQU 32H ;
DATA4 EQU 33H ;
KEYBUF EQU 34H ;
;-------------------------------------------
ORG 0000H ;
LJMP START ;轉入主程序
ORG 0030H ;
START:
MOV SP,#60H ;初始化堆棧指針
MOV P0,#0FFH ;初始化I/O口
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV A,#00H ;
MOV DATA1,A ;設定顯示初值
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
;*******************************************
MAIN:
CALL DISP ;調顯示子程序
CALL KEYWORK ;
AJMP MAIN ;
;*******************************************
;顯示子程序
;******************************************
DISP:
MOVA,DATA1 ;
MOV DPTR,#TABLE ;
MOVCA,@A+DPTR ;取數據表數據
MOVP0,A ;DATA1 顯示代碼傳送到P0口
CLRP1.0 ;
LCALLDELAY1MS ;
SETBP1.0 ;
MOVA,DATA2 ;
MOVCA,@A+DPTR ;取數據表數據
MOVP0,A ;DATA2 顯示代碼傳送到P0口
CLRP1.1 ;
LCALLDELAY1MS ;
SETBP1.1 ;
MOVA,DATA3 ;
MOVCA,@A+DPTR ;取數據表數據
MOVP0,A ;DATA3 顯示代碼傳送到P0口
CLRP1.2 ;
LCALLDELAY1MS ;
SETBP1.2 ;
MOVA,DATA4 ;
MOVCA,@A+DPTR ;取數據表數據
MOVP0,A ;DATA4 顯示代碼傳送到P0口
CLRP1.3 ;
LCALLDELAY1MS ;
SETBP1.3 ;
RET ;
;*******************************************
;*******************************************
;4*4行列掃描查鍵子程序
;*******************************************
KEYWORK: MOV P2,#0FFH ;置P2口為輸入狀態
CLR P2.0 ;掃描第1行(第1行為0)
MOV A,P2 ;讀入P2口值
ANL A,#0F0H ;低4位為0
CJNE A,#0F0H,KEYROW ;高4位不為全1(有鍵按下)轉KEYROW
SETB P2.0 ;
CLR P2.1 ;掃描第2行(第2行為0)
MOV A,P2 ;讀入P2口值
ANL A,#0F0H ;低4位為0
CJNE A,#0F0H,KEYROW ;高4位不為全1(有鍵按下)轉KEYROW
SETB P2.1 ;
CLR P2.2 ;掃描第3行(第3行為0)
MOV A,P2 ;讀入P2口值
ANL A,#0F0H ;低4位為0
CJNE A,#0F0H,KEYROW ;高4位不為全1(有鍵按下)轉KEYROW
SETB P2.2 ;
CLR P2.3 ;掃描第3行(第3行為0)
MOV A,P2 ;讀入P2口值
ANL A,#0F0H ;低4位為0
CJNE A,#0F0H,KEYROW ;高4位不為全1(有鍵按下)轉KEYROW
SETB P2.3 ;
RET ;子程序返回
;***********************************************************************
KEYROW: ACALL DISP ;消抖處理
MOV A,P2 ;再讀入P2口值
ANL A,#0F0H ;低4位為0
CJNE A,#0F0H,KEYCHE ;高4位不為全1確有鍵按下轉KEYCHE
KEYOUT: RET ;幹擾子程序返回
;------------------------------------------------------
KEYCHE: MOV A,P2 ;讀入P2口值
MOV KEYBUF,A ;放入KEYBUF暫存
CJLOOP: ACALL DISP ;調顯示子程序
MOV A,P2 ;讀入P2口值
ANL A,#0F0H ;低4位為0
CJNE A,#0F0H,CJLOOP ;高4位為全1(鍵還按住),轉CJLOOP等待釋放
MOV R7,#00H ;鍵釋放,置R7初值為#00H(查表次數)
MOV DPTR,#KEYTAB ;取鍵值表首址
CHEKEYLOOP: MOV A,R7 ;查表次數入A
MOVC A,@A+DPTR ;查表
XRL A,KEYBUF ;查表值與P2口讀入值比較
JZ K1 ;為0(相等)轉KEYOK
INC R7 ;不等,查表次數加1
CJNE R7,#10H,CHEKEYLOOP;查表次數不超過12次轉LHEKEYLOOP再查
AJMP KEYOUT ;12次到,退出
;***********************************************************************
K1:
MOV A,R7 ;查表次數入 A(即鍵號值)
CJNE A,#00H,K2 ;
MOV A,#01H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K2:
MOV A,R7 ;
CJNE A,#01H,K3 ;
MOV A,#02H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K3:
MOV A,R7 ;
CJNE A,#02H,K4 ;
MOV A,#03H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K4:
MOV A,R7 ;
CJNE A,#03H,K5 ;
MOV A,#04H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
;-------------------------------------------
K5:
MOV A,R7 ;
CJNE A,#04H,K6 ;
MOV A,#05H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K6:
MOV A,R7 ;
CJNE A,#05H,K7 ;
MOV A,#06H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K7:
MOV A,R7 ;
CJNE A,#06H,K8 ;
MOV A,#07H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K8:
MOV A,R7 ;
CJNE A,#07H,K9 ;
MOV A,#08H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K9:
MOV A,R7 ;
CJNE A,#08H,K10 ;
MOV A,#09H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K10:
MOV A,R7 ;
CJNE A,#09H,K11 ;
MOV A,#0AH ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K11:
MOV A,R7 ;
CJNE A,#0AH,K12 ;
MOV A,#0BH ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K12:
MOV A,R7 ;
CJNE A,#0BH,K13 ;
MOV A,#0CH ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
;-------------------------------------------
K13:
MOV A,R7 ;
CJNE A,#0CH,K14 ;
MOV A,#01H ;
MOV DATA1,A ;
MOV A,#02H ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K14:
MOV A,R7 ;
CJNE A,#0DH,K15 ;
MOV A,#01H ;
MOV DATA1,A ;
MOV A,#03H ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K15:
MOV A,R7 ;
CJNE A,#0EH,K16 ;
MOV A,#01H ;
MOV DATA1,A ;
MOV A,#04H ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K16:
MOV A,R7 ;
CJNE A,#0FH,K17 ;
MOV A,#00H ;
MOV DATA1,A ;
MOV DATA2,A ;
MOV DATA3,A ;
MOV DATA4,A ;
AJMP KEYOUT ;
K17:
AJMP KEYOUT ;
;*******************************************
DELAY1MS:
MOV R4,#2 ;延時子程序
DEL1:
MOV R5,#250 ;
DJNZR5,$ ;
DJNZR4,DEL1 ;
RET ;
;-------------------------------------------
DELAY10MS:
MOV R4,#20 ;
DEL2:
MOV R5,#250 ;
DJNZ R5,$ ;
DJNZ R4,DEL2 ;
RET ;
;*******************************************
TABLE:
DB0C0H ;0 11000000B
DB0F9H ;1 11111001B
DB0A4H ;2 10100100B
DB0B0H ;3 10110000B
DB99H ;4 10011001B
DB92H ;5 10010010B
DB82H ;6 10000010B
DB0F8H ;7 11111000B
DB80H ;8 10000000B
DB90H ;9 10010000B
DB 88H ;A 10001000B
DB 83H ;b 10000011B
DB 0C6H ;C 11000110B
;********************************************
;鍵號對應P2口數值表(同時按下兩鍵為無效操作)
KEYTAB: DB 0EEH,0DEH,0BEH,7EH ;
DB 0EDH,0DDH,0BDH,7DH ;
DB 0EBH,0DBH,0BBH,7BH ;
DB 0E7H,0D7H,0B7H,77H ;
DB 0FFH,0FFH ;
END ;
;*****************************************************