close

不只是開關而已

初學者可能以為,只要不停的開和關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開始閃動起來,好像單晶片的心臟開始開始跳動起來。

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 單晶片玩人 的頭像
    單晶片玩人

    單晶片玩人(uPplayer)的部落格

    單晶片玩人 發表在 痞客邦 留言(0) 人氣()