51單片機(jī)的4×4鍵盤(pán)識(shí)別與74LS164驅(qū)動(dòng)數(shù)碼顯示
;P1口外接4×4鍵盤(pán),輸出使用74LS164驅(qū)動(dòng)一位數(shù)碼顯示器。
;當(dāng)按下任一鍵時(shí),在數(shù)碼顯示器上顯示鍵值。
;程序用匯編語(yǔ)言編寫(xiě),用PROTEUS仿真調(diào)試的畫(huà)面如下:
;程序如下:
ORG 0000H
LJMP START
ORG 0030H
START:
MOV P1, #255
MOV 60H, #16
MAIN:
CALL DISPLAY
;SJMP $
M_LOOP:
CALL K_SCAN ;掃描程序
JB ACC.4, M_LOOP
LJMP MAIN
;---------------------------------------
DISPLAY:
MOV A, 60H
MOV DPTR, #D_TAB ;碼表首地址
MOVC A, @A + DPTR
CPL A
MOV R2, #8
INI1:
RRC A
MOV P3.0, C ;A中低位輸出至P3.0
CLR P3.1 ;移位脈沖
SETB P3.1
DJNZ R2, INI1 ;移位8次
RET
;-------------------------
D_TAB: ;段碼表
DB 03FH, 006H, 05BH, 04FH
DB 066H, 06DH, 07DH, 007H
DB 07FH, 06FH, 077H, 07CH
DB 039H, 05EH, 079H, 071H, 000H
;---------------------------------------
K_SCAN:
MOV P1, #240 ;各行皆為0
MOV A, P1 ;讀出列
CJNE A, #240, COW ;有鍵按下轉(zhuǎn)移
SETB ACC.4 ;沒(méi)有按鍵的標(biāo)記
RET
;-------------------------
COW:
MOV P1, #15 ;各列皆為0
ADD A, P1
MOV 60H, A ;保存鍵碼
;-------------------------
MOV DPTR, #KEY_TAB ;鍵碼表首地址
MOV R2, #0 ;從第0個(gè)開(kāi)始查
K_S1:
MOV A, R2
INC R2
MOVC A, @A + DPTR
CJNE A, 60H, K_S1 ;與60H內(nèi)容比較,不等則繼續(xù)查
DEC R2
CJNE R2, #16, K_ED
SETB ACC.4 ;沒(méi)有按鍵的標(biāo)記
RET
;-------------------------
K_ED: ;有鍵按下
MOV 60H, R2 ;保存按鍵號(hào)碼
CALL DELAY ;消除抖動(dòng)
WAIT:
MOV P1, #0F0H
MOV A, P1
CJNE A, #0F0H, WAIT ;等待釋放
CLR A
RET
;-------------------------
KEY_TAB: ;鍵碼表
DB 07EH, 0BEH, 0DEH, 0EEH
DB 07DH, 0BDH, 0DDH, 0EDH
DB 07BH, 0BBH, 0DBH, 0EBH
DB 077H, 0B7H, 0D7H, 0E7H
;---------------------------------------
DELAY: ;延時(shí)
MOV R5, #10
D2: MOV R6, #2
D1: MOV R7, #248
DJNZ R7, $
DJNZ R6, D1
DJNZ R5, D2
RET
;---------------------------------------
END