2022 07月05日
作者: 显示行家
  • 浏览: 791
  • 收藏:0
  • 点赞:1
液晶显示(二)-----字符控制IC-ST7066应用

       在单色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原理图.png

    图中完整描述了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关系如下图:

BIAS.png

三、参考例程(通过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);                 //采用4BIT通讯时,高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个字符(每页显示16x2个字符,共8页显示)
    {		 
      	for(i=0;i<16;i++)
	      {   
	        writelcd(0x80+i,k++) ;          //第1行16个字符,这16个是CGRAM地址,会随机显示,忽略
	      }
        for(i=0;i<16;i++)
	      {   
	        writelcd(0xC0+i,k++) ;          //第2行16个字符,CGROM地址开始,正常字符开始地址
	      }
		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);
     }	 
     
  }

    编译通过,即可看到如下图显示

C1602B1.png

   C1602B2.png

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


四、原理图压缩文件

C162A.rar



  

发表评论

评论列表


没有评论

筛选

文章分类

热门文章

企业招聘网址

2023-12-07  浏览:3018次

BC1.2协议介绍

2023-06-14  浏览:2923次

USB2.0速度识别

2023-10-23  浏览:1349次