1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: 第7章 變量進階與點陣LED7.3 7.4 [打印本頁]

作者: 卓然塵世間    時間: 2026-4-3 13:07
標題: 第7章 變量進階與點陣LED7.3 7.4
7.3點陣的初步認識
        點陣LED顯示屏作為一種現代電子媒體,具有靈活的顯示面積(可任意分割和拼裝)、高亮度、長壽命、數字化、實時性等特點,應用非常廣泛。
通過學習LED小燈和LED數碼管后,再學習LED點陣就要輕松得多了。一個數碼管是8個LED組成,同理,一個8*8的點陣就是由64個LED小燈組成。圖7-1就是一個點陣LED最小單元,即一個8*8的點陣LED,圖7-2是它的內部結構原理圖。

圖7-1  8*8LED點陣外觀

圖7-2  8*8點陣結構原理圖
        從圖7-2上可以看出,其實點陣LED點亮原理還是很簡單的。在圖中大方框外側的就是點陣LED的引腳號,左側的8個引腳是接的內部LED的陽極,上側的8個引腳接的是內部LED的陰極。那么如果把9腳置成高電平、13腳置成低電平的話,左上角的那個LED小燈就會亮了。下面就用程序來實現一下,特別注意,控制點陣左側引腳的74HC138是原理圖上的U4,8個引腳自上而下依次由U4的Y0~Y7輸出來控制。
#include <reg52.h>

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;   //經U4的Y0輸出開啟三極管Q10
    ADDR1 = 0;
    ADDR0 = 0;
    LED = 0;      //向P0.0寫入0來點亮左上角的一個點
    while(1);     //程序停止在這里
}
同樣的方法,通過對P0的整體賦值可以一次點亮點陣的一行,這次用程序來點亮點陣的第二行,對應的就需要編號U4的74HC138在其Y1引腳輸出低電平了。
#include <reg52.h>

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;   //經U4的Y1輸出開啟三極管Q11
    ADDR1 = 0;
    ADDR0 = 1;
    P0 = 0x00;    //向P0寫入0來點亮一行
    while(1);     //程序停止在這里
}
        從這里可以逐步發現點陣的控制原理了。前面講了一個數碼管就是8個LED小燈,一個點陣是64個LED小燈。同樣的道理,還可以把一個點陣理解成是8個數碼管。經過前面的學習已經掌握了6個數碼管同時顯示的方法,那8個數碼管也應該輕輕松松了。下面就利用定時器中斷和數碼管動態顯示的原理來把這個點陣全部點亮。
#include <reg52.h>

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點陣
    ADDR3 = 0;    //因為需要動態改變ADDR0-2的值,所以不需要再初始化了
    TMOD = 0x01;  //設置T0為模式1
    TH0  = 0xFC;  //為T0賦初值0xFC67,定時1ms
    TL0  = 0x67;
    ET0  = 1;      //使能T0中斷
    TR0  = 1;      //啟動T0
    while (1);    //程序停在這里,等待定時器中斷
}
/* 定時器0中斷服務函數 */
void InterruptTimer0() interrupt 1
{
    static unsigned char i = 0;  //動態掃描的索引

    TH0 = 0xFC;  //重新加載初值
    TL0 = 0x67;
    //以下代碼完成LED點陣動態掃描刷新
    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 點陣的圖形顯示
        LED小燈可以實現流水燈,數碼管可以顯示多位數字,點陣LED可以顯示一些花樣。要顯示花樣,往往要先做出一些小圖形,這些小圖形的數據要轉換到程序當中,這時就需要取模軟件。給大家介紹一款簡單的取模軟件,這種取模軟件在網上都可以下載到,其操作界面如圖7-3所示。

圖7-3  字模提取軟件界面
        單擊“新建圖像”菜單,根據開發板上的點陣,把寬度和高度分別改成8,然后點擊“確定”,如圖7-4所示。

圖7-4  新建圖形
        單擊左側的“模擬動畫”菜單,再點擊“放大格點”選項,一直放大到最大,那就可以在8*8的點陣圖形中用鼠標填充黑點畫圖形了,如圖7-5所示。

圖7-5  字模提取軟件畫圖
        經過一番精心設計,畫出來一個心形圖形,并且填充滿,最終出現想要的效果圖,如圖7-6所示。

圖7-6  心型圖形
        由于取模軟件是把黑色取為1,白色取為0,但點陣是1對應LED熄滅,0對應LED點亮,而這里需要的是一顆點亮的“心”,所以要選“修改圖像”菜單里的“黑白反顯圖像”這個選項,再點擊“基本操作”菜單里邊的“保存圖像”可以把設計好的圖片進行保存,如圖7-7所示。

圖7-7  保存圖形
        保存文件只是為了再次使用或修改使方便,當然也可以不保存。操作完了這一步后,點擊“參數設置”菜單里的“其他選項”,如圖7-8所示。

圖7-8  選項設置
        這里的選項,要結合圖7-2來進行設置,可以看到P0口控制的是一行,所以選擇“橫向取模”,如果控制的是一列,就要選“縱向取!薄_x中“字節倒序”這個選項,是因為圖7-2中左邊是低位DB0,右邊是高位DB7,所以是字節倒序,其它兩個選項自己了解,點確定后,選擇“取模方式”這個菜單,點一下“C51格式”后,在“點陣生成區”自動產生了8個字節的數據,這8個字節的數據就是取出來的“模”,如圖7-9所示。

圖7-9  取模結果
        大家注意,雖然用了軟件來取模,但是也得知道其原理是什么,在這個圖片里,黑色的一個格子表示一位二進制的1,白色的一個格子表示一位二進制的0。第一個字節是0xFF,其實就是這個8*8圖形的第一行,全黑就是0xFF;第二個字節是0x99,低位在左邊,高位在右邊,黑色的表示1,白色的表示0,就組成了0x99這個數值。
        那么下面就用程序把這些數據依次送到點陣上去,看看運行效果如何
#include <reg52.h>

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點陣
    ADDR3 = 0;
    TMOD = 0x01;  //設置T0為模式1
    TH0  = 0xFC;  //為T0賦初值0xFC67,定時1ms
    TL0  = 0x67;
    ET0  = 1;     //使能T0中斷
    TR0  = 1;     //啟動T0
    while (1);
}
/* 定時器0中斷服務函數 */
void InterruptTimer0() interrupt 1
{
    static unsigned char i = 0;  //動態掃描的索引

    TH0 = 0xFC;  //重新加載初值
    TL0 = 0x67;
    //以下代碼完成LED點陣動態掃描刷新
    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;
    }
}
        對于8*8的點陣,可以顯示一些簡單的圖形,字符等。但大部分漢字通常要用到16*16個點,8*8的點陣只能顯示一些簡單筆畫的漢字。使用大屏顯示漢字的方法和小屏的方法是類似的,所需要做的只是按照相同的原理來擴展行數和列數而已。





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1