TM1629A LED驅動控制專用電路 51驅動


一、概覽

  芯片引腳定義如下,其中GRID1~GRID8驅動共陰極數碼管的COM端,但不知道為何用GRID表示,GRID一般指的是VFD顯示器的柵極。SEG1~SEG16驅動數碼管的各個段。

  從數據手冊中可以了解到TM1629A采用SPI接口,可以驅動8位16段的LED數碼管,如下所示。

  這里采用的是用於電梯的數碼管顯示器,總共有17段,因此在設計電路時,將不常用的逗號和箭頭指示符用短接線隔開,根據實際使用需要焊接。

 

 二、芯片指令

  在STB下降沿后由DIN輸入的第一個字節作為指令,可分為數據命令、顯示控制命令和地址命令。

    1.數據命令設置格式

     高位為01,低位不同以區分不同的數據命令。在C程序中設置宏定義:

#define AUTO_ADDR_INC 2 //自動地址增加
#define FIXED_ADDR 4 //固定地址

     2.顯示命令設置格式

     高位為10,低位不同以區分不同的顯示命令,顯示命令用於設置顯示亮度、顯示打開或關閉。消光數量即驅動波形的占空比。

#define DISP_DIM 0
#define DISP_MID 3
#define DISP_BRT 6

#define DISP_OFF 9

    因為個人應用不需要連續切換占空比,這里僅定義幾個常用的即可。

    3.地址命令設置格式

     該命令用於固定地址時,設置數據的寫入地址。寫入數據的地址表如下,設置數據命令為固定地址后,先寫入顯示緩存地址,再寫入顯示數據,即可更改某一具體地址的緩存內容,從而更改顯示效果。

從下面的地址表可以知道,TM1629A的16段分別與兩個字節的數據對應,因此要在數碼管上顯示一個數字,就必須寫入兩個字節的數據。

 三、SPI時序及軟件模擬

   首先設置各數據線的電平,CLK和SPI均為高,在STB下降沿后,由DIN在CLK的同步下將數據串行輸入至芯片緩存。

void TM1629A_Init(void){
    CLK = 1;
    STB = 1;
    delay_us(100);
    STB = 0;
}

void TM1629A_WriteData(u8 dat){
    u8 i;
    STB = 0;
    delay(100);
    for(i = 0; i < 8; i++){
    CLK = 0;
    delay_us(100);
    if((dat >> i) & 0x01)
        DIN = 1;
    else
        DIN = 0;
    delay(100);
    CLK = 1;
    delay_us(100);
    }
}

 四、用戶代碼(方便后續調用)

  1.第一字節指令設置函數

void TM1629A_SetCommand(u8 cmd){
    STB = 0;
    switch(cmd){
        case AUTO_ADDR_INC:{
            TM1629A_WriteData(0x40); //自動地址增加
            break;
        }
        case FIXED_ADDR:{
            TM1629A_WriteData(0x44); //固定地址
            break;
        }
        case DISP_DIM:{
            TM1629A_WriteData(0x88 | DISP_DIM); //顯示最暗
            break;
        }
        case DISP_MID:{
            TM1629A_WriteData(0x88 | DISP_MID); //顯示亮度中等
            break;
        }
        case DISP_BRT :{
            TM1629A_WriteData(0x88 | DISP_BRT); //顯示最亮
            break;
        }
        case DISP_OFF :{
            TM1629A_WriteData(0x80); //關閉顯示
            break;
        }
        default:break;
    }
    STB = 1;
}

  2.設置地址,TM1629A的顯示緩存地址為0xc0~0xcf,為與數碼管的位相對應,在位的基礎上加0xc0即可:

void TM1629A_SetAddr(u8 addr){
    TM1629A_WriteData(0xc0 + addr);
}

  3.清屏函數,使用自動地址增加方式寫入數據。根據數據手冊的建議添加,避免上電后的顯示亂碼。

void TM1629A_Disp_clr(void){
    u8 i;
    TM1629A_SetCommand(AUTO_ADDR_INC);
    STB = 0;
    TM1629A_SetAddr(0);
    for(i = 0;i < 8;i ++){
        TM1629A_WriteData(0X00);
        TM1629A_WriteData(0X00);
    }
    STB = 1;
}

  4.任意位寫入數據函數,使用固定地址方式寫入數據。其中digi是數碼管的位,num是要顯示的數字,0~9有效。

void TM1629A_DispNum(u8 digi, u8 num){    
    STB = 0;
    TM1629A_SetAddr(digi * 2);
    TM1629A_WriteData(number[num * 2]);
    STB = 1;
    
    STB = 0;
    TM1629A_SetAddr(digi * 2 + 1);
    TM1629A_WriteData(number[num * 2 + 1]);
    STB = 1;
}

五、參考數字碼表 

u8 code number[] = {
    0x53,0x22,    //0
    0x50,0x00,    //1
    0x91,0x23,    //2
    0xd1,0x03,    //3
    0xd2,0x01,    //4
    0xc3,0x03,    //5
    0xc3,0x23,    //6
    0x51,0x00,    //7
    0xd3,0x23,    //8
    0xd3,0x03     //9
};

 

顯示效果如下,可加濾光片使顯示效果更加清晰。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM