LCD1602为什么不能一次点亮?

2022-11-22 15:29:12 浏览数 (1)

LCD 1602 是一种点阵式的字符型液晶屏,它能够同时显示16 x 02即32个字符。LCD 1602 液晶显示屏的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形。1602是指显示的内容为16 x 2,即同时可以显示两行,每行16个字符,但只能显示字符和数字。LCD 1602是通过 HD44780 液晶控制芯片控制的。控制驱动主电路及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法基本都是一样的。

LCD1602引脚定义

1602LCD 通常采用标准的16脚接口或引脚,其各引脚含义如下:

  • 第1引脚:GND为电源地。
  • 第2引脚:VCC接5V电源正极。
  • 第3引脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生重影,使用时可以通过一个10K的电位器调整对比度)。
  • 第4引脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
  • 第5引脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
  • 第6引脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
  • 第7~14引脚:D0~D7为8位双向数据端。
  • 第15引脚:背光正极。(通常和供电引脚接一起)
  • 第16引脚:背光负极。(通常和供电引脚接一起)

LCD1602指令集

LCD1602应用电路

LCD1602使用及常见问题

使用

LCD1602可显示ASSIC表中的可见字符内容。可显示的范围是两行,每行16个字符,可同时显示16X02即32个字符,这也是此显示屏型号为什么叫做1602的原因。在实际的显示运用中,首先需要写入需要显示的地址,再写入需要显示的字符,这也LCD1602就会在对应的位置显示出对应的字符了。需要注意的是,显示出来的字符将会一直保持显示到下一次有新的显示字符写入,所以,在刷新后不需要显示的位置,需要写入“空”显示,覆盖上一次的显示字符。

常见问题

很多小伙伴在初次使用LCD1602时,会发现例程都不能一次点亮显示。问题大致分成以下几种情况:

①确保电路连接正确,需要和程序里定义的引脚一致。

②读写程序速度问题,请仔细检查例程中说明的单片机的工作时钟频率,频率不同,读写程序中的延时等待时间长度将不同,可能因为读写速度太快,LCD1602还没处理完上一次的数据,你就写入下一次数据。

③读取忙信号问题。很多小伙伴看到的厂家资料里用的都是读取忙信号来处理读写速度的问题。这样确实可以解决②中描述的问题,但是很多时候忙信号并不可靠,很多时候忙信号并没有准确的反应LCD1602的实际处理能力,更多时候会出现一直没读到忙信号解除信号。

解决②③的办法是不要采用读取忙信号的方式,采用延时时间方式,通过增大读写子函数中的延时时间,比如增大到500ms。显示正常后再不断减小这个时间,找到一个临界值就好。

④对比度显示问题。不显示的其中一个原因是因为对比度太小了,实际是显示了。V0引脚不能悬空,需要通过电位器连接,调节电位器,直到LCD1602显示屏上其中一行出现黑色的方格,方格能看清楚即可,不能太清晰,也不能直接看不到方格。此时如果程序正确,连接正确,则能正常显示出程序所写的显示内容。

LCD1602参考程序

代码语言:javascript复制
 // 1602显示 
 //单片机:stc15,24M
 //调试时间:
 //作者:小代

 #include<stc15.h>
 #define uint unsigned int  
 #define uchar unsigned char 
 void chushihua();     //初始化
 void write_zl(uchar data_zl);  //写指令函数
 void write_sj(uchar data_sj);  //写数据函数
 void delayL(uint s);
 void disp_MZ();  //显示名字
  
 uchar num[]="0123456789";
 uchar num1[]="MCU jishuzhai";
 //1602接口定义,数据接口为P0
 sbit rs=P2^0;
 sbit rw=P2^1;
 sbit e=P2^2;   
 uchar i_step;  //for循环的控制变量
 
 //****************
 //主函数入口
 //*****************************
 main()
 { 
  P0M0=0xff;
  P0M1=0x00;
  P1M0=0xff;
  P1M1=0x00; 
   chushihua();   //初始化1602  
  while(1){
      disp_MZ();    //显示名字拼音
  }  
 }
 
 //***********************
 //    1602函数
 //***********************
 //************************
//初始化1602函数
//*****************************
 void chushihua()
 {
   write_zl(0x30);
  delayL(50);  
  write_zl(0x38);
  delayL(50);  
  write_zl(0x01);
  delayL(50);
  write_zl(0x06);
  delayL(50);
  write_zl(0x0c);
  delayL(50);
 }               

//*******************************
//显示名字的拼音  ,数据在num1中。
//*************************
 void disp_MZ(){
    write_zl(0xc0);    //写地址时要在地址的基础上加上80H***实际地址00H   ,第一行第一列  
   for(i_step=0;i_step<12;i_step  ){write_sj(num1[i_step]);}       //显示名字的拼音
       
 }
 //*****************************
 //写指令函数
 //参数:data_zl  设置字或地址
 //*****************************
 void write_zl(uchar data_zl)
 {
   delayL(200);           //最小延时,再小程序就不能初始化
   P0=data_zl;
  rs=0;
  rw=0;
  e=1;
  e=0;
 }
 //********************************
//1602写数据函数
//参数:data_sj  显示的数据
//************************************
 void write_sj(uchar data_sj)
 {
    delayL(200);           //最小延时,再小程序就不能初始化
  P0=data_sj;
    rs=1;
  rw=0;
  e=1;
  e=0;
 }
//************************************** 
//延时函数
//*********************************
 void delayL(uint s)
 {
   uint a,b,x;
  for(x=0;x<s;x  ){  
    for(a=0;a<10;a  ){
      for(b=0;b<110;b  );
      }
  }
 }

·END·

单片机技术宅

以最简单的方式服务初学者

0 人点赞