1 简介
TM1602作为数码管显示的专用电路,可以简化电路设计以及节约MCU的引脚资源。通过串行将数据写入芯片,由芯片完成动态扫描显示。TM1602两种工作模式,六位八段和七位八段(上电默认),下面例子中设置为六位八段,地址自增模式。这里详细不再介绍,具体可以参阅数据手册。
2 详细驱动代码
代码是基于C8051单片机,以下代码可以直接使用,只需要添加引脚的定义即可。
#define TM1620_Mode_6_8 0x02//设置显示模式,6位8段--上电默认是7段8段
#define TM1620_AddrAutoAdd 0x40//写显示,自动累加地址
#define TM1620_AddrFixed 0x44//写显示,固定地址
#define TM1620_00H 0xC0//地址00H
#define TM1620_01H 0xC1//地址01H
#define TM1620_02H 0xC2//地址02H
#define TM1620_03H 0xC3//地址03H
#define TM1620_04H 0xC4//地址04H
#define TM1620_05H 0xC5//地址05H
#define TM1620_06H 0xC6//地址06H
#define TM1620_07H 0xC7//地址07H
#define TM1620_08H 0xC8//地址08H
#define TM1620_09H 0xC9//地址09H
#define TM1620_0AH 0xCA//地址0AH
#define TM1620_0BH 0xCB//地址0BH
#define TM1620_OpenDis 0x88//开显示
#define TM1620_CloseDis 0x80//关显示
#define TM1620_Pulse_1 0X00//设置脉冲宽度为 1/16
#define TM1620_Pulse_2 0X01//设置脉冲宽度为 2/16
#define TM1620_Pulse_4 0X02//设置脉冲宽度为 4/16
#define TM1620_Pulse_10 0X03//设置脉冲宽度为 10/16
#define TM1620_Pulse_11 0X04//设置脉冲宽度为 11/16
#define TM1620_Pulse_12 0X05//设置脉冲宽度为 12/16
#define TM1620_Pulse_13 0X06//设置脉冲宽度为 13/16
#define TM1620_Pulse_14 0X07//设置脉冲宽度为 14/16
//串行输入要显示的字符
void TM1620_WriteData(uchar dat)
{
uchar i ;
TM1620_STB_0;
delay_us(5);
for(i = 0; i < 8; i++)
{
TM1620_CLK_0;
if(dat & 0x01)
{
TM1620_DIN_1;
}
else
{
TM1620_DIN_0;
}
dat >>= 1;
TM1620_CLK_1;
TM1620_CLK_0;
}
}
//初始化
void TM1620_Init(void)
{
TM1620_STB_1;
TM1620_CLK_1;
TM1620_DIN_1;
TM1620_WriteData(TM1620_Mode_6_8);//设置1620为六位八段显示模式
TM1620_STB_1;
TM1620_WriteData(TM1620_AddrAutoAdd);//设置地址自动+1
TM1620_STB_1;
TM1620_WriteData(TM1620_00H);//设置地址
}
//输入参数为脉冲宽度,用来控制显示亮度
void TM1620_OpenDisplay(uchar pulseWidth)
{
TM1620_STB_1;
TM1620_WriteData(TM1620_OpenDis | pulseWidth);
delay_us(5);
TM1620_CLK_0;
}
void TM1620_CloseDisplay(void)
{
TM1620_STB_1;
TM1620_WriteData(TM1620_CloseDis);
delay_us(5);
TM1620_CLK_0;
}
//输入显示数据,和数据长度
void Display(uchar *datas, uchar len)
{
uchar i;
uchar temp = len;
while(temp > 0)
{
TM1620_Init();
//显示数据正好为6
if(temp == 6)
{
for(i = 0; i < 6; i++)
{
TM1620_WriteData(datas[6-i-1]);
TM1620_WriteData(0x00);
}
break;
}
//显示数据小于6位
else if(temp < 6)
{
for(i = 0; i < 6; i++)
{
if(i < 6- temp)
{
TM1620_WriteData(0x00);
TM1620_WriteData(0x00);
continue;
}
TM1620_WriteData(datas[6-i-1]);
TM1620_WriteData(0x00);
}
break;
}
//显示数据长度大于6位,先显示前六位,1秒后显示剩下部分。依次类推。
else
{
for(i = 0; i < 6; i++)
{
TM1620_WriteData(datas[6-i-1]);
TM1620_WriteData(0x00);
}
datas += LEN_Seg;
temp -= LEN_Seg;
}
TM1620_OpenDisplay(TM1620_Pulse_10);
delay_s(1);
}
TM1620_OpenDisplay(TM1620_Pulse_10);
}