51單片機--LED類編程技巧
首先點陣:(以最簡單的8X8為例,16X16的以后再說)
8X8點陣
個人感覺點陣需要注意的地方有:
第一個就是驅(qū)動點陣的方式
我認為8X8點陣的驅(qū)動程序分為行掃描和列掃描兩種。
比如行掃描就是用一層for循環(huán):
先選中第一行,然后送入這一行的數(shù)據(jù),再選擇第二行,然后送入第二行數(shù)據(jù),如此循環(huán)下去,直至顯示完一個屏幕(即8行),同時記得要消隱和微延時(后面會說消隱和微延時),列掃描同理。如圖是代碼示例:
8X8點陣,無滾動效果
第二個就是滾動效果的實現(xiàn)。
思路是:
一:掃描函數(shù)不變,每掃描一個屏幕,所有數(shù)據(jù)移動一位;(代碼實現(xiàn)簡單)
二:數(shù)據(jù)不變,每次讀取數(shù)據(jù)的起始位置移動一位。(代碼實現(xiàn)有點難,反正我不會╮(╯▽╰)╭)
以第一種為例:
代碼實現(xiàn):實現(xiàn)滾動效果的基礎(chǔ)是一個掃描函數(shù)和一個數(shù)據(jù)處理函數(shù),掃描函數(shù)有兩層for循環(huán)組成:第一層for循環(huán)控制圖像每移動一次的時間間隔,然后第二層for循環(huán)顯示整個屏幕。
如圖掃描函數(shù):
掃描函數(shù)
滾動的重點是數(shù)據(jù)循環(huán)函數(shù)的寫法,我覺得數(shù)據(jù)處理分兩種:(僅個人愚見,新手)
第一種:
如果顯示的內(nèi)容整個點陣足以顯示(這樣的情況一般沒有),那么就不用另外寫數(shù)據(jù)處理函數(shù),直接用 intrins.h里面的 _cror_(*,*) 函數(shù)或者 _crol_(*,*)函數(shù)對數(shù)據(jù)進行循環(huán)處理就可以了.不用 <<和 >>是因為后面兩個的左右移無法循環(huán),會丟失數(shù)據(jù)。
第二種:
自然就是指顯示的數(shù)據(jù)在一張屏幕上顯示不了,從而導致需要滾動顯示。
此時就要另外寫一個數(shù)據(jù)處理函數(shù),原理很簡單,比如StreamData[80]這個數(shù)組里面存著數(shù)據(jù),那么只需將數(shù)據(jù)中的每一個數(shù)據(jù)往前(或者往后)移一位就可以了,最后將StreamData[0]移至StreamData[79]的位置就大功告成了。
注:以上兩種的掃描還是只掃描一個屏幕(當然最大就只能掃描一個屏幕嘛),每當掃描完一個屏幕,接著進行數(shù)據(jù)處理就行了。
如圖為第二種的數(shù)據(jù)處理函數(shù):
注:但是我這種方法比較麻煩,但是我也沒有想到其他比較好的方法,所以如果讀者有比較好的方法的話,希望可以分享一下。
(來一張萌圖:)
出自《刀劍神域》 亞絲娜,抱枕上的是Kirito
對于LED燈的顯示,點亮LED的原理我就不說了,大家都懂,我說幾個小細節(jié)吧:(補上上面挖的坑)
1、微延時。
當對動態(tài)數(shù)碼管進行操作時,每點亮一位數(shù)碼管,在點亮下一個數(shù)碼管之前要進行微延時,這樣可以提高亮度,延時太久的話整體效果會大打折扣(俗稱:晃眼),但是不延時的話,亮度會很低,所以到底延時多久就取決于處理速度啦,其實到頭來還是取決于你的眼睛啦。
(不晃眼的延時就是好延時!)
2、消隱。(就是消除隱約的光,也就是重影)
消隱就是說在所有的燈寫完一次數(shù)據(jù)進行下一次數(shù)據(jù)刷新的之前要先把所有的燈滅掉,不然的話就會出現(xiàn)重影。記得我剛學的時候就總是出現(xiàn)重影,然后就改延時時間(當時不會嘛,不知道消隱這回事),怎么改都不對,直到最后找回原來的視頻、例程又看了一遍才知道要消隱。
下面是我剛開始學單片機時自己做的:
我自己做的心形燈,當時更新手,更菜,大家不要笑哈
(做那個燈的時候剛剛開始學,電阻接小了,導致太亮,眼都快瞎了....)
16X16點陣一般會用74HC595驅(qū)動,所以要涉及到其他的知識,所以這里就先不說了,下次再說。拜拜~☂
編輯:admin 最后修改時間:2018-05-22