MAIN: CLR P1.4
MOV R4,#00H;初始化按鍵值
LOOP: MOV R0,#00H;掃描計(jì)數(shù)器
NEXT: SETB P1.5
CLR P1.6;初始化HC138輸入信號(hào),選中U4
MOV P2,#0FFH;關(guān)顯示
MOV A,R4
MOV DPTR,#DISPCODE
MOVC A,@A+DPTR;查找顯示內(nèi)容
MOV P0,A;將查到的顯示內(nèi)容送P0口
SETB P1.7
CLR P1.7;將P0口數(shù)據(jù)鎖存到U4
MOV A,R0
MOV DPTR,#SCAN
MOVC A,@A+DPTR;查找位掃描數(shù)據(jù)
MOV P2,A;位掃描數(shù)據(jù)送P2口
ACALL DELAY
CLR P1.5
SETB P1.6
SETB P1.7;選通HC244(U6)
MOV A,P0;讀取按鍵狀態(tài)
CPL A
CLR P1.7;
CJNE A,#00H,KEY;判斷是否有鍵按下
AJMP NOKEY;無(wú)鍵按下則不處理鍵值
KEY: MOV R2,#00H;按鍵所在的列號(hào)清零
CLR C;清除CY
MVBIT:RRC A
INC R2
JNC MVBIT;循環(huán)移位,以獲取按鍵所在的列號(hào)
MOV A,R0;當(dāng)前掃描的行號(hào)
MOV B,#08H
MUL AB;行號(hào)乘
ADD A,R2;行列組合,得到按鍵值
MOV R4,A;保存按鍵值
NOKEY:INC R0
CJNE R0,#06H,NEXT;判斷位數(shù)碼管是否掃描完一次,沒(méi)掃描完則繼續(xù)
AJMP LOOP;掃描完一次盡行下一次掃描
SCAN: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH;位掃描數(shù)據(jù)
DISPCODE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H;1,2,3,4,5,6,的顯示碼
DB 0F8H,80H,90H,88H,83H,0C6H;7,8,9,A,B,C
DB 0A1H,86H,8EH,0BFH;D,E,F,-
DELAY: MOV R3,#01H;延時(shí)
LOOP2: MOV R1,#0FFH
LOOP1: DJNZ R1,LOOP1
DJNZ R3,LOOP2
RET
END
3、將程序修改為按鍵時(shí)在LED上循環(huán)顯示所按鍵值(按第一個(gè)鍵時(shí),第一個(gè)LED顯示對(duì)應(yīng)鍵值,按第二個(gè)鍵時(shí),第二個(gè)LED顯示對(duì)應(yīng)鍵值,。。。,按第七個(gè)鍵時(shí),第一個(gè)LED顯示對(duì)應(yīng)鍵值,按第八個(gè)鍵時(shí),第二個(gè)LED顯示對(duì)應(yīng)鍵值。。。)
用了74HC13,,74HC574,8*2鍵盤(pán)接有緩沖器