TM1640数码管驱动芯片示例代码
1. 数码管基本知识
1.1 数码管分类
按显示段数分类,常用数码管分为七段和八段,如下图所示,八段比七段多一个小数点:
按内部发光二极管单元的连接方式分类:分为共阳极
和共阴极
共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极的数码管,共阳级数码管在应用时将公共极接到+5V(驱动方式:低电平亮,高电平不亮)。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极的数码管,共阴数码管在应用时应将公共极接到地线GND上(驱动方式:高电平亮,低电平不亮)。
1.2 数码管内部构造
下图(a)中的com引脚代表数码管公共级
1.3 数码管显示原理
从上面内容可以得知数码管其实就是由多个LED组成的,它们分别叫a,b,c,d,e,f,g,dp
,只要点亮这8个LED中的其中几个,就能达到显示数字的目的。
下图是数码管显示0-F
对应的编码:
2. TM1640数码管驱动时序+示例代码
TM1604有两种驱动时序,一种是地址自动加一,一种是固定地址模式,这里以地址自动加一模式为例:(具体时序参看TM1640官方手册,这里不做赘述)
下图中,GRID1-GRID16代表16个数码管,C0H-CFH代表16个数码管对应的地址,B0-B7代表数码管对应想要亮起的LED(a,b,c,d,e,f,g,第八位代表小数点)
共阴级驱动电路,显示数据表如下(七段和八段数码管)
//底层管脚驱动---主控为CMS8S6990
void hal_tm1640Init(void)
{
GPIO_SET_MUX_MODE(P04CFG, GPIO_MUX_GPIO); /*SCL*/
GPIO_ENABLE_OUTPUT(P0TRIS, GPIO_PIN_4);
P04 = 0;
GPIO_SET_MUX_MODE(P05CFG, GPIO_MUX_GPIO); /*SDA*/
GPIO_ENABLE_OD(P0TRIS, GPIO_PIN_5);
P05 = 0;
}
void hal_tm1640Delay(void)
{
u8 i;
for(i=0; i<10; i++);
_nop_();
}
void hal_tm1640I2cStart()
{
IIC_SCL=1;
hal_tm1640Delay();
IIC_SDA=1;
hal_tm1640Delay();
IIC_SDA=0;
hal_tm1640Delay();
}
void hal_tm1640I2cStop()
{
IIC_SCL=0;
hal_tm1640Delay();
IIC_SDA=0;
hal_tm1640Delay();
IIC_SCL=1;
hal_tm1640Delay();
IIC_SDA=1;
hal_tm1640Delay();
}
void hal_tm1640I2cSendByte(unsigned char dat)
{
u8 i,aa;
aa=dat;
for(i=0;i<8;i++)
{
IIC_SCL=0;
hal_tm1640Delay();
if(aa&0x01)
{
IIC_SDA=1;
}
else
{
IIC_SDA=0;
}
hal_tm1640Delay();
IIC_SCL=1;
aa>>=1;
}
}
//TM1640初始化,保证上电所有数码管LED为关闭状态(先清屏再写入)
void ajl_tm1640_init_test(void)
{
uint8_t i = 0;
hal_tm1640I2cStart();
hal_tm1640I2cSendByte(0x40); //地址自动加 1
hal_tm1640I2cStop();
hal_tm1640I2cStart();
hal_tm1640I2cSendByte(0xC0);
for(i = 0; i < 16; i++)
{
hal_tm1640I2cSendByte(0x00);
}
hal_tm1640I2cStop();
hal_tm1640I2cStart();
hal_tm1640I2cSendByte(0x80); //显示关:0X80
hal_tm1640I2cStop();
}
//在3个7段数码管上分别显示1 6 8
void ajl_tm1640_test(void)
{
hal_tm1640I2cStart();
hal_tm1640I2cSendByte(0x40); //地址自动加 1
hal_tm1640I2cStop();
hal_tm1640I2cStart();
hal_tm1640I2cSendByte(0xC0); //数码管写入起始地址
//连续写入3个数据
hal_tm1640I2cSendByte(0x06);// 1
hal_tm1640I2cSendByte(0x7D);// 6
hal_tm1640I2cSendByte(0x7F);// 8
hal_tm1640I2cStop();
hal_tm1640I2cStart();
hal_tm1640I2cSendByte(0x88); // 显示开:0X88 显示关:0X80
hal_tm1640I2cStop();
}