宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

TM1621是一个多功能的LCD驱动器,带有蜂鸣器驱动功能。通讯采用四线串行接口

TM1621的难点在于字节序和显存跟屏幕的映射关系上,下面是写寄存器的代码

void Delay_usuint8_t us)
{ uint16_t i = 0,z = 0;
    fori = 0; i < us; i++)
    {
        forz = 0; z < 50; z++);
    }
}

/**************************************************************************************
* FunctionName   : TM1621_SendBitMsb)
* Description    : 发送发送多位[高位在前]
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void TM1621_SendBitMsbuint8_t dat, uint8_t cnt)
{
    for uint8_t i=0; i<cnt; i++)
    {
        dat & 0x80) ?  TM1621_DATA_HIG) :
                        TM1621_DATA_LOW);

        dat <<= 1;
        TM1621_WR_LOW);
        Delay_us3);
        TM1621_WR_HIG);
    }
}

/**************************************************************************************
* FunctionName   : TM1621_SendBitLsb)
* Description    : 发送多位[低位在前]
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void TM1621_SendBitLsbuint8_t dat, uint8_t cnt)
{
    for uint8_t i=0; i<cnt; i++)
    {
        dat & 0x01) ?  TM1621_DATA_HIG) :
                       TM1621_DATA_LOW);

        dat >>= 1;
        TM1621_WR_LOW);
        Delay_us3);
        TM1621_WR_HIG);
    }
}

/**************************************************************************************
* FunctionName   : TM1621_SendCmd)
* Description    : 发送命令
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void TM1621_SendCmduint8_t cmd)
{
    TM1621_CS_LOW);
    TM1621_SendBitMsb0x80, 3);                                                     // 前面3位命令代码
    TM1621_SendBitMsbcmd, 9);                                                      // 后面10位: a5~a0[RAM地址]+d3~d0[RAM数据]
    TM1621_CS_HIG);
}

/**************************************************************************************
* FunctionName   : HTBSendNDat)
* Description    : 发送N数据
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void TM1621_SendNDatuint8_t addr, uint8_t *pDat, uint8_t cnt, uint8_t bitNum)
{
    TM1621_CS_LOW);
    TM1621_SendBitMsb0xA0, 3);                                                    // 前面3位命令代码
    TM1621_SendBitMsbaddr<<2, 6);                                                 // a5~a0[RAM地址]

    for uint8_t i=0; i<cnt; i++)
    {        
            TM1621_SendBitMsb*pDat++, bitNum);   // RAM数据
    }
    TM1621_CS_HIG);
}



/**
  * @brief  TM1621 Write CMD.
  * @param  cmd 指向写入的命令.
  * @return void
  */
void TM1621_Write_CMDuint8_t cmd)
{
        TM1621_CS_LOW);
    TM1621_SendBitMsb0x80, 4);                                                    // 前面3位命令代码
    TM1621_SendBitMsbcmd, 8);                                                 // a5~a0[RAM地址]
    TM1621_CS_HIG);
}

有了写寄存器的代码以后,下面我们来看显存跟屏幕的映射关系

从手册上的RAM映象图上可以看出,TM1621一个地址是4bit。SEG0….SEG31是寄存器地址对应SEG0….SEG31管脚,COM0~COM3是TM1621的公共端

假设我们要让屏幕的第一个8显示“0”,(TM1621是共阴的所以采用阴码)阴码的“0”是0x3f,如果我们直接把0x3f给寄存器0~1,显示的效果就是乱码。TM1621断码液晶驱动IC的原理、驱动代码-风君子博客

 从这个表可以看出,如果要正常显示应该把G跟F调换(Lcd_ram是缓存数组,单独擦写每一位太过麻烦。所以建立一个缓存区,一次刷新整屏幕)

uint8_t BIT_Reverseuint8_t num)
{
    uint8_t bit = num;

    ifbit & 0x10) == 0) bit = bit & 0xf7;
    else                  bit = bit | 0x08;

    ifbit & 0x80) == 0) bit = bit & 0xfe;
    else                  bit = bit | 0x01;    
    
    bit = bit << 4;
    bit = bit & 0xF0;
    return bit;
}

void TM1621_displayuint8_t cnt, uint8_t num)
{
        Lcd_ram[cnt]  = BIT_ReverseLcd_table[num] & 0xF0);
        Lcd_ram[cnt] |= Lcd_table[num] & 0x0F);
        TM1621_SendNDat0x00,Lcd_ram,10,8);
}
        

TM1621断码液晶驱动IC的原理、驱动代码-风君子博客

TM1621断码液晶驱动IC的原理、驱动代码-风君子博客TM1621断码液晶驱动IC的原理、驱动代码-风君子博客