不只是開關而已
初學者可能以為,只要不停的開和關LED,眼睛看到的自然是閃動的效果,所以只要寫成如上的程式即可。
_ledon:
SETB LED
CLR LED
LJMP _ledon
將原本的專案修改成如上的方式,然後編譯和下載執行,當會發現事情未如所願,LED變成是恆亮。為什麼會如此?
原來人類的眼睛有視覺暫停的效果,畫面閃動只要一秒超過60次,觀看者會誤以為畫面沒有閃動(電影的原理),現在LED閃動的次數一秒遠超過60次,看起來的效果自然是恆亮。
閃動的LED程式
以下是最簡單的LED閃動程式,程式在開和關之間,提供了一個延時的函式,單片機在延時函式中,不作任何事情,只是將時間拖過去。
P1M0 = 0x92
P1M1 = 0x91
LED = P1.0
.AREA SYS (ABS,OVR)
.ORG 0x0
LJMP _RESET
Delay_Sub:
MOV R0,#10
_delay2:
MOV A,#0xF0
_delay1:
PUSH ACC
MOV A,#0
_delay0:
DJNZ ACC,_delay0
POP ACC
DJNZ ACC,_delay1
DJNZ R0,_delay2
RET
_RESET:
MOV SP,#0xE0
MOV P1M1,#0x0
MOV P1M0,#0xFF
_ledon:
SETB LED
LCALL Delay_Sub
CLR LED
LCALL Delay_Sub
LJMP _ledon
這裡首次使用副程式(在C語言稱為函式),副程式可以重覆使用讓程式寫得更精簡更有效率,是程式中很重要的觀念。
在使用副程式之前,必須先設好特殊暫存器SP(堆壘),否則程式的執行可能會出現不可預期的結果。
這個程式下載執行後,LED開始閃動起來,好像單晶片的心臟開始開始跳動起來。