本系統采用AT89C52單片機作控制器,整個電路主要由單片機控制及其接口電路、驅動顯示電路、電源電路等部分組成。為了簡化顯示屏電路,降低成本,本系統在單片機部分不加字庫存儲器。而在PC機上編輯漢字和字符顯示信息,并將其轉換為相應的點陣顯示數據,然后通過串口(采用RS-232通信標準)送給單片機存儲并進行顯示處理。圖1所示為其硬件系統原理圖。
用74LS154設計的16x16點陣屏
圖2是一種8x8的LED點陣單色行共陽模塊的內部結構圖,其單點工作電壓Uf為1.8 V,正向電流IF為8~10 mA。當某一行線為高電平而某一列線為低時,其行列交叉的點就被點亮;而當其某一列線為高時,其行列交叉的點為暗;當某一行線為低電平時,無論列線如何,對應這一行的點全部為暗。
用四個8x8點陣顯示可構成16x16點陣顯示器,其連接方法如圖3所示。圖中,將(A)和(B)的8列、(C)和(D)的8列分別對應相連,同時將(A)和(C)的8行、 (B)和(D)的8行分別對應相連。即可形成一個16行(每一行有16個LED)、16列(每一列也有16個LED)的16x16點陣顯示器,可將這256個點稱為一頁,這樣,顯示字符時。只要對一頁中對應的亮滅進行控制即可。
LED點陣顯示器的掃描驅動
LED顯示屏驅動電路的設計應與所用控制系統相配合。驅動通常分為動態掃描型及靜態鎖存型驅動二大類。本文以動態掃描型驅動電路的設計為例來進行分析。動態掃描型驅動方式是指顯示屏上的16行發光二極管共用一組列驅動寄存器,然后通過行驅動管的分時工作,來使每行LED的點亮時間占總時間的1/16。只要每行的刷新速率大于50 Hz,利用人眼的視覺暫留效應,人們就可以看到一幅完整的文字或畫面。
74HC138 作用原理于高性能的存貯譯碼或要求傳輸延遲時間短的數據傳輸系統,在 高性能存貯器系統中,用這種譯碼器可以提高譯碼系統的效率。將快速賦能電路用于高速存貯器時,譯碼器的延遲時間和存貯器的賦能時間通常小于存貯器的典型存取時間,這就是說由肖特基鉗位的系統譯碼器所引起的有效系統延遲可以忽略不計。HC138 按照三位二進制輸入碼和賦能輸入條件,從8 個輸出端中譯出一個 低電平輸出。
AT89S52單片機有四個I/O口(P0、P1、P2、P3),每個I/O口有8位,如果都采用并行輸出,顯然不能滿足要求,因此,本設計中的行掃描驅動采用并口輸出,而場掃描驅動采用串口輸出。
行掃描驅動
由于16x64點陣顯示器有16行,為充分利用單片機的接口,本電路中加入了一個4-16線譯碼器74LS154,其輸入是一個16進制碼,解碼輸出為低態掃描信號,它們的管腳示意圖如圖4所示。把74LS154的G1和G2引腳接地,然后以A、B、C、D四腳為輸入端。就會形成16種不同的輸入狀態,分別為0000~1111,然后使每種狀態只控制一路輸出,即會有16路輸出。如果一行64點全部點亮,則通過74LS154的電流將達640 mA,而實際上,74LS154譯碼器提供不了足夠的吸收電流來同時驅動64個LED同時點亮,因此,應在74LS154每一路輸出端與16x64點陣顯示器對應的每一行之間用一個三極管來將電流信號放大,本文選用的是達林頓三極管TIP127。這樣,74LS154某一輸出腳為低電平時,對應的三極管發射極為高電平,從而使點陣顯示器的對應行也為高電平。
列掃描驅動
本系統場掃描驅動電路的設計可用串入并出的通用集成電路74HC595來作為數據鎖存。74HC595是一個八位串行輸入三態并行輸出的移位寄存器,其管腳見圖4所示,其中SI是串行數據的輸入端,RCK是存儲寄存器的輸入時鐘,SCK是移位寄存器的輸入時鐘,Q‘H是串人數據的輸出,G是對輸人數據的輸出使能控制,QA~QH為串入數據的并行輸出。從SI口輸入的數據可在移位寄存器的SCK腳上升沿的作用下輸入到74HC595中。并在RCK腳的上升沿作用下將輸入的數據鎖存在74HC595中,這樣,當G為低電平時,數據便可并行輸出。為了避免與PC機串口輸入的數據相互干擾,也可使用模擬串口P1.4~P1.7來分別輸出串行數據、移位時鐘SCK、存儲信號RCK和并行輸出的使能信號G。
為了消除電源電壓的波動及行掃描管壓降(第一行點亮的點數不同,將引起管壓降的變化,從而影響通過LED管的電流)的變化對LED顯示屏亮度的影響,設計時可采用列恒流驅動電路,可選用三極管8550和外圍元件構成列恒流驅動電路,并通過調整100 kΩ可調電阻使三極管處于放大狀態,同時將集電極電流調整為10 mA,從而使點亮對應點陣時通過LED的電流不變。
掃描顯示工作過程
將8片74HC595進行級連,可共用一個移位時鐘SCK及數據鎖存信號RCK。這樣,當第一行需要顯示的數據經過8x8=64個SCK時鐘后便可將其全部移入74HC595中,此時還將產生一個數據鎖存信號RCK將數據鎖存在74HC595中,并在使能信號G的作用下,使串入數據并行輸出,從而使與各輸出位對應的場驅動管處于放大或截止狀態;同時由行掃描控制電路產生信號使第一行掃描管導通,相當于第一行LED的正端都接高,顯然,第一行LED管的亮滅就取決于74HC595中的鎖存信號;此外,在第一行LED管點亮的同時,再在74HC595中移入第二行需要顯示的數據,隨后將其鎖存,同時由行掃描控制電路將第一行掃描管關閉而接通第二行,使第二行LED管點亮,以此類推,當第十六行掃描過后再回到第一行,這樣,只要掃描速度足夠高,就可形成一幅完整的文字或圖像。
軟件設計流程圖
#include《reg52.h》
char tab[32]={
0x00,0x00,0x10,0x00,0x90,0x3F,0x90,0x10,0xFF,0x10,0x90,0x10,0x90,0xBF,0x10,0x40,
0x00,0x30,0xFE,0x0F,0x22,0x02,0x22,0x42,0x22,0x82,0xFE,0x7F,0x00,0x00,0x00,0x00};
char tab1[32]={
0x10,0x04,0x10,0x03,0xD0,0x00,0xFF,0xFF,0x90,0x00,0x10,0x11,0x00,0x08,0x10,0x04,
0x10,0x03,0xD0,0x00,0xFF,0xFF,0xD0,0x00,0x10,0x03,0x10,0x04,0x10,0x08,0x00,0x00};
char tab2[32]={
0x10,0x04,0x60,0x04,0x02,0x7C,0x0C,0x03,0xC0,0x20,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x20,0xFC,0x3F,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x00,0x20,0x00,0x00} ;
void delay(int z)
{
int x,y;
for(x=z;x》0;x--)
for(y=10;y》0;y--);
}
void main(void)
{
int i,j;
while(1)
{
for(i=200;i》0;i--)
{
P3 = 0xf0;
P0 = tab[0];
P2 = tab[1];
delay(1);
P3 = 0xf1;
P0 = tab[2];
P2 = tab[3];
delay(1);
P3 = 0xf2;
P0 = tab[4];
P2 = tab[5];
delay(1);
P3 = 0xf3;
P0 = tab[6];
P2 = tab[7];
delay(1);
P3 = 0xf4;
P0 = tab[8];
P2 = tab[9];
delay(1);
P3 = 0xf5;
P0 = tab[10];
P2 = tab[11];
delay(1);
P3 = 0xf6;
P0 = tab[12];
P2 = tab[13];
delay(1);
P3 = 0xf7;
P0 = tab[14];
P2 = tab[15];
delay(1);
P3 = 0xf8;
P0 = tab[16];
P2 = tab[17];
delay(1);
P3 = 0xf9;
P0 = tab[18];
P2 = tab[19];
delay(1);
P3 = 0xfa;
P0 = tab[20];
P2 = tab[21];
delay(1);
P3 = 0xfb;
P0 = tab[22];
P2 = tab[23];
delay(1);
P3 = 0xfc;
P0 = tab[24];
P2 = tab[25];
delay(1);
P3 = 0xfd;
P0 = tab[26];
P2 = tab[27];
delay(1);
P3 = 0xfe;
P0 = tab[28];
P2 = tab[29];
delay(1);
P3 = 0xff;
P0 = tab[30];
P2 = tab[31];
}
for(j=200;j》0;j--)
{
P3 = 0xf0;
P0 = tab1[0];
P2 = tab1[1];
delay(1);
P3 = 0xf1;
P0 = tab1[2];
P2 = tab1[3];
delay(1);
P3 = 0xf2;
P0 = tab1[4];
P2 = tab1[5];
delay(1);
P3 = 0xf3;
P0 = tab1[6];
P2 = tab1[7];
delay(1);
P3 = 0xf4;
P0 = tab1[8];
P2 = tab1[9];
delay(1);
P3 = 0xf5;
P0 = tab1[10];
P2 = tab1[11];
delay(1);
P3 = 0xf6;
P0 = tab1[12];
P2 = tab1[13];
delay(1);
P3 = 0xf7;
P0 = tab1[14];
P2 = tab1[15];
delay(1);
P3 = 0xf8;
P0 = tab1[16];
P2 = tab1[17];
delay(1);
P3 = 0xf9;
P0 = tab1[18];
P2 = tab1[19];
delay(1);
P3 = 0xfa;
P0 = tab1[20];
P2 = tab1[21];
delay(1);
P3 = 0xfb;
P0 = tab1[22];
P2 = tab1[23];
delay(1);
P3 = 0xfc;
P0 = tab1[24];
P2 = tab1[25];
delay(1);
P3 = 0xfd;
P0 = tab1[26];
P2 = tab1[27];
delay(1);
P3 = 0xfe;
P0 = tab1[28];
P2 = tab1[29];
delay(1);
P3 = 0xff;
P0 = tab1[30];
P2 = tab1[31];
}
for(j=200;j》0;j--)
{
P3 = 0xf0;
P0 = tab2[0];
P2 = tab2[1];
delay(1);
P3 = 0xf1;
P0 = tab2[2];
P2 = tab2[3];
delay(1);
P3 = 0xf2;
P0 = tab2[4];
P2 = tab2[5];
delay(1);
P3 = 0xf3;
P0 = tab2[6];
P2 = tab2[7];
delay(1);
P3 = 0xf4;
P0 = tab2[8];
P2 = tab2[9];
delay(1);
P3 = 0xf5;
P0 = tab2[10];
P2 = tab2[11];
delay(1);
P3 = 0xf6;
P0 = tab2[12];
P2 = tab2[13];
delay(1);
P3 = 0xf7;
P0 = tab2[14];
P2 = tab2[15];
delay(1);
P3 = 0xf8;
P0 = tab2[16];
P2 = tab2[17];
delay(1);
P3 = 0xf9;
P0 = tab2[18];
P2 = tab2[19];
delay(1);
P3 = 0xfa;
P0 = tab2[20];
P2 = tab2[21];
delay(1);
P3 = 0xfb;
P0 = tab2[22];
P2 = tab2[23];
delay(1);
P3 = 0xfc;
P0 = tab2[24];
P2 = tab2[25];
delay(1);
P3 = 0xfd;
P0 = tab2[26];
P2 = tab2[27];
delay(1);
P3 = 0xfe;
P0 = tab2[28];
P2 = tab2[29];
delay(1);
P3 = 0xff;
P0 = tab2[30];
P2 = tab2[31];
}
}
}
評論
查看更多