高 娟 張衛(wèi)清 崔艷萍
(陸軍工程大學(xué)軍械士官學(xué)校 湖北·武漢 430075)
生活中隨處可見LED點陣的身影,比如在學(xué)校,在公交車上,在十字路口,在地鐵站等,LED點陣大屏幕不僅能顯示文字,還可以顯示圖形、圖像,并且能產(chǎn)生各種動畫效果,是廣告宣傳、新聞傳播的有力工具。如果我們走近LED點陣大屏幕仔細(xì)觀察,會發(fā)現(xiàn)它們是由一個個小的LED點陣模塊組成的,而LED點陣模塊是由一個個的LED發(fā)光二極管組成。最常見的 LED 點陣顯示模塊有 5×7、7×9、8×8 結(jié)構(gòu)。
LED點陣可以作為單片機應(yīng)用系統(tǒng)的顯示器件,用單片機控制它顯示文字或圖形。在《單片機應(yīng)用技術(shù)》課程教學(xué)中,LED點陣顯示控制是一個重要的教學(xué)內(nèi)容。下面結(jié)合筆者實際教學(xué)的過程及任務(wù)介紹課堂設(shè)計。
首先播放一段LED點陣在生活中應(yīng)用的小視頻,引起學(xué)員對LED點陣的學(xué)習(xí)興趣,從而引出課堂任務(wù)——用單片機控制8×8LED顯示屏顯示一個像交通燈一樣的指示箭頭,如圖1所示。
圖1:8×8點陣顯示的指示箭頭
本人所在院校為高職院校,所教授的對象為職業(yè)技術(shù)教育學(xué)員,像《單片機應(yīng)用技術(shù)》這種實踐性較強的課程,采用的都是任務(wù)驅(qū)動、理實一體的教學(xué)模式,以任務(wù)為載體,將知識與技能的培養(yǎng)放在具體的任務(wù)實施中。
為了完成這個任務(wù),需要先介紹LED點陣的基礎(chǔ)知識,讓學(xué)員了解LED點陣的內(nèi)部結(jié)構(gòu)及顯示原理。
什么是LED點陣顯示器呢?LED是發(fā)光二極管,把許多LED發(fā)光二極管按矩陣方式排列在一起,通過對每個LED進行發(fā)光控制,來完成各種字符或圖形的顯示,就是LED點陣顯示器。
以最常見的8行8列的點陣為例,它的等效電路就是每一個LED連接在行線和列線的交叉處,LED的正極連接在行線上,負(fù)極連接在列線上,8行8列共64個LED。
LED點亮的條件是正向?qū)?,所以LED點陣顯示的原理就是要點亮的像素點所在的行輸出高電平,所在的列輸出低電平。比如:讓第四行輸出高電平,第四列輸出低電平,則位于第四行第四列處的像素點就點亮了。
認(rèn)識了8×8LED點陣后,接下來問題是它怎么和單片機連接才能顯示圖形呢?所以第二部分就是介紹8×8LED點陣的控制電路。
8根行線,8根列線一共有16個引腳,所以需要連接單片機的兩個并行口I/O端口,比如用P1口控制行,P0口控制列,通常P1.0連接第一行R1,P0.0連接第一列C1,其它的以此類推。
設(shè)置問題,讓學(xué)員思考能否直接把P1口連接到行線,輸出高電平,驅(qū)動LED點陣發(fā)光。聯(lián)系前面知識“單片機的并行口引腳能夠直接輸出的電流非常小,還不到1mA,不足以驅(qū)動LED點陣發(fā)光”解決問題,所以需要增加一個驅(qū)動芯片以增大電流,這個驅(qū)動芯片增加到行或列都可以,這里選擇在P1口和行線之間增加一個74LS245,它是一個8同相三態(tài)緩沖驅(qū)動器,不改變電平方向,但可以增大電流,這是行線的連接。
接下來再介紹列線的連接,如果直接把P0口和列線連接,而此時某一行只有一個LED點亮,可能會因電流過大而燒壞LED,所以需要在P0口和列線之間串聯(lián)一組限流電阻,這里串聯(lián)的是一組300歐的限流電阻。
把單片機和點陣連接起來之后,接下來的問題就是怎樣讓點陣顯示需要的圖形了,所以第三個內(nèi)容就是介紹點陣顯示。
首先以第一行為例介紹怎樣顯示一行。根據(jù)前面介紹的顯示原理,要顯示的像素點所在的行應(yīng)該輸出高電平,列應(yīng)該輸出低電平。第一行有兩個像素點同時點亮,所以第一行的行線應(yīng)該輸出1,第4,5列的列線應(yīng)該同時輸出0,這是顯示第一行的條件。
然后介紹怎樣同時顯示兩行。第二行有4個像素點亮,所以第二行的行線應(yīng)該輸出1,第3,4,5,6列的列線應(yīng)該同時輸出0,這是顯示第二行的條件。當(dāng)看到一個完整的箭頭圖形時,大家看到的是這兩行同時顯示,所以應(yīng)該需要這兩個條件同時滿足,而如果這兩個條件同時滿足,又會導(dǎo)致第1行和第2行的3,4,5,6列的led同時點亮,顯示這不是我們想要的結(jié)果。所以,可以反推出來兩行同時顯示這個條件不成立,也就是兩行不能同時顯示。可是當(dāng)大家看到一個完整圖形的時候,明明看到的就是所有的行同時顯示呀,難道是我們的眼睛欺騙了我們嗎?其實不是我們的眼睛欺騙了我們,而是點陣欺騙了我們的眼睛。為什么呢?
其實點陣顯示采用的是動態(tài)掃描顯示的方法,什么叫動態(tài)掃描顯示呢?動態(tài)掃描顯示有兩種,逐行掃描法和逐列掃描法,兩種方法顯示原理是相同的,下面以逐行掃描法為例來介紹。
逐行掃描法簡單的說就是一行一行的來顯示。首先顯示第1行,其他7行熄滅,延時一段時間,然后顯示第2行,其他7行熄滅,再延時一段時間,以此類推,逐行顯示,直到第8行顯示完畢,再從第一行開始掃描,不斷循環(huán)這個過程,這就是逐行掃描法。
每一行顯示時間取約1ms,一個循環(huán)周期約為8ms,1s大約可以掃描125次,由于人眼具有視覺駐留效應(yīng),每秒顯示超過30幀人眼就無法分辨了,顯然這里掃描的足夠快,所以大家看到的是一個穩(wěn)定的圖形,而不是逐行顯示,這就是逐行掃描法的工作原理。反過來,如果掃描的比較慢,也就是每行顯示的時間長一些,大家看到應(yīng)該就是逐行顯示了。為了驗證這個結(jié)論,設(shè)計了一個實驗。
按照由慢到快的方式編程實現(xiàn)逐行掃描。首先讓每行顯示1s,然后每行顯示0.5s,接下來每行顯示0.1s,實驗現(xiàn)象就是掃描的速度越來越快,但還是逐行顯示。接下來讓每行顯示10ms,重復(fù)若干次,此時已經(jīng)能看到一個圖形了,但是還有些閃爍,最后讓每行顯示1ms,這樣就可以看到一個穩(wěn)定的圖形了。這個實驗很好的展示了逐行掃描法的工作原理,通過它學(xué)員應(yīng)該能理解逐行掃描法的工作原理了。接下來就可以根據(jù)這個原理來編寫程序一行一行的顯示了,所以第四個內(nèi)容就是介紹控制程序的編寫。
一行一行的顯示,先要找出顯示每一行對應(yīng)的行數(shù)據(jù)和列數(shù)據(jù),所以,先來介紹行數(shù)據(jù)和列數(shù)據(jù)計算。
行數(shù)據(jù)和列數(shù)據(jù)與硬件電路密切相關(guān),因為硬件決定軟件。根據(jù)前面的硬件電路連接關(guān)系,第一行連接的是P1.0,是數(shù)據(jù)低位,第八行連接的是P1.7,是數(shù)據(jù)高位,第一列連接的是P0.0,是數(shù)據(jù)低位,第八列連接的是P0.7,是數(shù)據(jù)高位。
以第一行為例來計算顯示第一行對應(yīng)的行數(shù)據(jù)和列數(shù)據(jù),因為行線是1有效,列線是0有效。當(dāng)?shù)谝恍酗@示的時候,其它7行熄滅,所以第一行的行線應(yīng)該輸出1,其它七行的行線應(yīng)該輸出0,高位在前低位在后,所以行數(shù)據(jù)就是00000001,轉(zhuǎn)換成十六進制就是0x01。再來計算列數(shù)據(jù),第四五列點亮,所以第四五列應(yīng)該輸出0,其它列熄滅,所以其它列應(yīng)該輸出1,高位在前低位在后,所以列數(shù)據(jù)就是11100111,轉(zhuǎn)換成十六進制就是0xe7。
按照同樣的方法,可以計算出顯示每一行對應(yīng)的行數(shù)據(jù)和列數(shù)據(jù)。計算出行數(shù)據(jù)和列數(shù)據(jù)之后,就可以開始編寫程序了。顯示一行的過程是這樣的:P1口輸出行數(shù)據(jù),P0口輸出列數(shù)據(jù),延時1ms。顯示8行就是重復(fù)執(zhí)行這三步,只是每一次輸出的行數(shù)據(jù)和列數(shù)據(jù)不同,同樣的事情重復(fù)做,可以用循環(huán)結(jié)構(gòu)編程實現(xiàn)。
在講解程序的過程中,為了克服學(xué)員因為沒有編程基礎(chǔ),一看到大段英文就害怕的心理難題,采用積木式編程的教學(xué)方法,把大段的程序進行了分解,就像搭積木一樣,先把最核心的循環(huán)框架搭起來,再一層一層把外面的結(jié)構(gòu)搭起來,從而完成整個程序的編寫。
循環(huán)結(jié)構(gòu)的循環(huán)體就是重復(fù)要做的事情,所以可以把剛才的3條語句作為循環(huán)體,然后用for語句循環(huán)8次,實現(xiàn)逐行掃描一次,由于要不停的重復(fù)掃描才能穩(wěn)定顯示穩(wěn)定的圖形,所以需要把for語句包含在while(1)無限循環(huán)中,而所有這些內(nèi)容應(yīng)該屬于main()主函數(shù)。這樣就把程序的主體框架建立起來了,還有一個關(guān)鍵的問題是行數(shù)據(jù)和列數(shù)據(jù)從哪里來呢?剛才已經(jīng)計算出顯示每一行對應(yīng)的行數(shù)據(jù)和列數(shù)據(jù),如果每次執(zhí)行循環(huán)體都能從行數(shù)據(jù)和列數(shù)據(jù)中按順序取一個數(shù)就好了,這個問題可以用之前學(xué)過的數(shù)組來解決。
定義一個行數(shù)組名稱為row,長度為8,把所有的行數(shù)據(jù)賦值給這個數(shù)組,然后再定義一個列數(shù)組名稱為col,把所有的列數(shù)據(jù)賦值給這個數(shù)組。因為每一個數(shù)組元素都采用數(shù)組名和唯一的下標(biāo)來表示,且下標(biāo)從0開始,而for循環(huán)的循環(huán)次數(shù)變量也正好是從0開始,和數(shù)組元素下標(biāo)是相等的關(guān)系。所以行數(shù)據(jù)就可以用row[i]來替代,同理,列數(shù)據(jù)可以用col[i]來替代,這樣main()就完成了,main()代碼如下所示。
最后,將程序下載到焊接好的硬件電路板中進行驗證,發(fā)現(xiàn)實現(xiàn)了箭頭圖形的顯示。
介紹完整個任務(wù)的實現(xiàn)過程后,設(shè)置了課堂練習(xí)環(huán)節(jié),讓學(xué)員兩人一組自主設(shè)計一種點陣圖形并修改程序?qū)崿F(xiàn)。
本文介紹了 LED點陣顯示系統(tǒng)的課堂設(shè)計過程。整個教學(xué)過程貫穿任務(wù)牽引、問題推進、知識服務(wù)的教學(xué)思路。通過本任務(wù)的學(xué)習(xí),不僅使學(xué)員能夠?qū)W到知識,掌握如何用單片機控制點陣顯示,而且通過閱讀、修改程序能夠鍛煉學(xué)員的邏輯思維能力,還通過自主設(shè)計點陣圖形培養(yǎng)學(xué)員的創(chuàng)新意識,使學(xué)員魚漁兼得。