51 單片機(jī)匯編編程:記錄按鍵,已仿真驗(yàn)證!
;有個(gè)題目,要求記錄按下的鍵的編號(hào)。
使用器件:
;51單片機(jī),8個(gè)編號(hào)為“1~8”的數(shù)字鍵,1個(gè)功能鍵,1個(gè)數(shù)碼管,其他晶振電阻電容。
;實(shí)現(xiàn)功能:
;按下功能鍵后,10s內(nèi),檢測(cè)被按下的數(shù)字鍵,
;10s后,結(jié)束檢測(cè),并用數(shù)碼管循環(huán)顯示被按下過(guò)的鍵編號(hào)。
;做而論道據(jù)此畫(huà)出的電路如下:
;電路中的數(shù)碼管,不僅用于顯示按下過(guò)的鍵編號(hào),還能顯示 9~0 的倒計(jì)時(shí)。
;在電路中,還安裝了一個(gè) LED,用來(lái)表示按鍵的狀態(tài)。
;當(dāng)有鍵按下,10ms 后仍然按下時(shí),LED 將發(fā)光,表示按鍵確實(shí)按下了。
;當(dāng)按鍵釋放后,再令 LED 熄滅。
;另外,在顯示按下的按鍵編號(hào)時(shí),也令 LED 持續(xù)發(fā)光。
;當(dāng)?LED 熄滅后,再次按下 FUNC 鍵,可以重新進(jìn)行下一輪的按鍵記錄。
;匯編語(yǔ)言編寫(xiě)的程序如下:
? ? 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)檢測(cè)按鍵
? ? JNB ? TR0, STOP ? ? ;到10s退出
? ? CALL ?KEY_N
? ? JZ ? ?WAIT_N
? ? MOV ? B, A
? ? CALL ?DELAY10MS ? ? ;延時(shí)
? ? 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)檢測(cè)按鍵
;----------------------------------
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: ? ? ? ? ? ? ? ? ;共陽(yáng)段碼
? ? 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 ? ? ? ? ? ? ? ;沒(méi)有按鍵,返回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)過(guò)仿真實(shí)驗(yàn)證明,本程序可以穩(wěn)定工作。