TM1621/HT1621 段码LCD驱动器

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

命令模式时序图
在这里插入图片描述

/*****************************************************************************
[函数名称]vSendCommand   
[函数功能]命令模式
[参    数]
[全局变量]无
[返 回 值]无
[备    注]
*****************************************************************************/
void vSendCommand(uint8_t u8Command)
{
	CS_CLR;
	vSendHighBits(COMMAND << 5,3);		//发送一个100
	vSendHighBits(u8Command,9);				//发送 9位命令码
	CS_SET;
}

液晶驱动初始化代码

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;
}
  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
/***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 名:TM1621-V1.0 *当前版本:V1.0 *MCU 型号:STC12C5608AD *开发环境:Keil uVision4 *晶震频率:11.0592MHZ *完成日期:2013-08-07 *程序功能:1.LCD驱动:LCD屏显示0`F *免责声明:1.此程序为TM1621驱动LCD演示程序,仅作参考之用。 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任 ********************************************************************************/ #include //MCU头文件 #include "intrins.h" //包含nop指令头文件 #define uchar unsigned char //数据类型宏定义 #define uint unsigned int //数据类型宏定义 #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义 /******************TM1621模块命令定义*********************/ #define SYSDIS 0x00 //关系统振荡器和LCD偏压发生器 #define SYSEN 0x02 //打开系统振荡器 #define LCDOFF 0x04 //关LCD偏压 #define LCDON 0x06 //开LCD偏压 #define TONEON 0x12 //打开声音输出 #define TONEOFF 0x10 //关闭声音输出 #define XTAL 0x28 //外部接晶振 #define RC 0x30 //内部RC振荡 #define BIAS 0x52 //1/3偏压 4公共口 #define WDTDIS 0x0a //禁止看门狗 #define WDTEN 0x0e //开启看门狗 /********************定义控制端口**********************/ sbit CS=P2^1; sbit READ=P2^7; sbit WRITE=P2^0; sbit DATA=P1^7; /********************定义数据*************************/ uchar code Smg[16]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型码 uchar code Tab0[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏 /********************延时函数*************************/ void delay_nms(uint n) { uint i; while(n--) for(i=0;i<500;i++); } /********************从高位写入数据*************************/ void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位写入TM1621,高位在前 { uchar i; for(i=0;i<Cnt;i++) { WRITE=0; if(Data&0x80;) //从最高位发送 DATA=1; else DATA=0; nop; nop; WRITE=1; Data<<=1; } WRITE=0; DATA=0; } /********************从低位写入数据*************************/ void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621,低位在前 { unsigned char i; for(i=0;i>=1; } WRITE=0; DATA=0; } /********************写入控制命令*************************/ void WriteCmd(uchar Cmd) { CS=0; nop; Write_Data_H(0x80,4); //写入命令标志100 Write_Data_H(Cmd,8); //写入命令数据 CS=1; nop; } /*********指定地址写入数据,实际写入后4位************/ void WriteOneData(uchar Addr, uchar Data) { CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 Write_Data_L(Data,4); //写入数据 CS=1; nop; } /*********连续写入方式,每次数据为8位,写入数据************/ void WriteAllData(uchar Addr,uchar *p,uchar cnt) { uchar i; CS=0; Write_Data_H(0xa0,3); //写入数据标志101 Write_Data_H(Addr<<2,6); //写入地址数据 for(i=0;i<cnt;i++) //写入数据 { Write_Data_L(*p,8); p++; } CS=1; nop; } /*******************TM1621初始化**********************/ void TM1621_init() { CS=1; WRITE=1; DATA=1; nop; delay_nms(1); WriteCmd(BIAS); //1/3偏压 4公共口 WriteCmd(RC); //内部RC振荡 WriteCmd(SYSDIS); //关系统振荡器和LCD偏压发生器 WriteCmd(WDTDIS); //禁止看门狗 WriteCmd(SYSEN); //打开系统振荡器 WriteCmd(LCDON); //开LCD偏压 } void main() { TM1621_init(); //开机初始化 delay_nms(1); WriteAllData(0,Tab0,16); //LCD不显示 while(1) { WriteAllData(0,Smg,16); //LCD显示0~F delay_nms(200); WriteAllData(0,Tab0,16); //LCD不显示 delay_nms(200); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值