孫陳英
(江蘇省江陰中等專業(yè)學(xué)校,江蘇 江陰 214400)
LED點(diǎn)陣顯示屏因具有色彩鮮艷、功耗低、工作穩(wěn)定及亮度高等優(yōu)點(diǎn),被廣泛應(yīng)用與商場(chǎng)、公交站臺(tái)、銀行及車站等公共場(chǎng)所,可以動(dòng)態(tài)流水顯示各種各樣的字符、數(shù)字及漢字。本文選用8×8 LED點(diǎn)陣(1588BS)設(shè)計(jì)一塊可以顯示“Happy Birthday!”的顯示屏來取代蛋糕上的紙質(zhì)賀卡,實(shí)現(xiàn)由靜態(tài)到動(dòng)態(tài),由無光到有光的感官效果。
8×8 LED點(diǎn)陣是由64只發(fā)光二極管以8行、8列的形式呈現(xiàn),根據(jù)發(fā)光顏色可分為單色、雙色及三色。本文選用的1588BS是單色8×8 LED點(diǎn)陣,根據(jù)其內(nèi)部結(jié)構(gòu)可知,為使某一個(gè)LED點(diǎn)亮,只需讓其對(duì)應(yīng)的列送低電平,對(duì)應(yīng)的行送高電平即可。當(dāng)需要多個(gè)LED同時(shí)被點(diǎn)亮?xí)r,只需讓其對(duì)應(yīng)的行列根據(jù)LED點(diǎn)亮情況送相應(yīng)的高低電平。
點(diǎn)陣行列高低電平的輸入通過編寫程序來控制,程序的編寫要和電路原理圖相結(jié)合。對(duì)于單個(gè)8×8 LED點(diǎn)陣,其驅(qū)動(dòng)電路比較簡單,選用單片機(jī)最小系統(tǒng)電路,包括單片機(jī)芯片、晶振、復(fù)位及電源電路,同時(shí)用單片機(jī)的P0口加上拉電阻直接驅(qū)動(dòng)點(diǎn)陣的行,P2口直接驅(qū)動(dòng)點(diǎn)陣的列。為了便于仿真和調(diào)試,用PROTEUS仿真軟件繪制電路原理圖[1]。
分析字符在LED點(diǎn)陣的顯示原理,首先要分析字符的顯示代碼。字符的顯示通過動(dòng)態(tài)掃描顯示方式來實(shí)現(xiàn),掃描方式有行掃描和列掃描兩種。本文采用列掃描來分析顯示字符“H”的動(dòng)態(tài)掃描過程,字符H的點(diǎn)陣示意圖如圖1所示。
圖1 字符H的點(diǎn)陣示意圖
掃描第一列,只需給第一列送低電平,列輸入數(shù)據(jù)為01111111;根據(jù)字符“H”的字形,需要第一行至第七行的LED點(diǎn)亮;根據(jù)LED的顯示原理,行輸入數(shù)據(jù)讓需要點(diǎn)亮的LED所在行送高電平,無需點(diǎn)亮的送低電平,可以得出二進(jìn)制數(shù)據(jù)編碼為11111110;結(jié)合電路原理圖得知P0.0連接的是點(diǎn)陣第一行,而P0.7連接的是點(diǎn)陣第八行,所以將二進(jìn)制編碼轉(zhuǎn)換為十六進(jìn)制編碼為0x7F[2]。
按照此方法依次掃描其余幾列,可以得出字符H的數(shù)據(jù)編碼如表1所示。單片機(jī)反復(fù)重復(fù)掃描第一列至第八列,雖然是逐列掃描,逐列顯示,但是可以合理控制循環(huán)掃描的時(shí)間,利用人眼的視覺滯留效應(yīng),看到的是各列同時(shí)點(diǎn)亮,出現(xiàn)一個(gè)完整的字符H。
按照此方法可以分析得出所有字符的數(shù)據(jù)編碼,但是一般在多個(gè)字符取碼中,為了提高效率,常采用取模軟件來進(jìn)行取碼。經(jīng)取模軟件取碼得出“Happy Birthday!”中所有字符的編碼。
表1 H字符點(diǎn)陣數(shù)據(jù)編碼
在分析得出各個(gè)字符數(shù)據(jù)編碼的基礎(chǔ)上,點(diǎn)陣行列高低電平的輸入需要通過編寫程序來實(shí)現(xiàn)[3],下面是動(dòng)態(tài)流水顯示“Happy Birthday!”的程序編寫。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar time,yw,i;
uchar code dat[]={
0x7F,0x08,0x08,0x08,0x7F, // -H-
0x24,0x54,0x54,0x38,0x40, // -a-
0xFC,0x24,0x24,0x24,0x18, // -p-
0xFC,0x24,0x24,0x24,0x18, // -p-
0x9C,0xA0,0xA0,0x90,0x7C, // -y-
0x00,0x00,0x00,0x00,0x00, // - -
0x7F,0x49,0x49,0x49,0x36, // -B-
0x00,0x00,0x79,0x00,0x00, // -i-
0x04,0x78,0x04,0x04,0x08, // -r-
0x04,0x3F,0x44,0x44,0x24, // -t-
0x7F,0x08,0x04,0x04,0x78, // -h-
0x38,0x44,0x44,0x28,0x7F, // -d-
0x24,0x54,0x54,0x38,0x40, // -a-
0x9C,0xA0,0xA0,0x90,0x7C, // -y-
0x00,0x00,0x5F,0x00,0x00, // -!-
0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0x00,0x00,0x00, // - -
};
void delay(uint x)// 延遲函數(shù)結(jié)束
{
uint i,j; // 聲明變量
for(i=0;i<x;i++) // 外循環(huán) xms
for(j=0;j<10;j++); // 內(nèi)循環(huán) 1ms
}
void INit()
{
TMOD|=0x01;//定時(shí)器0 模式1 16位定時(shí)模式
TH0=(65536-10000)/256;//定時(shí)10.000ms
TL0=(65536-10000)%256;
ET0=TR0=EA=1;//定時(shí)器開始計(jì)數(shù)
}
main () // 主程序開始
{ // 聲明變量
INit();
while(1) // 無窮循環(huán)
{
for(i=0;i<8;i++) // 掃描 8 列
{
P2=~(0x01<<i);// 掃描第一列
P0=dat [i+yw];// 輸出行數(shù)據(jù)
delay(1); // 延遲 1ms
P0=0x00;//清影
} // 掃描8列 (i循環(huán))結(jié)束
}
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;//10.000ms 進(jìn)入一次中斷
TL0=(65536-10000)%256;
time++;
if(time==10)//到100.000ms時(shí)間加以實(shí)現(xiàn)移動(dòng) 用于控制移動(dòng)速度
{
time=0;
yw++;
if(yw>80)yw=0;
}
}
將程序編譯完成后生成HEX文件,下載至單片機(jī),打開PROTEUS仿真軟件運(yùn)行后即可以看到動(dòng)態(tài)流水顯示“Happy Birthday!”。
文中以AT89S52芯片為硬件基礎(chǔ),完成了8×8 LED點(diǎn)陣顯示字符的的硬件和軟件設(shè)計(jì)。仿真效果表明,該方案有效可行。其中編寫單片機(jī)驅(qū)動(dòng)點(diǎn)陣程序來顯示字符是學(xué)習(xí)8×8 LED點(diǎn)陣的要點(diǎn)。