我第一次跑起跑馬燈程序的時候開心的像個兩百斤的孩子

2022-05-11     大方老師單片機

原標題:我第一次跑起跑馬燈程序的時候開心的像個兩百斤的孩子

第一次跑起跑馬燈程序的時候開心的像個兩百斤的孩子

///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比///

單片機底層思_硬體電路與寄存器編1

以控制燈跑馬燈為例,思考硬體電路與寄存器編程的關係

最一般的實現跑馬燈的電路如下

從任意單片機引出四個GPIO功能的引腳引出來GPIOGeneral Purpose Input Output是經典的實現設置輸出電平,檢測捕獲輸入電平的硬體電路。

GPIO口與電阻LED燈連接,共同連接在接地端。

如果想實12342134滅,類似這樣的跑馬燈功能,該如何實現呢?

如果是我來做這些事,首先我會把第一個電路接VCC上,然後其他電路都接在地上,這樣一路電路有了壓LED亮了,其他沒有,就滅了,然後我再把一路接地,二路VCC,就實現了一個跑馬燈的動畫效果。

好像下圖這樣

以此類推,只要我不停的換連導線,就可以完成這樣的動畫效果了。

但是這樣好麻煩,我不想一直不斷的機械做這些事,可以花更多的時間在散步讀書上才對。

所以我特別希望改進這個電路,仔細觀察,找到規律

如果1代表導線接VCC0代表接地,那麼順序應該是

1000 -> 0100 -> 0010 -> 0001 ->1000

能不能有什麼設備幫助我們換連導線呢?

這裡有兩個思路,第一個使用經典的數字電路,移位寄存器,用邏輯門啥的,在時鐘信號的驅動下幫我們切換導線連接方法。

那麼第二個思路就是用單片機啦!單片機那可比簡單的數字電路厲害多了。

單片機GPIO設備有好幾種工作方式,按照其工作的特點來看可以分/輸入兩種模式。

當我們需要單片機去感應外部電平的時候,我們會把它設置在輸入模式,當然現在在我們希望他能輸出特定的電壓,所以設置他為輸出模式。

單片機是一個大黑盒子,裡面的原理很深奧很複雜,但是幸運的是,設計單片機的人,給我們提出了寄存器的概念,這樣我們就不需要理解複雜的電路原理,就可以完成特定的功能操作了!

例如,選GPIO口為輸出還是輸入,其切換電路可以抽象成這樣

P0SEL寄存器BIT0的數值1的時候P0.0口硬體與一大片輸出相關電路相連,也就是說此P0.0口是處於輸出功能狀態下,反BIT0為數0則與一大片輸入相關電路相連。其底層的原理大概是利用三極體開關特性完成的吧!無論如何我們配置寄存器,就完成了開關的操作,選擇了怎樣的電路與我P0.0口連接!

值得高興的是GPIO一系列的寄存器里,我找到了切換輸出電平的寄存 P0OUT寄存器,我抽象的思考這樣寄存器應該是這樣的。

當我P0OUT的最低位寫1的時P0.0VCC連接,寫0的時P0.0GND連接。大底是這樣思考的。

於是我驚喜的發現,單片機可以幫助我實現切換導線連接這樣的事情。

於是我用MSP430單片機,P0.0 P0.1 P0.2 P0.3接在了上述的電路上。

寫下了這樣C代碼

int main(void){

unsigned char led_flash_pos=0x01;

Basic_init(); //基礎配置

P0SEL = 0x0f;//P0SEL寄存器低四位1,使得硬體電路與輸出相關電路相連

Loop:

if(led_flash_pos == 0x10)

led_flash_pos = 0x01; //限制左移範圍

P0OUT = led_flash_pos;

DELAY_S(1); //1S讓眼睛看到現象

led_flash_pos </計算機算法,左移操作

goto Loop;//循環

}

可以有非常花哨的寫法,但是最底層的操作就是配P0OUT這個寄存器,單片機編程所有對硬體的操作都是對寄存器的操作,我們無需對底層硬體有太多深奧的理解,就可以完成操作!

作者思考:

分工的時代,如果認真深入的去了解學習單片機最底層的硬體原理的話,那會消耗大量的時間和精力,成為一名優秀的軟體開發工程師的話,對底層硬體有一定的理解就好,更多精力花費在對代碼數據結構,算法的優化,例如P0OUT這個寄存器,何時寫他,怎麼寫他,寫多少比較合適,這都是需要考慮的事情,還有就是延時的時間是否過長,用定時器延時比較好,還是用阻塞延時比較好?另外,怎樣的跑馬燈動畫更好看?很多可以編程的花樣!

記得筆者第一次跑起跑馬燈程序,興奮的寫了好多衍生代碼,例如隔著一個燈閃爍,快速閃爍,等等,好像往你手上塞了好多好多樂高積木(寄存器),你可以任意的搭接

文章來源: https://twgreatdaily.com/zh-cn/485fe6b8a5335fd33b437745bab2f488.html