一、概覽
芯片引腳定義如下,其中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 };
顯示效果如下,可加濾光片使顯示效果更加清晰。

