;有個題目,要求記錄按下的鍵的編號。
;使用器件:
;51單片機,8個編號為“1~8”的數(shù)字鍵,1個功能鍵,1個數(shù)碼管,其他晶振電阻電容。
;實現(xiàn)功能:
;按下功能鍵后,10s內(nèi),檢測被按下的數(shù)字鍵,
;10s后,結(jié)束檢測,并用數(shù)碼管循環(huán)顯示被按下過的鍵編號。
;做而論道據(jù)此畫出的電路如下:
;電路中的數(shù)碼管,不僅用于顯示按下過的鍵編號,還能顯示 9~0 的倒計時。
;在電路中,還安裝了一個 LED,用來表示按鍵的狀態(tài)。
;當有鍵按下,10ms 后仍然按下時,LED 將發(fā)光,表示按鍵確實按下了。
;當按鍵釋放后,再令 LED 熄滅。
;另外,在顯示按下的按鍵編號時,也令 LED 持續(xù)發(fā)光。
;當LED 熄滅后,再次按下 FUNC 鍵,可以重新進行下一輪的按鍵記錄。
;匯編語言編寫的程序如下:
ORG 0000H
SJMP START
ORG 000BH
SJMP T0_INT
;---------------------------------------
START:
MOV TMOD, #01H
MOV IE, #82H
MOV DPTR, #D_TAB
WAIT_F:
JB P3.6, $ ;等待按下功能鍵
CALL DELAY10MS
JB P3.6, WAIT_F
CLR P3.2 ;LED發(fā)光
JNB P3.6, $ ;等待釋放
SETB P3.2
;----------------------------------
MOV R0, #30H
MOV TH0, #(65536 - 62500) / 256
MOV TL0, #(65536 - 62500) MOD 256
MOV R7, #16
MOV R6, #9
CALL DISPLAY
SETB TR0
;----------------------------------
WAIT_N: ;循環(huán)檢測按鍵
JNB TR0, STOP ;到10s退出
CALL KEY_N
JZ WAIT_N
MOV B, A
CALL DELAY10MS ;延時
CALL KEY_N
CJNE A, B, WAIT_N ;消抖
MOV @R0, A ;保存按鍵數(shù)值
INC R0
CLR P3.2 ;LED發(fā)光
WAIT_S:
CALL KEY_N
JNZ WAIT_S ;等待釋放
SETB P3.2
SJMP WAIT_N ;循環(huán)檢測按鍵
;----------------------------------
STOP:
MOV A, R0
CLR C
SUBB A, #30H
MOV R2, A
CLR P3.2 ;LED發(fā)光
MOV R0, #30H
ECHO:
MOV A, @R0
INC R0
MOV R6, A
CALL DISPLAY ;回放
MOV R3, #100
CALL DELAY10MS
DJNZ R3, $ - 2
DJNZ R2, ECHO ;循環(huán)
SETB P3.2
MOV R6, #0
CALL DISPLAY
SJMP WAIT_F
;---------------------------------------
T0_INT:
MOV TH0, #(65536 - 62500) / 256
MOV TL0, #(65536 - 62500) MOD 256
DJNZ R7, T0_END
MOV R7, #16
DEC R6
CJNE R6, #255, DISP
CLR TR0
RETI
DISP:
CALL DISPLAY
T0_END:
RETI
;---------------------------------------
DISPLAY:
MOV A, R6
MOVC A, @A + DPTR
MOV P2, A
RET
D_TAB: ;共陽段碼
DB 0C0H, 0F9H, 0A4H, 0B0H, 099H
DB 092H, 082H, 0F8H, 080H, 090H
;---------------------------------------
KEY_N:
CLR A
JNB P1.0, K1
JNB P1.1, K2
JNB P1.2, K3
JNB P1.3, K4
JNB P1.4, K5
JNB P1.5, K6
JNB P1.6, K7
JNB P1.7, K8
RET ;沒有按鍵,返回0
K8: INC A
K7: INC A
K6: INC A
K5: INC A
K4: INC A
K3: INC A
K2: INC A
K1: INC A
RET
;---------------------------------------
DELAY10MS:
MOV R4, #20
DJNZ R5, $
DJNZ R4, $ - 2
RET
;---------------------------------------
END
;經(jīng)過仿真實驗證明,本程序可以穩(wěn)定工作。