HT1621B驱动笔段式LCD的理解(内含代码讲解)

笔段式LCD因功耗极低,所以经常用低功耗产品上,是低功耗显示中必用的显示设备。本文讲解的思路是从代码入手,去讲解HT1621B如何驱动笔段式LCD的;

1》。写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号。(4位数据为com1~com4类似于数码管的段选,SEG序列号为位选,其中SEG序列号是0表示第一个数码管,1表示第二个数码管,以此类推)

>由上图可知,可以从图一推出HT1621B和笔段式LCD的连接方式,LCD的第5个管脚连接的是SEG0,SEG0代表的是第一个数码管的前4段数据(A F E P段),SEG1代表的是第一个数码管的后4段数据(B G C D段);

void HT1621_Display_DATA(unsigned int  Temp)            //显示数据
{
	
	unsigned char Temp_Data;
	Temp_Data = Temp / 1000;
	Write1DataHT1621(HT1621_segtab[0],	LCD_RAM_Tab[Temp_Data]>>4); //这时发送的  是地址为0,1,2,3,4,5,6,7也就是六位地址位;后面是4位COM数据,即COM1,COM2,COM3,COM4
	Write1DataHT1621(HT1621_segtab[1],	LCD_RAM_Tab[Temp_Data]>>0); //发送两组数据表示一个数码管。
	
	Temp_Data = Temp % 1000 / 100;
	Write1DataHT1621(HT1621_segtab[2],	(LCD_RAM_Tab[Temp_Data]>>4)|0x08);
	Write1DataHT1621(HT1621_segtab[3],	LCD_RAM_Tab[Temp_Data]>>0);
	
	Temp_Data = Temp % 1000 % 100 / 10;
	Write1DataHT1621(HT1621_segtab[4],	LCD_RAM_Tab[Temp_Data]>>4);
	Write1DataHT1621(HT1621_segtab[5],	LCD_RAM_Tab[Temp_Data]>>0);
	
	Temp_Data = Temp % 1000 % 100 % 10;
	Write1DataHT1621(HT1621_segtab[6],	LCD_RAM_Tab[Temp_Data]>>4);
	Write1DataHT1621(HT1621_segtab[7],	LCD_RAM_Tab[Temp_Data]>>0);
}
void Write1DataHT1621(unsigned char Addr,unsigned char Dat)
{
	unsigned char i; 
	unsigned char Shift;
	
	HT1621_CS_L();  				//CS 片选开
	HT1621_Delay_us(HT1621_CLK);
	
	HT1621_DATA_H();  				//101
	WriteClockHT1621();
	HT1621_DATA_L();
	WriteClockHT1621();
	HT1621_DATA_H();
	WriteClockHT1621();
	
	Shift = 0x20; 					//屏蔽高3位 只用5位
	for( i = 0; i < HT1621_addrbit; i++) 
	{
		if(Addr & Shift)
			HT1621_DATA_H();
		else
			HT1621_DATA_L();
		WriteClockHT1621();
		Shift = Shift >> 1;
	}
	
	Shift = 0x01;
	for (i = 0; i < 4; i++)
	{
		if( Dat & Shift) 
			HT1621_DATA_H();
		else
			HT1621_DATA_L();
		WriteClockHT1621();
		Shift = Shift << 1;
	}   
	HT1621_CS_H(); 					//CS 片选关
	HT1621_Delay_us(HT1621_CLK);
	HT1621_DATA_H();
}

>由以上两张图可知,6位RAM地址由高位到低位输入到H1621B内,4位数据先COM1~COM4

2》比较重要是代码如何适用于各种LCD显示屏,以下是正常数码管的段转换成LCD的段码次序 ,正常数码管段的次序:P G F E D C B A 转化后为 P E F A D C G B正好和需要的LCD段码顺序(A F E P B G C D)第一张图的表格是对应 ;

先低位后高位,每四位一组正好和表格一致;

void HT1621_num_init(void)//是把正常的数码管的段的次序转换成LCD的段码次序,需要根据液晶图纸顺序做修改;
{
	unsigned char num,LCD_data;
	
	for(num=0; num<sizeof(LED_Tab); num++)
	{
		LCD_data = 0;
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_P)>>7) << 7);
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_E)>>4) << 6);
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_F)>>5) << 5);
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_A)) << 4);
		
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_D)>>3) << 3);
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_C)>>2) << 2);
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_G)>>6) << 1);
		LCD_data = LCD_data | ((unsigned char)((LED_Tab[num] & LCD_B)>>1) << 0);
		
		LCD_RAM_Tab[num] = LCD_data;
	}
}

完整的程序可在我的资源上传中下载到;

经验分享 程序员 微信小程序 职场和发展