1 簡介
TM1602作為數(shù)碼管顯示的專用電路,可以簡化電路設(shè)計以及節(jié)約MCU的引腳資源损姜。通過串行將數(shù)據(jù)寫入芯片饰剥,由芯片完成動態(tài)掃描顯示。TM1602兩種工作模式摧阅,六位八段和七位八段(上電默認(rèn))汰蓉,下面例子中設(shè)置為六位八段,地址自增模式棒卷。這里詳細(xì)不再介紹顾孽,具體可以參閱數(shù)據(jù)手冊。
2 詳細(xì)驅(qū)動代碼
代碼是基于C8051單片機比规,以下代碼可以直接使用若厚,只需要添加引腳的定義即可。
#define TM1620_Mode_6_8 0x02//設(shè)置顯示模式蜒什,6位8段--上電默認(rèn)是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//關(guān)顯示
#define TM1620_Pulse_1 0X00//設(shè)置脈沖寬度為 1/16
#define TM1620_Pulse_2 0X01//設(shè)置脈沖寬度為 2/16
#define TM1620_Pulse_4 0X02//設(shè)置脈沖寬度為 4/16
#define TM1620_Pulse_10 0X03//設(shè)置脈沖寬度為 10/16
#define TM1620_Pulse_11 0X04//設(shè)置脈沖寬度為 11/16
#define TM1620_Pulse_12 0X05//設(shè)置脈沖寬度為 12/16
#define TM1620_Pulse_13 0X06//設(shè)置脈沖寬度為 13/16
#define TM1620_Pulse_14 0X07//設(shè)置脈沖寬度為 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);//設(shè)置1620為六位八段顯示模式
TM1620_STB_1;
TM1620_WriteData(TM1620_AddrAutoAdd);//設(shè)置地址自動+1
TM1620_STB_1;
TM1620_WriteData(TM1620_00H);//設(shè)置地址
}
//輸入?yún)?shù)為脈沖寬度吃谣,用來控制顯示亮度
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;
}
//輸入顯示數(shù)據(jù)乞封,和數(shù)據(jù)長度
void Display(uchar *datas, uchar len)
{
uchar i;
uchar temp = len;
while(temp > 0)
{
TM1620_Init();
//顯示數(shù)據(jù)正好為6
if(temp == 6)
{
for(i = 0; i < 6; i++)
{
TM1620_WriteData(datas[6-i-1]);
TM1620_WriteData(0x00);
}
break;
}
//顯示數(shù)據(jù)小于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;
}
//顯示數(shù)據(jù)長度大于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);
}