7.3點(diǎn)陣的初步認(rèn)識(shí)
點(diǎn)陣LED顯示屏作為一種現(xiàn)代電子媒體,具有靈活的顯示面積(可任意分割和拼裝)、高亮度、長(zhǎng)壽命、數(shù)字化、實(shí)時(shí)性等特點(diǎn),應(yīng)用非常廣泛。
通過(guò)學(xué)習(xí)LED小燈和LED數(shù)碼管后,再學(xué)習(xí)LED點(diǎn)陣就要輕松得多了。一個(gè)數(shù)碼管是8個(gè)LED組成,同理,一個(gè)8*8的點(diǎn)陣就是由64個(gè)LED小燈組成。圖7-1就是一個(gè)點(diǎn)陣LED最小單元,即一個(gè)8*8的點(diǎn)陣LED,圖7-2是它的內(nèi)部結(jié)構(gòu)原理圖。
圖7-1 8*8LED點(diǎn)陣外觀
圖7-2 8*8點(diǎn)陣結(jié)構(gòu)原理圖
從圖7-2上可以看出,其實(shí)點(diǎn)陣LED點(diǎn)亮原理還是很簡(jiǎn)單的。在圖中大方框外側(cè)的就是點(diǎn)陣LED的引腳號(hào),左側(cè)的8個(gè)引腳是接的內(nèi)部LED的陽(yáng)極,上側(cè)的8個(gè)引腳接的是內(nèi)部LED的陰極。那么如果把9腳置成高電平、13腳置成低電平的話,左上角的那個(gè)LED小燈就會(huì)亮了。下面就用程序來(lái)實(shí)現(xiàn)一下,特別注意,控制點(diǎn)陣左側(cè)引腳的74HC138是原理圖上的U4,8個(gè)引腳自上而下依次由U4的Y0~Y7輸出來(lái)控制。
#include
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
ENLED = 0; //U3、U4兩片74HC138總使能
ADDR3 = 0; //使能U4使之正常輸出
ADDR2 = 0; //經(jīng)U4的Y0輸出開(kāi)啟三極管Q10
ADDR1 = 0;
ADDR0 = 0;
LED = 0; //向P0.0寫(xiě)入0來(lái)點(diǎn)亮左上角的一個(gè)點(diǎn)
while(1); //程序停止在這里
}
同樣的方法,通過(guò)對(duì)P0的整體賦值可以一次點(diǎn)亮點(diǎn)陣的一行,這次用程序來(lái)點(diǎn)亮點(diǎn)陣的第二行,對(duì)應(yīng)的就需要編號(hào)U4的74HC138在其Y1引腳輸出低電平了。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
ENLED = 0; //U3、U4兩片74HC138總使能
ADDR3 = 0; //使能U4使之正常輸出
ADDR2 = 0; //經(jīng)U4的Y1輸出開(kāi)啟三極管Q11
ADDR1 = 0;
ADDR0 = 1;
P0 = 0x00; //向P0寫(xiě)入0來(lái)點(diǎn)亮一行
while(1); //程序停止在這里
}
從這里可以逐步發(fā)現(xiàn)點(diǎn)陣的控制原理了。前面講了一個(gè)數(shù)碼管就是8個(gè)LED小燈,一個(gè)點(diǎn)陣是64個(gè)LED小燈。同樣的道理,還可以把一個(gè)點(diǎn)陣?yán)斫獬墒?個(gè)數(shù)碼管。經(jīng)過(guò)前面的學(xué)習(xí)已經(jīng)掌握了6個(gè)數(shù)碼管同時(shí)顯示的方法,那8個(gè)數(shù)碼管也應(yīng)該輕輕松松了。下面就利用定時(shí)器中斷和數(shù)碼管動(dòng)態(tài)顯示的原理來(lái)把這個(gè)點(diǎn)陣全部點(diǎn)亮。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
EA = 1; //使能總中斷
ENLED = 0; //使能U4,選擇LED點(diǎn)陣
ADDR3 = 0; //因?yàn)樾枰獎(jiǎng)討B(tài)改變ADDR0-2的值,所以不需要再初始化了
TMOD = 0x01; //設(shè)置T0為模式1
TH0 = 0xFC; //為T(mén)0賦初值0xFC67,定時(shí)1ms
TL0 = 0x67;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動(dòng)T0
while (1); //程序停在這里,等待定時(shí)器中斷
}
/* 定時(shí)器0中斷服務(wù)函數(shù) */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //動(dòng)態(tài)掃描的索引
TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
//以下代碼完成LED點(diǎn)陣動(dòng)態(tài)掃描刷新
P0 = 0xFF; //顯示消隱
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0x00; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=0x00; break;
default: break;
}
}
7.4點(diǎn)陣的圖形顯示
LED小燈可以實(shí)現(xiàn)流水燈,數(shù)碼管可以顯示多位數(shù)字,點(diǎn)陣LED可以顯示一些花樣。要顯示花樣,往往要先做出一些小圖形,這些小圖形的數(shù)據(jù)要轉(zhuǎn)換到程序當(dāng)中,這時(shí)就需要取模軟件。給大家介紹一款簡(jiǎn)單的取模軟件,這種取模軟件在網(wǎng)上都可以下載到,其操作界面如圖7-3所示。
圖7-3 ?字模提取軟件界面
單擊“新建圖像”菜單,根據(jù)開(kāi)發(fā)板上的點(diǎn)陣,把寬度和高度分別改成8,然后點(diǎn)擊“確定”,如圖7-4所示。
圖7-4 ?新建圖形
單擊左側(cè)的“模擬動(dòng)畫(huà)”菜單,再點(diǎn)擊“放大格點(diǎn)”選項(xiàng),一直放大到最大,那就可以在8*8的點(diǎn)陣圖形中用鼠標(biāo)填充黑點(diǎn)畫(huà)圖形了,如圖7-5所示。
圖7-5 ?字模提取軟件畫(huà)圖
經(jīng)過(guò)一番精心設(shè)計(jì),畫(huà)出來(lái)一個(gè)心形圖形,并且填充滿,最終出現(xiàn)想要的效果圖,如圖7-6所示。
圖7-6 ?心型圖形
由于取模軟件是把黑色取為1,白色取為0,但點(diǎn)陣是1對(duì)應(yīng)LED熄滅,0對(duì)應(yīng)LED點(diǎn)亮,而這里需要的是一顆點(diǎn)亮的“心”,所以要選“修改圖像”菜單里的“黑白反顯圖像”這個(gè)選項(xiàng),再點(diǎn)擊“基本操作”菜單里邊的“保存圖像”可以把設(shè)計(jì)好的圖片進(jìn)行保存,如圖7-7所示。
圖7-7 ?保存圖形
保存文件只是為了再次使用或修改使方便,當(dāng)然也可以不保存。操作完了這一步后,點(diǎn)擊“參數(shù)設(shè)置”菜單里的“其他選項(xiàng)”,如圖7-8所示。
圖7-8 ?選項(xiàng)設(shè)置
這里的選項(xiàng),要結(jié)合圖7-2來(lái)進(jìn)行設(shè)置,可以看到P0口控制的是一行,所以選擇“橫向取模”,如果控制的是一列,就要選“縱向取?!薄_x中“字節(jié)倒序”這個(gè)選項(xiàng),是因?yàn)閳D7-2中左邊是低位DB0,右邊是高位DB7,所以是字節(jié)倒序,其它兩個(gè)選項(xiàng)自己了解,點(diǎn)確定后,選擇“取模方式”這個(gè)菜單,點(diǎn)一下“C51格式”后,在“點(diǎn)陣生成區(qū)”自動(dòng)產(chǎn)生了8個(gè)字節(jié)的數(shù)據(jù),這8個(gè)字節(jié)的數(shù)據(jù)就是取出來(lái)的“?!?,如圖7-9所示。
圖7-9 ?取模結(jié)果
大家注意,雖然用了軟件來(lái)取模,但是也得知道其原理是什么,在這個(gè)圖片里,黑色的一個(gè)格子表示一位二進(jìn)制的1,白色的一個(gè)格子表示一位二進(jìn)制的0。第一個(gè)字節(jié)是0xFF,其實(shí)就是這個(gè)8*8圖形的第一行,全黑就是0xFF;第二個(gè)字節(jié)是0x99,低位在左邊,高位在右邊,黑色的表示1,白色的表示0,就組成了0x99這個(gè)數(shù)值。
那么下面就用程序把這些數(shù)據(jù)依次送到點(diǎn)陣上去,看看運(yùn)行效果如何。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code image[] = { //圖片的字模表
0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7
};
void main()
{
EA = 1; //使能總中斷
ENLED = 0; //使能U4,選擇LED點(diǎn)陣
ADDR3 = 0;
TMOD = 0x01; //設(shè)置T0為模式1
TH0 = 0xFC; //為T(mén)0賦初值0xFC67,定時(shí)1ms
TL0 = 0x67;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動(dòng)T0
while (1);
}
/* 定時(shí)器0中斷服務(wù)函數(shù) */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //動(dòng)態(tài)掃描的索引
TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
//以下代碼完成LED點(diǎn)陣動(dòng)態(tài)掃描刷新
P0 = 0xFF; //顯示消隱
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[5]; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[6]; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[7]; break;
default: break;
}
}
對(duì)于8*8的點(diǎn)陣,可以顯示一些簡(jiǎn)單的圖形,字符等。但大部分漢字通常要用到16*16個(gè)點(diǎn),8*8的點(diǎn)陣只能顯示一些簡(jiǎn)單筆畫(huà)的漢字。使用大屏顯示漢字的方法和小屏的方法是類似的,所需要做的只是按照相同的原理來(lái)擴(kuò)展行數(shù)和列數(shù)而已。
審核編輯 黃宇
-
led
+關(guān)注
關(guān)注
243文章
24447瀏覽量
687613
發(fā)布評(píng)論請(qǐng)先 登錄
第7章 變量進(jìn)階與點(diǎn)陣LED(7.1 7.2)
FZH367 具有獨(dú)立自動(dòng)呼吸功能的LED(12×16)點(diǎn)陣驅(qū)動(dòng)芯片 原廠技術(shù)支持
原廠 FZH365 具有獨(dú)立自動(dòng)呼吸功能的LED(12×12)點(diǎn)陣驅(qū)動(dòng)芯片
原廠 FZH364 一款8×8點(diǎn)陣恒流LED驅(qū)動(dòng)芯片
第2章 點(diǎn)亮你的LED(2.5)
第2章 點(diǎn)亮你的LED(2.3 2.4)
第2章 點(diǎn)亮你的LED
Texas Instruments TPS92402 LED點(diǎn)陣控制器數(shù)據(jù)手冊(cè)
Texas Instruments TPS92401 LED點(diǎn)陣控制器數(shù)據(jù)手冊(cè)
RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法
RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用
單片機(jī)外圍電路設(shè)計(jì) (第2版)
RK3568驅(qū)動(dòng)指南|第三篇-并發(fā)與競(jìng)爭(zhēng)-第19章 并發(fā)與競(jìng)爭(zhēng)實(shí)驗(yàn)
點(diǎn)陣數(shù)碼管驅(qū)動(dòng)抗干擾數(shù)顯數(shù)碼管芯片VK1616
VK1618 SOP18/DIP18抗干擾LED數(shù)碼管驅(qū)動(dòng)/點(diǎn)陣LED驅(qū)動(dòng)控制專用芯片

第7章 變量進(jìn)階與點(diǎn)陣LED(7.3 7.4)
評(píng)論