高 娟 張衛(wèi)清 崔艷萍
(陸軍工程大學軍械士官學校 湖北·武漢 430075)
生活中隨處可見LED點陣的身影,比如在學校,在公交車上,在十字路口,在地鐵站等,LED點陣大屏幕不僅能顯示文字,還可以顯示圖形、圖像,并且能產生各種動畫效果,是廣告宣傳、新聞傳播的有力工具。如果我們走近LED點陣大屏幕仔細觀察,會發(fā)現它們是由一個個小的LED點陣模塊組成的,而LED點陣模塊是由一個個的LED發(fā)光二極管組成。最常見的 LED 點陣顯示模塊有 5×7、7×9、8×8 結構。
LED點陣可以作為單片機應用系統(tǒng)的顯示器件,用單片機控制它顯示文字或圖形。在《單片機應用技術》課程教學中,LED點陣顯示控制是一個重要的教學內容。下面結合筆者實際教學的過程及任務介紹課堂設計。
首先播放一段LED點陣在生活中應用的小視頻,引起學員對LED點陣的學習興趣,從而引出課堂任務——用單片機控制8×8LED顯示屏顯示一個像交通燈一樣的指示箭頭,如圖1所示。

圖1:8×8點陣顯示的指示箭頭
本人所在院校為高職院校,所教授的對象為職業(yè)技術教育學員,像《單片機應用技術》這種實踐性較強的課程,采用的都是任務驅動、理實一體的教學模式,以任務為載體,將知識與技能的培養(yǎng)放在具體的任務實施中。
為了完成這個任務,需要先介紹LED點陣的基礎知識,讓學員了解LED點陣的內部結構及顯示原理。
什么是LED點陣顯示器呢?LED是發(fā)光二極管,把許多LED發(fā)光二極管按矩陣方式排列在一起,通過對每個LED進行發(fā)光控制,來完成各種字符或圖形的顯示,就是LED點陣顯示器。
以最常見的8行8列的點陣為例,它的等效電路就是每一個LED連接在行線和列線的交叉處,LED的正極連接在行線上,負極連接在列線上,8行8列共64個LED。
LED點亮的條件是正向導通,所以LED點陣顯示的原理就是要點亮的像素點所在的行輸出高電平,所在的列輸出低電平。比如:讓第四行輸出高電平,第四列輸出低電平,則位于第四行第四列處的像素點就點亮了。
認識了8×8LED點陣后,接下來問題是它怎么和單片機連接才能顯示圖形呢?所以第二部分就是介紹8×8LED點陣的控制電路。
8根行線,8根列線一共有16個引腳,所以需要連接單片機的兩個并行口I/O端口,比如用P1口控制行,P0口控制列,通常P1.0連接第一行R1,P0.0連接第一列C1,其它的以此類推。
設置問題,讓學員思考能否直接把P1口連接到行線,輸出高電平,驅動LED點陣發(fā)光。聯(lián)系前面知識“單片機的并行口引腳能夠直接輸出的電流非常小,還不到1mA,不足以驅動LED點陣發(fā)光”解決問題,所以需要增加一個驅動芯片以增大電流,這個驅動芯片增加到行或列都可以,這里選擇在P1口和行線之間增加一個74LS245,它是一個8同相三態(tài)緩沖驅動器,不改變電平方向,但可以增大電流,這是行線的連接。
接下來再介紹列線的連接,如果直接把P0口和列線連接,而此時某一行只有一個LED點亮,可能會因電流過大而燒壞LED,所以需要在P0口和列線之間串聯(lián)一組限流電阻,這里串聯(lián)的是一組300歐的限流電阻。
把單片機和點陣連接起來之后,接下來的問題就是怎樣讓點陣顯示需要的圖形了,所以第三個內容就是介紹點陣顯示。
首先以第一行為例介紹怎樣顯示一行。根據前面介紹的顯示原理,要顯示的像素點所在的行應該輸出高電平,列應該輸出低電平。第一行有兩個像素點同時點亮,所以第一行的行線應該輸出1,第4,5列的列線應該同時輸出0,這是顯示第一行的條件。
然后介紹怎樣同時顯示兩行。第二行有4個像素點亮,所以第二行的行線應該輸出1,第3,4,5,6列的列線應該同時輸出0,這是顯示第二行的條件。當看到一個完整的箭頭圖形時,大家看到的是這兩行同時顯示,所以應該需要這兩個條件同時滿足,而如果這兩個條件同時滿足,又會導致第1行和第2行的3,4,5,6列的led同時點亮,顯示這不是我們想要的結果。所以,可以反推出來兩行同時顯示這個條件不成立,也就是兩行不能同時顯示。可是當大家看到一個完整圖形的時候,明明看到的就是所有的行同時顯示呀,難道是我們的眼睛欺騙了我們嗎?其實不是我們的眼睛欺騙了我們,而是點陣欺騙了我們的眼睛。為什么呢?
其實點陣顯示采用的是動態(tài)掃描顯示的方法,什么叫動態(tài)掃描顯示呢?動態(tài)掃描顯示有兩種,逐行掃描法和逐列掃描法,兩種方法顯示原理是相同的,下面以逐行掃描法為例來介紹。
逐行掃描法簡單的說就是一行一行的來顯示。首先顯示第1行,其他7行熄滅,延時一段時間,然后顯示第2行,其他7行熄滅,再延時一段時間,以此類推,逐行顯示,直到第8行顯示完畢,再從第一行開始掃描,不斷循環(huán)這個過程,這就是逐行掃描法。
每一行顯示時間取約1ms,一個循環(huán)周期約為8ms,1s大約可以掃描125次,由于人眼具有視覺駐留效應,每秒顯示超過30幀人眼就無法分辨了,顯然這里掃描的足夠快,所以大家看到的是一個穩(wěn)定的圖形,而不是逐行顯示,這就是逐行掃描法的工作原理。反過來,如果掃描的比較慢,也就是每行顯示的時間長一些,大家看到應該就是逐行顯示了。為了驗證這個結論,設計了一個實驗。
按照由慢到快的方式編程實現逐行掃描。首先讓每行顯示1s,然后每行顯示0.5s,接下來每行顯示0.1s,實驗現象就是掃描的速度越來越快,但還是逐行顯示。接下來讓每行顯示10ms,重復若干次,此時已經能看到一個圖形了,但是還有些閃爍,最后讓每行顯示1ms,這樣就可以看到一個穩(wěn)定的圖形了。這個實驗很好的展示了逐行掃描法的工作原理,通過它學員應該能理解逐行掃描法的工作原理了。接下來就可以根據這個原理來編寫程序一行一行的顯示了,所以第四個內容就是介紹控制程序的編寫。
一行一行的顯示,先要找出顯示每一行對應的行數據和列數據,所以,先來介紹行數據和列數據計算。
行數據和列數據與硬件電路密切相關,因為硬件決定軟件。根據前面的硬件電路連接關系,第一行連接的是P1.0,是數據低位,第八行連接的是P1.7,是數據高位,第一列連接的是P0.0,是數據低位,第八列連接的是P0.7,是數據高位。
以第一行為例來計算顯示第一行對應的行數據和列數據,因為行線是1有效,列線是0有效。當第一行顯示的時候,其它7行熄滅,所以第一行的行線應該輸出1,其它七行的行線應該輸出0,高位在前低位在后,所以行數據就是00000001,轉換成十六進制就是0x01。再來計算列數據,第四五列點亮,所以第四五列應該輸出0,其它列熄滅,所以其它列應該輸出1,高位在前低位在后,所以列數據就是11100111,轉換成十六進制就是0xe7。
按照同樣的方法,可以計算出顯示每一行對應的行數據和列數據。計算出行數據和列數據之后,就可以開始編寫程序了。顯示一行的過程是這樣的:P1口輸出行數據,P0口輸出列數據,延時1ms。顯示8行就是重復執(zhí)行這三步,只是每一次輸出的行數據和列數據不同,同樣的事情重復做,可以用循環(huán)結構編程實現。
在講解程序的過程中,為了克服學員因為沒有編程基礎,一看到大段英文就害怕的心理難題,采用積木式編程的教學方法,把大段的程序進行了分解,就像搭積木一樣,先把最核心的循環(huán)框架搭起來,再一層一層把外面的結構搭起來,從而完成整個程序的編寫。
循環(huán)結構的循環(huán)體就是重復要做的事情,所以可以把剛才的3條語句作為循環(huán)體,然后用for語句循環(huán)8次,實現逐行掃描一次,由于要不停的重復掃描才能穩(wěn)定顯示穩(wěn)定的圖形,所以需要把for語句包含在while(1)無限循環(huán)中,而所有這些內容應該屬于main()主函數。這樣就把程序的主體框架建立起來了,還有一個關鍵的問題是行數據和列數據從哪里來呢?剛才已經計算出顯示每一行對應的行數據和列數據,如果每次執(zhí)行循環(huán)體都能從行數據和列數據中按順序取一個數就好了,這個問題可以用之前學過的數組來解決。
定義一個行數組名稱為row,長度為8,把所有的行數據賦值給這個數組,然后再定義一個列數組名稱為col,把所有的列數據賦值給這個數組。因為每一個數組元素都采用數組名和唯一的下標來表示,且下標從0開始,而for循環(huán)的循環(huán)次數變量也正好是從0開始,和數組元素下標是相等的關系。所以行數據就可以用row[i]來替代,同理,列數據可以用col[i]來替代,這樣main()就完成了,main()代碼如下所示。

最后,將程序下載到焊接好的硬件電路板中進行驗證,發(fā)現實現了箭頭圖形的顯示。
介紹完整個任務的實現過程后,設置了課堂練習環(huán)節(jié),讓學員兩人一組自主設計一種點陣圖形并修改程序實現。
本文介紹了 LED點陣顯示系統(tǒng)的課堂設計過程。整個教學過程貫穿任務牽引、問題推進、知識服務的教學思路。通過本任務的學習,不僅使學員能夠學到知識,掌握如何用單片機控制點陣顯示,而且通過閱讀、修改程序能夠鍛煉學員的邏輯思維能力,還通過自主設計點陣圖形培養(yǎng)學員的創(chuàng)新意識,使學員魚漁兼得。