TM1602使用简介(C8051)

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);
}

如果对您有所帮助请给在下点个赞

你可能感兴趣的:(TM1602使用简介(C8051))