【玩轉單片機系列001】 08接口雙色LED顯示屏驅動方式探索

  前些日子,從淘寶上購得一塊08接口的雙色LED顯示屏(打算作個音樂頻譜顯示器),搗鼓了好幾天,終於搞清楚了其控制原理,在這裏作個總結,算是備忘吧。數組

 

1.LED顯示屏的掃描方式函數

  LED顯示屏的掃描方式有靜態、1/二、1/四、1/八、1/16幾種。spa

這些掃描方式具體是什麼意思呢?咱們以1/16掃描方式爲例來講明。由於LED顯示屏是逐行刷新顯示的,因此在任意時刻咱們只能控制其任意一行的顯示,每次刷新顯示一行,16行爲一個掃描週期,這就是1/16掃描方式。固然了,一個掃描週期的時間必需要小於人眼視覺暫留的時間(約0.05秒到0.2秒),不然,人眼會觀察到LED顯示屏所呈現的畫面出現閃爍。3d

 

2.LED顯示屏的接口形式code

  LED顯示屏的接口形式有04接口、08接口、12接口幾種,這裏只介紹08接口。blog

  08接口的管腳定義如圖1所示。接口

1 08接口管腳定義it

  其中,管腳LALBLCLD表示行信號;管腳R1R2G1G2表示列信號;管腳EN表示使能信號;管腳SCK表示時鐘信號;管腳STB表示鎖存信號;管腳GND表示接地。class

  那麼,管腳LALBLCLD是如何來控制行信號,從而實現1/16掃描方式的。其實很簡單,這是經過兩個3-8譯碼器74HC138芯片來實現,經過這兩個芯片能夠實現以下的功能:原理

  當管腳LDLCLBLA的輸出分別爲0000時,LED顯示屏的第一行被選中;

  當管腳LDLCLBLA的輸出分別爲0001時,LED顯示屏的第二行被選中;

  當管腳LDLCLBLA的輸出分別爲0010時,LED顯示屏的第三行被選中;

  ......

  當管腳LDLCLBLA的輸出分別爲1111時,LED顯示屏的第十六行被選中。

  如今,咱們已經知道如何經過08接口的四個行信號LALBLCLD來控制LED顯示屏的每一行了。將08接口的四個列信號都接地,循環給四個行信號輸入00001111,就能夠點亮整個LED顯示屏了。

  可是要在LED顯示屏上顯示出漢字或是圖形,僅僅對行信號進行控制是遠遠不夠的,咱們還須要對列信號進行控制。

 

3.LED顯示屏的列驅動

  LED顯示屏的列驅動使用了74HC595芯片,該芯片具備8位串行輸入、8位串行/並行輸出,8位鎖存功能。

  對於64*32LED顯示屏來講,由於其總共有64列,因此經過對874HC595芯片進行級聯,便可將其擴展爲64位串行輸入,64位並行輸出,從而實現對64列信號進行控制。

  08接口中的管腳R1R2G1G2就是用來輸入64位串行數據的。其中,R1G1分別用來控制上半屏(16行)的紅、綠信號;R2G2分別用來控制下半屏(16行)的紅綠信號。所以,對於64*32的雙色LED顯示屏來講,總共須要使用3274HC595芯片。

  顯然,當紅綠信號同時使能時(列信號低電平使能),就能夠控制LED顯示屏顯示出黃色來了。

  如今,咱們已經知道LED顯示屏的列驅動原理,下一步就能夠編寫程序,讓LED顯示屏顯示出任意咱們想要的漢字或圖形了。

 

4.示例程序

  瞭解了LED顯示屏的驅動原理以後,編寫單片機程序,利用08接口對其進行控制是很容易的。

  程序的大體流程應該是這樣的:

  (1)初始化單片機的GPIO引腳。

  (2)設置08接口的使能信號EN

  (3)利用行信號選中第1行,移位串行輸入第1行的列信號數據,鎖存列信號,並行輸出顯示。

  (4)利用行信號選中第2行,移位串行輸入第2行的列信號數據,鎖存列信號,並行輸出顯示。

  (5)依次遍歷,直到第32行,並行輸出顯示爲止。

  (6)循環進行3-5的過程。

  以下的代碼示例了整個程序流程。

 1 void main(void)
 2 {
 3     int rowNumber = 0;                   //行序號
 4     int columnNumber = 0;                //列序號
 5 
 6     InitGPIO();                          //初始化單片機的GPIO引腳    
 7     LED_OE = 1;                          //使能信號
 8 
 9     while(1)                             //循環刷新顯示
10     {        
11         for(rowNumber=0; rowNumber<16; rowNumber++)                   //寫入上半屏的顯示內容
12         {
13               SetRowLight(rowNumber);                                 //行信號選擇
14 
15             for(columnNumber=0; columnNumber<8; columnNumber++)       //寫入列信號數據
16             {
17                 Write1ByteToFirstHalfScreen(FirstHalfScreenArray[rowNumber][columnNumber], 0xFF);
18             }
19 
20             LED_STB = 0;                                              //鎖存列信號
21             LED_STB = 1;
22         }
23             
24         for(rowNumber=0; rowNumber<16; rowNumber++)                   //寫入下半屏的顯示內容
25         {
26               SetRowLight(rowNumber);                                 //行信號選擇
27                                                                     
28             for(columnNumber=0; columnNumber<8; columnNumber++)       //寫入列信號數據
29             {
30                 Write1ByteToLowerHalfScreen(0xFF, LowerHalfScreenArray[rowNumber][columnNumber]);    
31             }
32                                                                    
33             LED_STB = 0;                                              //鎖存列信號
34             LED_STB = 1;
35         }                
36     }
37 }

  其中,函數SetRowLight()用於控制行信號的選擇;函數Write1ByteToFirstHalfScreen()用於向上半屏寫入列信號數據;函數Write1ByteToLowerHalfScreen()用於向下半屏寫入列信號數據,二維數組FirstHalfScreenArray[16][8]LowerHalfScreenArray[16][8]分別用於存儲列信號數據,該數據能夠經過漢字圖形取模軟件獲得。

  例如,向二維數組FirstHalfScreenArray[16][8]LowerHalfScreenArray[16][8]中分別放入個人郵箱「menlsh@163.com」的ASCII數據碼,就能夠獲得如圖2所示的顯示效果了。

2 LED顯示屏顯示效果示例

相關文章
相關標籤/搜索