笔段式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;
}
}
完整的程序可在我的资源上传中下载到;