MAIN: CLR P1.4 MOV R4,#00H;初始化按鍵值 LOOP: MOV R0,#00H;掃描計數器 NEXT: SETB P1.5 CLR P1.6;初始化HC138輸入信號,選中U4 MOV P2,#0FFH;關顯示 MOV A,R4 MOV DPTR,#DISPCODE MOVC A,@A+DPTR;查找顯示內容 MOV P0,A;將查到的顯示內容送P0口 SETB P1.7 CLR P1.7;將P0口數據鎖存到U4 MOV A,R0 MOV DPTR,#SCAN MOVC A,@A+DPTR;查找位掃描數據 MOV P2,A;位掃描數據送P2口 ACALL DELAY CLR P1.5 SETB P1.6 SETB P1.7;選通HC244(U6) MOV A,P0;讀取按鍵狀態 CPL A CLR P1.7; CJNE A,#00H,KEY;判斷是否有鍵按下 AJMP NOKEY;無鍵按下則不處理鍵值 KEY: MOV R2,#00H;按鍵所在的列號清零 CLR C;清除CY MVBIT:RRC A INC R2 JNC MVBIT;循環移位,以獲取按鍵所在的列號 MOV A,R0;當前掃描的行號 MOV B,#08H MUL AB;行號乘 ADD A,R2;行列組合,得到按鍵值 MOV R4,A;保存按鍵值 NOKEY:INC R0 CJNE R0,#06H,NEXT;判斷位數碼管是否掃描完一次,沒掃描完則繼續 AJMP LOOP;掃描完一次盡行下一次掃描
SCAN: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH;位掃描數據
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;延時 LOOP2: MOV R1,#0FFH LOOP1: DJNZ R1,LOOP1 DJNZ R3,LOOP2 RET END 3、將程序修改為按鍵時在LED上循環顯示所按鍵值(按第一個鍵時,第一個LED顯示對應鍵值,按第二個鍵時,第二個LED顯示對應鍵值,。。。,按第七個鍵時,第一個LED顯示對應鍵值,按第八個鍵時,第二個LED顯示對應鍵值。。。) 用了74HC13,,74HC574,8*2鍵盤接有緩沖器 |