HT液晶显示驱动详细原理及程序文档格式.docx
《HT液晶显示驱动详细原理及程序文档格式.docx》由会员分享,可在线阅读,更多相关《HT液晶显示驱动详细原理及程序文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
![HT液晶显示驱动详细原理及程序文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/24/6f4e4533-fa83-4f4e-9d75-6e1aeddf2e6d/6f4e4533-fa83-4f4e-9d75-6e1aeddf2e6d1.gif)
偏压比:
指的是液晶的偏压系数,可以看看专业技术文章,偏压目的是克服交叉效应,通过把半选择点与非选择点的电压平均,适度提高非选择点的电压来抵消半选择点上的一部分电压,使半选择点上的电压下降,从而提高显示对比度;
最终行半选择点和非选择点上的电压均为显示电压的1/a,1/a就称为偏压系数,也称为偏压。
此方法称为1/a偏压的平均电压法,简称为1/a偏压法。
VLCD(LCD驱动电压):
LCD的驱动电压为加在点亮部分的段电压与公共电压之差(峰-峰值)。
5.关于RAM地址映射的概念
为了这个问题困扰了很久,虎风太愚钝啦……
Ht1621有一个32*4的LCD驱动,映射到32*4的RAM地址。
上图中写命令101后面跟6位RAM地址,那么这个地址是如何确定的呢?
其实说白了也很简单,RAM地址就是SEG的序号。
我们要点亮一段液晶管需要给他提供一个电平,而这个电平是由SEG管脚提供的,SEG管脚电平的输出又取决于对应RAM地址中的值。
驱动一个8段数码管的顺序是A,B,C,D,E,F,G,DP,我们认为前面LCD结构图中的数码管3为我们要显示的低位,那么连接原理图中A3的是SEG12,我们就说此时的RAM地址为0b001100,连接B3的是SEG11,对应的RAM地址为0b001011,依次类推,第一个数码管的所有地址为:
0b001100,0b001011,0b001010,0b001001,0b001000,0b001101,0b001110,0b000111//DP2;
其余地址类似,在此不再解释。
6.程序
UnsignedcharLCD_ADD[]={0b00001100,0b00110100,0b00010100,0b00100100,0b00000100,0b00101100,0b00011100,0b00111000,0b00000010,0b00111100,0b00011000,0b00101000,0b00001000,0b00100010,0b00010010,0b00110000,0b00001010,0b00110010,0b00010000,0b00100000,0b00000000,0b00101010,0b00011010};
voidHT1621_Dis_Char(unsignedchard,unsignedchard_loca)
{
unsignedcharj;
unsignedcharseg_cnt=8;
if(d_loca==(HT1621_DATA_NUM-1))
seg_cnt=7;
//送3位模式码101及6位首地址0000000b000000101
for(j=0;
j<
seg_cnt;
j++)//送cache_size组数据
{HT1621_PORT&
=~_BV(HT1621_CS);
HT1621_Send_Bits(0x05,3);
//送写命令代码101,高到低
HT1621_Send_Bits(LCD_ADD[d_loca*8+j],6);
//送每段对应的地址
HT1621_Send_Bits(d&
0x01,4);
//送数据,com0对应的低位,低到高
d=d>
>
1;
//右移位
HT1621_PORT|=_BV(HT1621_CS);
}
}
/*=========显示小数点=========
输入参数:
Poi_loca,为小数点的位置(0是第一位,1是第二位)
*/
voidHT1621_Pri_Point(unsignedcharPoi_loca)
{
unsignedcharseg_cnt=8;
if(Poi_loca<
2)
//送写命令代码101
HT1621_Send_Bits(LCD_ADD[Poi_loca*seg_cnt+7],6);
//送点对应的地址
//送数据
HT1621_Send_Bits(1,4);
}
/********************************************************
=======显示INT型数据
dat--待显示数据
********************************************************/
voidHT1621_Print_onlyInt(unsignedlongdat)
unsignedchari;
unsignedchardata[HT1621_DATA_NUM];
if(dat>
=HT1621_DATA_max)
dat=dat%HT1621_DATA_max;
for(i=0;
i<
HT1621_DATA_NUM;
i++)data[i]=LCD_CODE[HT1621_NoPrint_Loc];
//初始化为不显示
if(dat<
10)data[0]=LCD_CODE[(unsignedchar)(dat)];
//个位数
elseif(dat<
100){data[1]=LCD_CODE[(unsignedchar)(dat/10)];
data[0]=LCD_CODE[(unsignedchar)(dat%10)];
}//十位数
else{
data[2]=LCD_CODE[(unsignedchar)(dat/100%10)];
data[1]=LCD_CODE[(unsignedchar)(dat/10%10)];
data[0]=LCD_CODE[(unsignedchar)(dat%10)];
}//百位数
i++)//从低位到高位,调用显示每个数的函数HT1621_Dis_Char
HT1621_Dis_Char(data[i],i);
/*********************************************************/
//打印INT型数据
//dat--待显示数据
//chk--显示的数据位数:
0--关闭1~3时,显示对应的数据;
大于3时只显示3位;
(从左到右)
//point_loc--显示的小数点的位置:
0以及大于2时:
不显示小数点;
1-显示第1个,2-显示第2个;
voidHT1621_Print_Int(unsignedlongdat,unsignedcharchk,unsignedcharpoint_loc)
//chk为0,则屏幕不显示
i++)data[i]=LCD_CODE[HT1621_NoPrint_Loc];
if(chk>
0){data[0]=LCD_CODE[(unsignedchar)(dat%10)];
dat=dat/10;
1){data[1]=LCD_CODE[(unsignedchar)(dat%10)];
2){data[2]=LCD_CODE[(unsignedchar)(dat%10)];
//显示小数点
if(point_loc==1)
data[0]|=0x80;
elseif(point_loc==2)
data[1]|=0x80;
//从低位到高位,调用显示每个数的函数HT1621_Dis_Char
i++)
//送d_count位数据d;
从低位开始送
voidHT1621_Send_Bits(unsignedchard,unsignedchard_count)
unsignedcharj;
for(j=0;
d_count;
++j)
{
HT1621_PORT&
=~_BV(HT1621_WR);
//wr置低;
HT1621_Delay(50);
if(d&
0x01==1)//置数据位;
{HT1621_PORT|=_BV(HT1621_DATA);
//data置0
}
else
{HT1621_PORT&
=~_BV(HT1621_DATA);
//data置1
}
HT1621_PORT|=_BV(HT1621_WR);
//wr置高;
d=(d>
1);
//右移位
//HT1621初始化
voidHT1621_Init()
DDRC|=_BV(4)|_BV(5)|_BV(7);
//定义端口PC4-PC5-PC7输出
//CS端清零
HT1621_Send_Bits(0x18,9);
//系统时钟选用片内RC
HT1621_Send_Bits(0x80,9);
//打开系统振荡器
HT1621_Send_Bits(0x94,9);
//1/2偏置,2个公共口10000100
HT1621_Send_Bits(0xc0,9);
//打开LCD偏置发生器
//CS端置1
HT1621_NoPrint();
//液晶不显示
}
7.结束
HT1621作为液晶驱动芯片,功能十分灵活,而液晶在我们的学习项目中会经常用到,所以学好它的操作是十分必要的。