51單片機4x4按鍵彙編程序?

Tags: 單片機, 按鍵,

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 ;

;*****************************************************

相關問題答案