天天看點

一個經典的控制Led的單片機程式

這本來是我在大三時期做的一個題目,屬于課外習題。題目是這樣的,在單片機課程中,有一個實驗是控制數位管顯示一個時鐘。程式邏輯非常簡單,可以用如下的僞碼表示。

while(true)

{

    累加ms時間并進位;

    if(ScanKeys(&code))

        ProcessKey(code);         //處理按鍵

     Display() ;                            //重新整理數位管顯示

}

上面的邏輯是憑借記憶,并且實際上是使用8051彙編語言編寫,控制6個Led7段式數位管。把顯示碼輸出到某個port或者某個外設去控制數位管顯示。其中時分秒存儲在存儲單元。按特定鍵可以調節時鐘的時分秒的數值。

這部分的代碼在書上已經有了。老師的課外題目是這樣的,他說可以嘗試去做調節時間時,相應資料位閃爍。以及屏保能功能。最終我是我們專業唯一做出這個程式的(當然也是因為很少有人嘗試去做該題),我做的動态屏保效果(靈感來自霓虹燈的閃爍)還出乎了老師的預料。記得當時我很快就畫出了詳細流程圖,在此基礎上很快寫出了主要函數代碼。然後由于兩周才能有上機機會,經過漫長焦急而激動的等待。直到我在電腦上輸入完所有寫好的代碼,簡單調試後成功運作并看到預期的最終效果。

我在草稿紙上繪制了整潔清晰的流程圖,并引入了一個狀态變量放在内部寄存器,通過這個變量,我記錄目前程式所處的狀态,是閃爍,屏保,還是正常顯示。然後根據相應狀态以及特定的時間,在Display函數中輸出不同的顯示控制碼。

多年以後,我檢視自己做過的Led控件,忽然萌生把那個單片機程式重新實作在winform的想法,以為難度不大,但是由于狀态較煩瑣,還是花了一點時間去調試。

效果截圖:

一個經典的控制Led的單片機程式

源碼下載下傳位址:(vs2005)

<a href="http://files.cnblogs.com/hoodlum1980/LedTest_02(vs8).rar">http://files.cnblogs.com/hoodlum1980/LedTest_02(vs8).rar</a>