TM1640 8段*16位 數碼管驅動程序

概述

TM1640 是一種LED(發光二極管顯示器)驅動控制專用電路,內部集成有MCU 數字接口、數據鎖存器、LED 驅動等電路。本產品性能優良,質量可靠。主要應用於電子產品LED顯示屏驅動。採用SOP28的封裝形式。

特性說明

  1. 採用CMOS工藝
  2. 顯示模式(8 段×16 位)
  3. 輝度調節電路(佔空比 8 級可調)
  4. 兩線串行接口(SCLK,DIN)
  5. 振盪方式:內置RC 振盪
  6. 內置上電覆位電路
  7. 封裝形式:SOP28

管腳定義:

這裏寫圖片描述

注意,官方文檔顯示可以使用 共陰和共陰接線方式,實際使用當中請務必使用共陰極數碼管,不然程序很難控制.

這裏寫圖片描述

官方文檔下載

TM1640 PDF

驅動部分程序

#define WRITE_DATA_MODE_Z   0x40        // 地址自動加
#define WRITE_DATA_MODE_G   0x44        // 固定地址
#define START_DATA          0xC0        // 
#define DISPLAY_EN          0x8A        // 開顯示
#define DISPLAY_DIS         0x80        // 關顯示

// 端口定義
sbit SCLK   =   P2^7;
sbit DIO    =   P2^6;

unsigned char DisBuf[16];           // 顯示緩存

unsigned char code ch_table[]={
        0x3F,  //"0"
        0x06,  //"1"
        0x5B,  //"2"
        0x4F,  //"3"
        0x66,  //"4"
        0x6D,  //"5"
        0x7D,  //"6"
        0x07,  //"7"
        0x7F,  //"8"
        0x6F,  //"9"
        0x77,  //"A"
        0x7C,  //"B"
        0x39,  //"C"
        0x5E,  //"D"
        0x79,  //"E"
        0x71,  //"F"
        0x76,  //"H"
        0x38,  //"L"
        0x37,  //"n"
        0x3E,  //"u"
        0x73,  //"P"
        0x5C,  //"o"
        0x40,  //"-"
        0x00,  //熄滅
};

// 開始
void start()
{
    SCLK=1;
    _nop_();
    _nop_();
    DIO=1;
    _nop_();
    _nop_();
    DIO=0;
    _nop_();
    _nop_();
    SCLK=0;   
}

void send_data(unsigned char x)          //送數據    低位先傳
{
    unsigned char  i;
    for(i=0;i<8;i++)
    {
        SCLK=0;
        _nop_();
        _nop_();
        DIO=(bit)(x&0x01);
        _nop_();
        _nop_();
        SCLK=1;
        x>>=1;
    }
    SCLK=0;
}

// 結束
void stop()
{
    SCLK=0;
    DIO=0;
    SCLK=1;
    DIO=1;
}

void Init_Display()
{
    start();
    send_data(DISPLAY_DIS);         // 關顯示
    stop();

    start();
    send_data(WRITE_DATA_MODE_Z);   // 自動地址
    stop();

    start();
    send_data(0x8F);                // 開顯示
    stop();
}

void Update_Display(void)
{
    unsigned char i;

    if(Sys_Flag_B.Updata_Display_Flag)
    {
        Sys_Flag_B.Updata_Display_Flag = false;

        start();
        send_data(START_DATA);              //起始地址
        for(i=0;i<16;i++)                   //送16位數
        {
            send_data(DisBuf[i]);
        }
        stop();
    }
}

發送前需要轉碼,將 10進制 轉數碼管段碼
for(i=0; i<16; i++)
    DisBuf[i] = ch_table[n];



有問題,請留言…


end!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章