zoukankan      html  css  js  c++  java
  • TM1621断码液晶驱动IC的原理、驱动代码

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

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

    void Delay_us(uint8_t us)
    { uint16_t i = 0,z = 0;
        for(i = 0; i < us; i++)
        {
            for(z = 0; z < 50; z++);
        }
    }
    
    /**************************************************************************************
    * FunctionName   : TM1621_SendBitMsb()
    * Description    : 发送发送多位[高位在前]
    * EntryParameter : None
    * ReturnValue    : None
    **************************************************************************************/
    void TM1621_SendBitMsb(uint8_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_us(3);
            TM1621_WR_HIG();
        }
    }
    
    /**************************************************************************************
    * FunctionName   : TM1621_SendBitLsb()
    * Description    : 发送多位[低位在前]
    * EntryParameter : None
    * ReturnValue    : None
    **************************************************************************************/
    void TM1621_SendBitLsb(uint8_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_us(3);
            TM1621_WR_HIG();
        }
    }
    
    /**************************************************************************************
    * FunctionName   : TM1621_SendCmd()
    * Description    : 发送命令
    * EntryParameter : None
    * ReturnValue    : None
    **************************************************************************************/
    void TM1621_SendCmd(uint8_t cmd)
    {
        TM1621_CS_LOW();
        TM1621_SendBitMsb(0x80, 3);                                                     // 前面3位命令代码
        TM1621_SendBitMsb(cmd, 9);                                                      // 后面10位: a5~a0[RAM地址]+d3~d0[RAM数据]
        TM1621_CS_HIG();
    }
    
    /**************************************************************************************
    * FunctionName   : HTBSendNDat()
    * Description    : 发送N数据
    * EntryParameter : None
    * ReturnValue    : None
    **************************************************************************************/
    void TM1621_SendNDat(uint8_t addr, uint8_t *pDat, uint8_t cnt, uint8_t bitNum)
    {
        TM1621_CS_LOW();
        TM1621_SendBitMsb(0xA0, 3);                                                    // 前面3位命令代码
        TM1621_SendBitMsb(addr<<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_CMD(uint8_t cmd)
    {
            TM1621_CS_LOW();
        TM1621_SendBitMsb(0x80, 4);                                                    // 前面3位命令代码
        TM1621_SendBitMsb(cmd, 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,显示的效果就是乱码。

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

    uint8_t BIT_Reverse(uint8_t num)
    {
        uint8_t bit = num;
    
        if((bit & 0x10) == 0) bit = bit & 0xf7;
        else                  bit = bit | 0x08;
    
        if((bit & 0x80) == 0) bit = bit & 0xfe;
        else                  bit = bit | 0x01;    
        
        bit = bit << 4;
        bit = bit & 0xF0;
        return bit;
    }
    
    void TM1621_display(uint8_t cnt, uint8_t num)
    {
            Lcd_ram[cnt]  = BIT_Reverse(Lcd_table[num] & 0xF0);
            Lcd_ram[cnt] |= (Lcd_table[num] & 0x0F);
            TM1621_SendNDat(0x00,Lcd_ram,10,8);
    }
            

  • 相关阅读:
    C#把外部文件拖入PictureBox中
    DirectInfo.GetFiles返回数组的默认排序
    NULL在SQLServer数据库日志文件中的存储
    C#中用NamedPipe进程间通信
    punycode和中文相互转换
    C#事件和委托的基础知识模型
    反射APP_CODE下的类和方法
    [ListView.View=List]的垂直滚动条
    换个思路"SQL2005下字符串字段内的字符排序"
    mono for android 的ADB
  • 原文地址:https://www.cnblogs.com/huanjun/p/13530661.html
Copyright © 2011-2022 走看看