前些日子,購得一塊08接口的雙色LED顯示屏(打算做個(gè)音樂頻譜顯示器),搗鼓了好幾天,終于搞清楚了其控制原理,在這里做個(gè)總結(jié),算是備忘吧。
1.LED顯示屏的掃描方式
LED顯示屏的掃描方式有靜態(tài)、1/2、1/4、1/8、1/16幾種。
這些掃描方式具體是什么意思呢?我們以1/16掃描方式為例來說明。因?yàn)長ED顯示屏是逐行刷新顯示的,所以在任意時(shí)刻我們只能控制其任意一行的顯示,每次刷新顯示一行,16行為一個(gè)掃描周期,這就是1/16掃描方式。當(dāng)然了,一個(gè)掃描周期的時(shí)間必須要小于人眼視覺暫留的時(shí)間(約0.05秒到0.2秒),否則,人眼會(huì)觀察到LED顯示屏所呈現(xiàn)的畫面出現(xiàn)閃爍。
2.LED顯示屏的接口形式
LED顯示屏的接口形式有04接口、08接口、12接口幾種,這里只介紹08接口。
08接口的管腳定義如圖1所示。
圖108接口管腳定義
其中,管腳LA、LB、LC、LD表示行信號(hào);管腳R1、R2、G1、G2表示列信號(hào);管腳EN表示使能信號(hào);管腳SCK表示時(shí)鐘信號(hào);管腳STB表示鎖存信號(hào);管腳GND表示接地。
那么,管腳LA、LB、LC、LD是如何來控制行信號(hào),從而實(shí)現(xiàn)1/16掃描方式的。其實(shí)很簡單,這是通過兩個(gè)3-8譯碼器74HC138芯片來實(shí)現(xiàn),通過這兩個(gè)芯片可以實(shí)現(xiàn)如下的功能:
當(dāng)管腳LD、LC、LB、LA的輸出分別為0000時(shí),LED顯示屏的第一行被選中;
當(dāng)管腳LD、LC、LB、LA的輸出分別為0001時(shí),LED顯示屏的第二行被選中;
當(dāng)管腳LD、LC、LB、LA的輸出分別為0010時(shí),LED顯示屏的第三行被選中;
......
當(dāng)管腳LD、LC、LB、LA的輸出分別為1111時(shí),LED顯示屏的第十六行被選中。
現(xiàn)在,我們已經(jīng)知道如何通過08接口的四個(gè)行信號(hào)LA、LB、LC、LD來控制LED顯示屏的每一行了。將08接口的四個(gè)列信號(hào)都接地,循環(huán)給四個(gè)行信號(hào)輸入0000到1111,就可以點(diǎn)亮整個(gè)LED顯示屏了。
但是要在LED顯示屏上顯示出漢字或是圖形,僅僅對(duì)行信號(hào)進(jìn)行控制是遠(yuǎn)遠(yuǎn)不夠的,我們還需要對(duì)列信號(hào)進(jìn)行控制。
3.LED顯示屏的列驅(qū)動(dòng)
LED顯示屏的列驅(qū)動(dòng)使用了74HC595芯片,該芯片具有8位串行輸入、8位串行/并行輸出,8位鎖存功能。
對(duì)于64*32的LED顯示屏來說,因?yàn)槠淇偣灿?4列,所以通過對(duì)8個(gè)74HC595芯片進(jìn)行級(jí)聯(lián),即可將其擴(kuò)展為64位串行輸入,64位并行輸出,從而實(shí)現(xiàn)對(duì)64列信號(hào)進(jìn)行控制。
08接口中的管腳R1、R2、G1、G2就是用來輸入64位串行數(shù)據(jù)的。其中,R1、G1分別用來控制上半屏(16行)的紅、綠信號(hào);R2、G2分別用來控制下半屏(16行)的紅綠信號(hào)。因此,對(duì)于64*32的雙色LED顯示屏來說,總共需要使用32個(gè)74HC595芯片。
顯然,當(dāng)紅綠信號(hào)同時(shí)使能時(shí)(列信號(hào)低電平使能),就可以控制LED顯示屏顯示出黃色來了。
現(xiàn)在,我們已經(jīng)知道LED顯示屏的列驅(qū)動(dòng)原理,下一步就可以編寫程序,讓LED顯示屏顯示出任意我們想要的漢字或圖形了。
4.示例程序
了解了LED顯示屏的驅(qū)動(dòng)原理之后,編寫單片機(jī)程序,利用08接口對(duì)其進(jìn)行控制是很容易的。
程序的大致流程應(yīng)該是這樣的:
(1)初始化單片機(jī)的GPIO引腳。
(2)設(shè)置08接口的使能信號(hào)EN。
(3)利用行信號(hào)選中第1行,移位串行輸入第1行的列信號(hào)數(shù)據(jù),鎖存列信號(hào),并行輸出顯示。
(4)利用行信號(hào)選中第2行,移位串行輸入第2行的列信號(hào)數(shù)據(jù),鎖存列信號(hào),并行輸出顯示。
(5)依次遍歷,直到第32行,并行輸出顯示為止。
(6)循環(huán)進(jìn)行3-5的過程。
如下的代碼示例了整個(gè)程序流程。
1 void main(void) 2 { 3 int rowNumber = 0; //行序號(hào) 4 int columnNumber = 0; //列序號(hào) 5 6 InitGPIO(); //初始化單片機(jī)的GPIO引腳 7 LED_OE = 1; //使能信號(hào) 8 9 while(1) //循環(huán)刷新顯示 10 { 11 for(rowNumber=0; rowNumber<16; rowNumber++) //寫入上半屏的顯示內(nèi)容 12 { 13 SetRowLight(rowNumber); //行信號(hào)選擇 14 15 for(columnNumber=0; columnNumber<8; columnNumber++) //寫入列信號(hào)數(shù)據(jù) 16 { 17 Write1ByteToFirstHalfScreen(FirstHalfScreenArray[rowNumber][columnNumber], 0xFF); 18 } 19 20 LED_STB = 0; //鎖存列信號(hào) 21 LED_STB = 1; 22 } 23 24 for(rowNumber=0; rowNumber<16; rowNumber++) //寫入下半屏的顯示內(nèi)容 25 { 26 SetRowLight(rowNumber); //行信號(hào)選擇 27 28 for(columnNumber=0; columnNumber<8; columnNumber++) //寫入列信號(hào)數(shù)據(jù) 29 { 30 Write1ByteToLowerHalfScreen(0xFF, LowerHalfScreenArray[rowNumber][columnNumber]); 31 } 32 33 LED_STB = 0; //鎖存列信號(hào) 34 LED_STB = 1; 35 } 36 } 37 }
其中,函數(shù)SetRowLight()用于控制行信號(hào)的選擇;函數(shù)Write1ByteToFirstHalfScreen()用于向上半屏寫入列信號(hào)數(shù)據(jù);函數(shù)Write1ByteToLowerHalfScreen()用于向下半屏寫入列信號(hào)數(shù)據(jù),二維數(shù)組FirstHalfScreenArray[16][8]和LowerHalfScreenArray[16][8]分別用于存儲(chǔ)列信號(hào)數(shù)據(jù),該數(shù)據(jù)可以通過漢字圖形取模軟件得到。
編輯:hfy
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44992瀏覽量
650505 -
LED顯示屏
+關(guān)注
關(guān)注
36文章
1847瀏覽量
101268 -
GPIO
+關(guān)注
關(guān)注
16文章
1280瀏覽量
54106 -
danpianji
+關(guān)注
關(guān)注
0文章
7瀏覽量
2997
發(fā)布評(píng)論請(qǐng)先 登錄
彩色led顯示屏fpga控制程序
基于VHDL的顯示屏控制電路

單片機(jī)按鍵控制程序【匯編版】
LED顯示屏控制系統(tǒng)的設(shè)計(jì)與整體分析

評(píng)論