液晶显示(二)-----字符控制IC-ST7066应用
本文作者:显示行家,e小白网址:www.e-xiaobai.com
在单色LCD应用中,字符液晶模组是应用很广泛的一种显示组件。到目前为止,像16x2,20x2,24x2的字符模组还有广泛应用。前面说过,要实现LCD显示,必须搭配合适的控制驱动电路才能实现显示功能。ST7066就是一颗专为实现字符显示的控制IC。由台湾ST(矽创)推出,成为最早替代HD44780(日立)和S6A0069(三星)字符控制IC的公司之一。虽然目前有国内的AIP31066(无锡中微爱芯)、UCI7066(台湾晶宏)的替代品出现,但ST7066还是占有比较大的应用。这几家的芯片基本可以兼容替换。这里就以ST7066为例,介绍字符液晶模组的驱动方式。
先介绍几个单色LCD驱动控制常用的术语:
VDD(VCC)----指IC工作电压,通常2.7-5.5V;
VOP(VLCD)----指能驱动LCD显示的电压,段码类和字符类一般不超过5V;点阵类最高可到24.0V;
DUTY----可简单理解为显示行数的倒数,如1/16duty,实际驱动行数16行;
BIAS----可简单理解为把显示电压进行分压的分压比,BIAS跟DUTY有直接关系,一般1/4DUTY-->1/3bias;1/16DUTY-- >1/5bais;1/32DUTY-->1/6bias;1/64DUTY-->1/9bias;1/128DUTY-->1/12bias;1/240DUTY-->1/16bias;
COM----行驱动;
SEG----列驱动;
CGROM----内部字符只读存储器,ST7066自带240个标准西文字符,出厂时已经写人ROM内,用户不可更改;
CGRAM----内部字符随机存储器,ST7066允许用户自定义8个5x点阵或者4个5x11点阵字符;
DDRAM----显示数据存储器,这个存储器定义了显示数据在内存中的显示地址(与显示屏的位置对应)。ST7066满屏最大显示80个字符,第一行起始地址为0x80,结束地址0xCF(单行);如果是2或是4行显示,则第二行的开始地址从0xC0开始;
一、基本特点
ST7066本身带有16个COM输出,40个SEG输出,按照西文字符5x8点阵格式,则可实现1行16个字符(16x1)或者2行8个字符(8x2);如果搭配ST7065(40列输出)或者ST7063(80列输出)驱动器,可实现显示字符扩充,最大可实现40x2个字符显示。
工作电压2.7-5.5V(IC),LCD显示驱动电压3.0-18.0V(超过VDD电压时,需要外部供电);
支持4BIT/8BIT并口通讯(AIP和UC新推出的还支持SPI/IIC);
软件可选择DUTY,1/8,1/11,1/16duty;
内部自带240个5x8西文字符库(CGROM),支持不同字库(英日字库ST7066-0A,英欧字库ST7066-0B等),注意ST7066系列不支持汉字显示,显示汉字库有另外的控制IC--ST7920,以后介绍;
二、应用电路如下图(以16x2字符模组为例)

图中完整描述了ST7066和ST7065组合使用的接法(COM和SEG需要接到LCD对应标号即可),因为要显示16x2行字符,按照单个字符需要5x8点阵(加上光标)计算,总共需要5x16=80列,2x8=16行才可以,一颗ST7066只有16行x40列,因此需要搭配1颗ST7065,刚好可实现16x80点阵显示。
采用1/16duty的VOP一般不超过5.0V(大多4.8V左右),因此不需要外加电压,只需从VDD(5.0V)中分压即可。图中R2-R6构成BIAS电路(VO端可直接接地),正常情况下R2-R6取等值(1K-10K),根据显示效果调整,也可外接电位器调节。Bias与Duty关系如下图:

三、参考例程(通过C51测试,可直接引用修改)
/**************************************/
/* */
/* this is a sample program */
/* for C1602 ,8Bit-6800 */
/* IC:ST7066U-0A /0B/0E */
/**************************************/
#include
#include
#define Dat P1 // MCU P1 Connect To LCM
sbit RS = P2^7; // Command or Data Select,1:DATA , 0:COMMAND
sbit RW = P2^6; // 1:Read; 0: Write
sbit EN = P2^5; // Enable, 0
sbit LED1 = P3^7;
#define uchar unsigned char
#define uint unsigned int
/*------------------延时子程序1--------------------------*/
void nop(uint t)
{
while(t--)
_nop_();
}
/*------------------延时子程序2---------------------------*/
void delay(uint t)
{
while(t--)
{ nop(500);}
}
/*------------------ 读状态字子程序-----------------------*/
uchar Read_state(void)
{
uchar State=0x00;
Dat=0x00; //注意这里如果是0xff会导致处于busy状态
RS=0;
RW=1; nop(1);
EN=1; nop(1);
State=Dat;nop(2); //读状态的高4位
EN=0;
return(State); //返回状态值
}
/*------------------ 判忙子程序,可以不采用---------------------------*/
void CheckBusy(void)
{ uchar Busy;
do{
Busy=Read_state();
}
while((Busy&0x80)==0x80); //如果BF=1,则判忙,等待继续查询;否则跳出
}
/*---------------- 4bit子程序---------------------*/
void Write(uchar flag,uchar n)
{
RS=flag;
RW=0; nop(1);
EN=1; nop(1);
Dat=(0xf0&n); nop(2); //屏蔽低4位,保留高4位
EN=0; nop(1);
}
/*---------------- 8bit命令子程序---------------------*/
void Writecom(uchar n)
{
CheckBusy();
Write(0,n);
}
/*---------------- 8bit数据子程序---------------------*/
void Writedata(uchar n)
{
CheckBusy();
Write(1,n);
}
/*------------------初始化LCD屏-----------------------------*/
void InitLCD(void)
{
delay(15);
Write(0,0x38); delay(15); //设置工作方式8bit,2行显示,5x8点阵,1/16duty; 0x28=4BIT,2行显示
Write(0,0x38); nop(100); //可以不保留
Writecom(0x06); nop(10) ; // 设置输入方式: 数据读写后DDRAM地址自动加1,光标右移
Writecom(0x0F); nop(10) ; // 开显示,开光标及光标闪烁;0x00=关显示
Writecom(0x01); nop(10) ; // 清屏
}
void ClearLCD() //清屏
{
Writecom(0x01); nop(4);
}
void writelcd(uchar m,uchar n) //连续写入指令或数据,0(m)--指令,1(n)--数据
{
Writecom(m);
Writedata(n);
}
/--------------------------以下是主测试程序--------------------------------/
main()
{
uint i,k=0;
InitLCD();
while(1)
{
for(m=0;m<8;m++) //显示字库表(CGROM)中256个字符,
{
for(i=0;i<16;i++)
{
writelcd(0x80+i,k++) ; //第1行16个字符,起始地址0x80,首16个会随机显示,忽略
}
for(i=0;i<16;i++)
{
writelcd(0xC0+i,k++) ; //第2行16个字符,起始地址0xc0,正常字符开始显示
}
delay_ms(n);
}
ClearLCD();
k=0; //256个字符显示完毕,计数器置0
for(i=0;i<16;i++)
{
writelcd(0x80+i,'8') ; //显示2行8字
writelcd(0xC0+i,'8') ;
}
delay(100);
}
}
编译通过,即可看到如下图显示

LCD模式不同,显示效果不同,驱动原理一样。