本系統(tǒng)采用AT89C52單片機(jī)作控制器,整個(gè)電路主要由單片機(jī)控制及其接口電路、驅(qū)動(dòng)顯示電路、電源電路等部分組成。為了簡(jiǎn)化顯示屏電路,降低成本,本系統(tǒng)在單片機(jī)部分不加字庫(kù)存儲(chǔ)器。而在PC機(jī)上編輯漢字和字符顯示信息,并將其轉(zhuǎn)換為相應(yīng)的點(diǎn)陣顯示數(shù)據(jù),然后通過串口(采用RS-232通信標(biāo)準(zhǔn))送給單片機(jī)存儲(chǔ)并進(jìn)行顯示處理。圖1所示為其硬件系統(tǒng)原理圖。
用74LS154設(shè)計(jì)的16x16點(diǎn)陣屏
圖2是一種8x8的LED點(diǎn)陣單色行共陽(yáng)模塊的內(nèi)部結(jié)構(gòu)圖,其單點(diǎn)工作電壓Uf為1.8 V,正向電流IF為8~10 mA。當(dāng)某一行線為高電平而某一列線為低時(shí),其行列交叉的點(diǎn)就被點(diǎn)亮;而當(dāng)其某一列線為高時(shí),其行列交叉的點(diǎn)為暗;當(dāng)某一行線為低電平時(shí),無(wú)論列線如何,對(duì)應(yīng)這一行的點(diǎn)全部為暗。
用四個(gè)8x8點(diǎn)陣顯示可構(gòu)成16x16點(diǎn)陣顯示器,其連接方法如圖3所示。圖中,將(A)和(B)的8列、(C)和(D)的8列分別對(duì)應(yīng)相連,同時(shí)將(A)和(C)的8行、 (B)和(D)的8行分別對(duì)應(yīng)相連。即可形成一個(gè)16行(每一行有16個(gè)LED)、16列(每一列也有16個(gè)LED)的16x16點(diǎn)陣顯示器,可將這256個(gè)點(diǎn)稱為一頁(yè),這樣,顯示字符時(shí)。只要對(duì)一頁(yè)中對(duì)應(yīng)的亮滅進(jìn)行控制即可。
LED點(diǎn)陣顯示器的掃描驅(qū)動(dòng)
LED顯示屏驅(qū)動(dòng)電路的設(shè)計(jì)應(yīng)與所用控制系統(tǒng)相配合。驅(qū)動(dòng)通常分為動(dòng)態(tài)掃描型及靜態(tài)鎖存型驅(qū)動(dòng)二大類。本文以動(dòng)態(tài)掃描型驅(qū)動(dòng)電路的設(shè)計(jì)為例來(lái)進(jìn)行分析。動(dòng)態(tài)掃描型驅(qū)動(dòng)方式是指顯示屏上的16行發(fā)光二極管共用一組列驅(qū)動(dòng)寄存器,然后通過行驅(qū)動(dòng)管的分時(shí)工作,來(lái)使每行LED的點(diǎn)亮?xí)r間占總時(shí)間的1/16。只要每行的刷新速率大于50 Hz,利用人眼的視覺暫留效應(yīng),人們就可以看到一幅完整的文字或畫面。
74HC138 作用原理于高性能的存貯譯碼或要求傳輸延遲時(shí)間短的數(shù)據(jù)傳輸系統(tǒng),在 高性能存貯器系統(tǒng)中,用這種譯碼器可以提高譯碼系統(tǒng)的效率。將快速賦能電路用于高速存貯器時(shí),譯碼器的延遲時(shí)間和存貯器的賦能時(shí)間通常小于存貯器的典型存取時(shí)間,這就是說由肖特基鉗位的系統(tǒng)譯碼器所引起的有效系統(tǒng)延遲可以忽略不計(jì)。HC138 按照三位二進(jìn)制輸入碼和賦能輸入條件,從8 個(gè)輸出端中譯出一個(gè) 低電平輸出。
AT89S52單片機(jī)有四個(gè)I/O口(P0、P1、P2、P3),每個(gè)I/O口有8位,如果都采用并行輸出,顯然不能滿足要求,因此,本設(shè)計(jì)中的行掃描驅(qū)動(dòng)采用并口輸出,而場(chǎng)掃描驅(qū)動(dòng)采用串口輸出。
行掃描驅(qū)動(dòng)
由于16x64點(diǎn)陣顯示器有16行,為充分利用單片機(jī)的接口,本電路中加入了一個(gè)4-16線譯碼器74LS154,其輸入是一個(gè)16進(jìn)制碼,解碼輸出為低態(tài)掃描信號(hào),它們的管腳示意圖如圖4所示。把74LS154的G1和G2引腳接地,然后以A、B、C、D四腳為輸入端。就會(huì)形成16種不同的輸入狀態(tài),分別為0000~1111,然后使每種狀態(tài)只控制一路輸出,即會(huì)有16路輸出。如果一行64點(diǎn)全部點(diǎn)亮,則通過74LS154的電流將達(dá)640 mA,而實(shí)際上,74LS154譯碼器提供不了足夠的吸收電流來(lái)同時(shí)驅(qū)動(dòng)64個(gè)LED同時(shí)點(diǎn)亮,因此,應(yīng)在74LS154每一路輸出端與16x64點(diǎn)陣顯示器對(duì)應(yīng)的每一行之間用一個(gè)三極管來(lái)將電流信號(hào)放大,本文選用的是達(dá)林頓三極管TIP127。這樣,74LS154某一輸出腳為低電平時(shí),對(duì)應(yīng)的三極管發(fā)射極為高電平,從而使點(diǎn)陣顯示器的對(duì)應(yīng)行也為高電平。
列掃描驅(qū)動(dòng)
本系統(tǒng)場(chǎng)掃描驅(qū)動(dòng)電路的設(shè)計(jì)可用串入并出的通用集成電路74HC595來(lái)作為數(shù)據(jù)鎖存。74HC595是一個(gè)八位串行輸入三態(tài)并行輸出的移位寄存器,其管腳見圖4所示,其中SI是串行數(shù)據(jù)的輸入端,RCK是存儲(chǔ)寄存器的輸入時(shí)鐘,SCK是移位寄存器的輸入時(shí)鐘,Q‘H是串人數(shù)據(jù)的輸出,G是對(duì)輸人數(shù)據(jù)的輸出使能控制,QA~QH為串入數(shù)據(jù)的并行輸出。從SI口輸入的數(shù)據(jù)可在移位寄存器的SCK腳上升沿的作用下輸入到74HC595中。并在RCK腳的上升沿作用下將輸入的數(shù)據(jù)鎖存在74HC595中,這樣,當(dāng)G為低電平時(shí),數(shù)據(jù)便可并行輸出。為了避免與PC機(jī)串口輸入的數(shù)據(jù)相互干擾,也可使用模擬串口P1.4~P1.7來(lái)分別輸出串行數(shù)據(jù)、移位時(shí)鐘SCK、存儲(chǔ)信號(hào)RCK和并行輸出的使能信號(hào)G。
為了消除電源電壓的波動(dòng)及行掃描管壓降(第一行點(diǎn)亮的點(diǎn)數(shù)不同,將引起管壓降的變化,從而影響通過LED管的電流)的變化對(duì)LED顯示屏亮度的影響,設(shè)計(jì)時(shí)可采用列恒流驅(qū)動(dòng)電路,可選用三極管8550和外圍元件構(gòu)成列恒流驅(qū)動(dòng)電路,并通過調(diào)整100 kΩ可調(diào)電阻使三極管處于放大狀態(tài),同時(shí)將集電極電流調(diào)整為10 mA,從而使點(diǎn)亮對(duì)應(yīng)點(diǎn)陣時(shí)通過LED的電流不變。
掃描顯示工作過程
將8片74HC595進(jìn)行級(jí)連,可共用一個(gè)移位時(shí)鐘SCK及數(shù)據(jù)鎖存信號(hào)RCK。這樣,當(dāng)?shù)谝恍行枰@示的數(shù)據(jù)經(jīng)過8x8=64個(gè)SCK時(shí)鐘后便可將其全部移入74HC595中,此時(shí)還將產(chǎn)生一個(gè)數(shù)據(jù)鎖存信號(hào)RCK將數(shù)據(jù)鎖存在74HC595中,并在使能信號(hào)G的作用下,使串入數(shù)據(jù)并行輸出,從而使與各輸出位對(duì)應(yīng)的場(chǎng)驅(qū)動(dòng)管處于放大或截止?fàn)顟B(tài);同時(shí)由行掃描控制電路產(chǎn)生信號(hào)使第一行掃描管導(dǎo)通,相當(dāng)于第一行LED的正端都接高,顯然,第一行LED管的亮滅就取決于74HC595中的鎖存信號(hào);此外,在第一行LED管點(diǎn)亮的同時(shí),再在74HC595中移入第二行需要顯示的數(shù)據(jù),隨后將其鎖存,同時(shí)由行掃描控制電路將第一行掃描管關(guān)閉而接通第二行,使第二行LED管點(diǎn)亮,以此類推,當(dāng)?shù)谑袙呙柽^后再回到第一行,這樣,只要掃描速度足夠高,就可形成一幅完整的文字或圖像。
軟件設(shè)計(jì)流程圖
#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];
}
}
}
評(píng)論