;有個題目,要求記錄按下的鍵的編號。
;使用器件:
;51單片機,8個編號為“1~8”的數(shù)字鍵,1個功能鍵,1個數(shù)碼管,其他晶振電阻電容。
;實現(xiàn)功能:
;按下功能鍵后,10s內(nèi),檢測被按下的數(shù)字鍵,
;10s后,結束檢測,并用數(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)定工作。