TM1621和HT1621是兼容的,下面统称TM1621。
TM1621是一个32x4的LCD 驱动器,也就是说它最多能驱动128段段码。
四线串行接口
一般我们不使用读数据的功能,所以用到的数据引脚只有/WR、/CS、DATA
先定义使用到的引脚
#define CS_CLR HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET)
#define CS_SET HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET)
#define DATA_CLR HAL_GPIO_WritePin(LCD_DATA_GPIO_Port, LCD_DATA_Pin, GPIO_PIN_RESET)
#define DATA_SET HAL_GPIO_WritePin(LCD_DATA_GPIO_Port, LCD_DATA_Pin, GPIO_PIN_SET)
#define WR_CLR HAL_GPIO_WritePin(LCD_WR_GPIO_Port, LCD_WR_Pin, GPIO_PIN_RESET)
#define WR_SET HAL_GPIO_WritePin(LCD_WR_GPIO_Port, LCD_WR_Pin, GPIO_PIN_SET)
一些命令参数
#define HT1621B_BYTES 32
#define REG_NO_UPDATE 0
#define REG_UPDATE 1
#define HT1621B_BIAS_COM2 0 //AB=00 可选2个公共口
#define HT1621B_BIAS_COM3 1 //AB=01 可选择3个公共口
#define HT1621B_BIAS_COM4 2 //AB=10 可选4个公共口
#define HT1621B_BIAS_AB HT1621B_BIAS_COM4
#if VER_HARDWIRE == VER1
#define HT1621B_BIAS_C 1 //C = 0 可选1/2偏压 C= 1 可选1/3偏压 (C=0 全显示 C=1 单显示)
#elif VER_HARDWIRE == VER2
#define HT1621B_BIAS_C 1 //C = 0 可选1/2偏压 C= 1 可选1/3偏压 (C=0 全显示 C=1 单显示)
#endif
#define HT1621B_BIAS (0x20|( HT1621B_BIAS_AB << 2 )|HT1621B_BIAS_C) //BIAS 0010 ABXC X
#define HT1621B_LCDOFF 0x02 //关闭LCD显示
#define HT1621B_LCDON 0x03 //打开LCD显示
#define HT1621B_SYSDIS 0x00 //关闭系统振荡器和 LCD 偏压发生器
#define HT1621B_SYSEN 0x01 //打开系统振荡器
#define READ 0x06
#define WRITE 0x05
#define READ_MODIFY_RITE 0x05
#define COMMAND 0x04
下图是手册中的写数据时序图
从以上时序同中我们可以看出写数据时,地址位是从高到底,数据位是从低到高。
/*****************************************************************************
[函数名称]vSendHighBits
[函数功能]写入高位 一位一位的发送
[参 数]
[全局变量]无
[返 回 值]无
[备 注] 参考HT1621B 命令模式 时序图
*****************************************************************************/
void vSendHighBits(uint8_t u8Data,uint8_t u8Bit)
{
uint8_t u8Index = 0;
for(u8Index = 0;u8Index < u8Bit;u8Index++)
{
if((u8Data & 0x80) == 0){
DATA_CLR;
}
else{
DATA_SET;
}
WR_CLR;
Delay(2);
WR_SET;
u8Data <<= 1;
}
}
/*****************************************************************************
[函数名称]vSendLowBits
[函数功能]写入低位
[参 数]
[全局变量]无
[返 回 值]无
[备 注] 数据位
*****************************************************************************/
void vSendLowBits(uint8_t u8Data,uint8_t u8Bit)
{
uint8_t u8Index = 0;
for(u8Index = 0;u8Index < u8Bit;u8Index++)
{
if((u8Data & 0x01) == 0)
{
DATA_CLR;
}
else
{
DATA_SET;
}
WR_CLR;
Delay(2);
WR_SET;
u8Data >>= 1;
}
}
/*****************************************************************************
[函数名称]vSendData
[函数功能]写模式 写数据到RAM中
[参 数]
[全局变量]无
[返 回 值]无
[备 注]
*****************************************************************************/
void vSendData(uint8_t u8Addr,uint8_t u8Data)
{
CS_CLR;
vSendHighBits(WRITE<<5,3); //发送一个101
vSendHighBits(u8Addr<<2,6); //发送6位的地址
vSendLowBits(u8Data,4); //发送4位的数据
CS_SET;
}
实际应用中我们还是使用下面这个函数是驱动某一段液晶的驱动程序
/*****************************************************************************
[函数名称]vSetSeg
[函数功能]
[全局变量]无
[返 回 值]
[备 注] u8Addr seg地址 u8Bit com地址 bOn 置1或0
*****************************************************************************/
void vSetSeg( uint8_t u8Addr,uint8_t u8Bit,uint8_t bOn )
{
if(u8Addr < HT1621B_BYTES)
{
uint8_t u8Write = 0;
u8Write = m_au8Value[u8Addr];
if(bOn) //数据写1或0
{
u8Write |= (0x01 << u8Bit); //将该位置1
}
else
{
u8Write &= ~(0x01 << u8Bit); //将该位置0
}
u8Write &= 0x0F;
m_au8Value[u8Addr] = u8Write;
vSendData(u8Addr,u8Write);
}
}
/*****************************************************************************
[函数名称]vClearScreen
[函数功能]
[全局变量]无
[返 回 值]
[备 注]
*****************************************************************************/
void vClearScreen( void )
{
memset(&m_au8Value,0,HT1621B_BYTES);
for(uint8_t u8Addr = 0;u8Addr < HT1621B_BYTES;u8Addr++)
{
vSendData(u8Addr,0);
}
}
/*****************************************************************************
[函数名称]vFillScreen
[函数功能]
[全局变量]无
[返 回 值]
[备 注]
*****************************************************************************/
void vFillScreen( void )
{
memset(&m_au8Value,0x0F,HT1621B_BYTES);
for(uint8_t u8Addr = 0;u8Addr < HT1621B_BYTES;u8Addr++)
{
vSendData(u8Addr,0x0F);
}
}
命令模式时序图
文章来源:https://www.toymoban.com/news/detail-508034.html
/*****************************************************************************
[函数名称]vSendCommand
[函数功能]命令模式
[参 数]
[全局变量]无
[返 回 值]无
[备 注]
*****************************************************************************/
void vSendCommand(uint8_t u8Command)
{
CS_CLR;
vSendHighBits(COMMAND << 5,3); //发送一个100
vSendHighBits(u8Command,9); //发送 9位命令码
CS_SET;
}
液晶驱动初始化代码文章来源地址https://www.toymoban.com/news/detail-508034.html
uint8_t vLcdInit( void )
{
BACKLIGHT_ON;//打开背光
CS_CLR;
CS_SET;
CS_CLR; //高电平脉冲初始化HT1621串行接口
// 初始化液晶参数
vSendCommand(HT1621B_BIAS); //偏压
vSendCommand(HT1621B_SYSEN); //打开系统振荡器
vSendCommand(HT1621B_LCDOFF); //关闭LCD显示
vSendCommand(HT1621B_LCDON); //打开LCD显示
//检查一下段码屏
vFillScreen(); //全亮
HAL_Delay(1000);
vClearScreen();//全灭
return 0;
}
到了这里,关于TM1621/HT1621 段码LCD驱动器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!