感謝百度網友“做而論道”的幫助!
要求:51單片機,8個按鍵、8個發光二極管。
;一個鍵按下則對應燈亮,3秒后滅,每個鍵控制一個燈。
;題目要求的電路,非常簡單,用 P1 連接按鍵、P2 連接 LED 即可。
;用定時器,定時 7.5 ms,中斷 400 遍,即為 3 秒鐘。
;針對每個燈,都要有一個計時單元,用來控制亮燈 3 秒鐘的時間。
;用匯編語言編寫程序如下:
KEY EQU 30H
K_L EQU 31H
K_T EQU 32H
ORG 0000H
AJMP START
ORG 000BH ;T0中斷入口地址
JMP T0_INT
START:
MOV TH0, #40 ;定時7.5ms@11.0592MHz
SETB TR0
SETB ET0
SETB EA
SJMP $ ;主程序結束
;--------------------------------
T0_INT:
MOV TH0, #40 ;定時7.5ms@11.0592MHz
MOV A, P1
CPL A ;有按鍵,為1
MOV KEY, A
XRL A, K_L
MOV K_T, A
MOV K_L, KEY
MOV A, KEY
CPL A ;沒按則為1
ANL A, K_T ;釋放則為1
;-----------------------------------
MOV R0, #40H
MOV R2, #127
T0_L1:
JNB ACC.7, $ + 9
MOV @R0, #200
XCH A, R2
ANL P2, A ;打開LED
XCH A, R2
RL A
XCH A, R2
RR A ;右移R2
XCH A, R2
INC R0
CJNE R0, #48H, T0_L1
;-----------------------------------
CPL F0
JNB F0, T0_END
MOV R0, #40H
MOV R2, #128
MOV A, R2
T0_L2:
DEC @R0
CJNE @R0, #255, $ + 6
INC @R0
ORL P2, A ;關閉LED
RR A ;右移R2
MOV R2, A
INC R0
CJNE R0, #48H, T0_L2
T0_END:
RETI
;-----------------------------------
END
;-----------------------------------
本程序,使用了定時中斷方式,對按鍵進行檢測;并含有延時消抖、等待釋放的環節。
在按鍵按下、再釋放后,即刻,就能使 LED 發光,經過 3 秒鐘之后,自動熄滅。
各個按鍵的動作互不影響,各個 LED 的亮滅,互不干擾,都是獨立的進行控制。