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 8段*16位 数码管驱动程序_第1张图片

注意,官方文档显示可以使用 共阴和共阴接线方式,实际使用当中请务必使用共阴极数码管,不然程序很难控制.

TM1640 8段*16位 数码管驱动程序_第2张图片

官方文档下载

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!

你可能感兴趣的:(单片机开发,电子技术)