LCD使用时需要注意的几个小问题,AT89C51写入字符LCD点阵源代码分享

发布时间:2023-08-02  

  LCD使用中须关注的七个问题:

  问题一:要避免LCD屏幕工作超负荷

  使用LCD屏幕要尤其注意其工作时间。当连续满负荷工作96小时以上,它就会迅速老化,严重时,甚至会烧坏,造成使用者受到巨大的经济损失。这是因为LCD屏幕的象素点是有液晶体构成,长时间工作,很容易使某些像素点(Pixel Dot)过热,一旦超过极限会导致永久性损坏。这就形成了常说的“坏点”(某些媒体称为“黑点”)。所以,如果用户不得不长时间工作时,也一定要让屏幕得到间歇性的休息,不能长时间地显示同一内容。而当屏幕处于等待工作状态时,就要降低亮度。52硬件论坛上高手就说使用屏幕保护程序是很好的习惯,这举手之劳不仅可以延缓液晶屏老化,延长其使用寿命,而且可以避免发生硬件损坏。

  问题二:遇到问题不可自行拆卸LCD屏幕

  对于LCD屏幕,由于它的构造非常精密娇气,所以无论使用者的屏幕是出现什么问题,都千万不要自行拆卸LCD屏幕。如果您怀疑您的LCD屏幕工作不正常,应该找厂商派专业的工作人眼帮助解决问题。LCD背景照明组件中的变压器在关机一定时间后依然可能带有1000V高压(尽管是微电流的),而非专业人员如果处理不好可能造成组件新的故障,严重时还可能导致屏幕永久性的不能工作--这实在的因小失大的不智之举。


  问题三:使用LCD显示要注意防压防震

  LCD显示屏幕十分脆弱娇贵,抗撞击能力远远不及CRT屏幕。一旦受到强烈撞击,就很可能导致LCD中含有的很多精密玻璃元件和灵敏娇气的电气元件受到损坏。所以一定要避免强烈的冲击的振荡。除了防止强烈撞击,还要注意不要对LCD屏幕表面施加压力。有些用户使用一段时间会发现屏幕上的坏点越来越多,其中很可能的原因就是使用者经常用手指指点屏幕某个的部位(哪怕是轻微的点击都可能产生局部坏点严重的可形成一片黑点),遇到这种情况,使用者自己是没有办法进行补救的。所以养成良好的使用习惯非常重要,不要随便接触屏幕的屏幕。


  问题四:让LCD屏幕回复青春的方法

  LCD屏幕中的照明灯是唯一自然消耗的零部件,经过了长时间的使用,就会老化,从而导致了屏幕屏幕变暗,亮度下降。如果屏幕变暗是由于老化造成,则只需要更换照明灯就可以让屏幕起死回生,回复青春。当然,最重要的,其实是平时注意保养,防范在于未然。以我在52硬件论坛上讲的多年对屏幕的保养经验,使用者可以注意一下一些问题:比如亮度(Brightness)不能调太高,长期高负荷工作会使屏幕加速老化

  而在非工作时间应该使用动作屏幕保护程序等等。如果注意平日保养,是可以大大延长背景照明灯的寿命。

  问题五:LCD屏幕不同的闪烁方式有不同的含义

  由于模拟信号输出界面的影响,比如像素的时钟和相位没有与模拟信号输出同步会导致闪烁现象,这个现象通常称作Pixel Jitter(像素抖动),它是会偶尔出现的一种闪烁现象,这是模拟/数码转换过程中不可避免的情况。为了解决这类问题,有两种方法。可以“自动调节”在LCD屏幕上都有有“自动设定”功能,其作用是对输入信号进行分析后将LCD屏幕调节为最佳状态。也可以“手动调节”,经通过相位(Phase),时钟(Clock)两个功能自行调节。

  但是,如果是有规律的闪烁或是经常不明原因的闪烁,那就可能是屏幕真的有问题了。先检查是否有接触不良,如果不是的话,那就是可能LCD屏幕自身出现故障了。


  问题六:潮湿是LCD屏幕的大忌

  使用LCD屏幕,一定要把它放在通风干燥的环境里,避免水汽的入侵。这是由于LCD屏幕内部设计非常精密,一旦因环境潮湿产生氧化腐蚀导致出现短路现象等都会给使用者带来巨大经济损失。如果不慎弄湿了屏幕,千万不要惊慌失措,先把电源关掉。如果只是屏幕表面有湿气,就要用软布轻轻的擦去,然后才能打开电源工作。如果说湿气已经进入LCD屏幕里面了,就必须将LCD放在通风条件好或温暖的地方,让其水分蒸发掉。如果情况非常严重,用户就应该请专业人员帮助解决。千万记住,首先要把电源关掉,在没有驱除湿气时不要让LCD加电工作,否则容易导致液晶电极被腐蚀,再好的技术人员也回天乏术。

  问题七:正确清除LCD屏幕屏幕表面污垢的方法

  屏幕使用一段时间,就必然会在表面积有灰尘污垢,使用者可以对其进行清洁,但一定要用正确的方法。首先,擦拭使用的介质最好是柔软、非纤维材料,比如脱脂棉、镜头纸或柔软的布等。因为粗糙的布或纸类物品容易对屏幕产生刮痕。然后沾少许玻璃清洁剂(千万不要用酒精一类的化学溶剂)轻轻地将其擦干净。另外要提醒大家的是,要用布沾上清洁剂再去擦,而不要将清洁济直接喷到显示屏幕表面,因为这样容易流到屏幕里面导致LCD屏幕内部出现短路故障,造成不必要的损失。


  用C51写的1602字符型LCD程序:

  //FileName:delay.h

  #ifndef __LZP_DELAY_H_

  #define __LZP_DELAY_H_

  #define TRUE 1

  #define FALSE 0

  //设置波特率

  #define OSC_FREQ 11059200L

  #define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255

  #define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254

  #define BAUD_38400 256 - (OSC_FREQ/192L)/38400L // 253

  #define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 252

  #define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 250

  #define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 248

  #define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 244

  // Timer2

  #define RCAP2_50us 65536L - OSC_FREQ/240417L

  #define RCAP2_1ms 65536L - OSC_FREQ/12021L

  void delay_ms(unsigned int num);

  void delay_50us(unsigned char num);

  void delay_us(unsigned char num);

  #endif

  //FileName:delay.c

  /********************************************

  ** start51 study board

  ** delay function implementation

  ** author:bluehacker《kernelpaniccrash At gmail.com》

  ** QQ:282074921

  **********************************************/

  #include “delay.h”

  #include “reg52.h”

  void delay_ms(unsigned int num)

  {

  RCAP2H = (RCAP2_1ms》》8);

  RCAP2L=(RCAP2_1ms&0x00ff);

  TH2=(RCAP2_1ms》》8);;

  TL2=(RCAP2_1ms&0x00ff);;

  ET2 = 0; // Disable timer2 interrupt

  T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer

  while (num--)

  {

  while (!TF2);

  TF2 = FALSE;

  }

  TR2 = FALSE;

  }

  void delay_50us(unsigned char num)

  {

  RCAP2H=(RCAP2_50us》》8);

  RCAP2L=(RCAP2_50us&0x00ff);

  TH2=(RCAP2_50us》》8);

  TL2=(RCAP2_50us&0x00ff);

  ET2=0;

  T2CON=0x04;

  while(num--)

  {

  while(!TF2)

  TF2=FALSE;

  }

  TR2=FALSE;

  }

  void delay_us(unsigned char num)

  {

  unsigned char i;

  for (i=0;i《num;i++)

  {

  }

  }

  //FileName:lcd.h

  #ifndef __LZP_LCD_H_

  #define __LZP_LCD_H_

  #include “reg52.h”

  /////////////////////////////

  //定义LCD控制引脚

  ////////////////////////////

  sbit LCDRS=“P2”^0;

  sbit LCDRW=“P2”^1;

  sbit LCDE=“P2”^2;

  void lcd_write_cmd(unsigned char cmd);

  void lcd_write_data(unsigned char dat);

  void lcd_clear(void);

  void lcd_init(void);

  unsigned char lcd_status(void);

  void lcd_set_mode(unsigned char cursor, unsigned char text);

  void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s);

  void lcd_write_char(unsigned char x,unsigned char y, unsigned char d);

  #endif

  //FileName:lcd.c

  /********************************************************

  **本开发板支持1602 字符型LCD

  **这种LCD的接口资料可以用google找到很多

  **引脚定义:

  * 1---GND

  * 2---VDD

  * 3---VLCD:对比度调节

  * 4---RS:寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器

  * 5---R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。

  当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平

  RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

  * 6---E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

  * 7~14---DB0~DB7数据线、

  * 15---A:背光引脚,“A”接正

  * 16---K:背光引脚,“K”接负

  ** author:bluehacker《kernelpaniccrash AT gmail.com》

  ** QQ:282074921

  **date :2007-11-15

  *********************************************************/

  #include “lcd.h”

  #include “delay.h”

  #include “intrins.h”

  /*向LCD写入命令*/

  void lcd_write_cmd(unsigned char cmd)

  {

  unsigned char status;

  P0=cmd;

  LCDRS=“0”;

  LCDRW=“0”;

  LCDE=“0”;

  delay_us(5);

  do{

  status=“lcd”_status();

  }while(status&0x80);

  LCDE=“1”;

  }

  void lcd_write_data(unsigned char dat)

  {

  unsigned char status;

  P0=dat;

  LCDRS=“1”;

  LCDRW=“0”;

  LCDE=“0”;

  delay_us(5);

  do{

  status=“lcd”_status();

  }while(status&0x80);

  LCDE=“1”;

  }

  void lcd_clear(void)

  {

  lcd_write_cmd(0x01);

  }

  /*显示屏字符串写入函数*/

  void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s)

  {

  if (y == 0) {

  lcd_write_cmd(0x80 + x);

  }

  else {

  lcd_write_cmd(0xC0 + x);

  }

  while (*s) {

  lcd_write_data( *s);

  s ++;

  }

  /*

  unsigned char i;

  for(i=0;i《16&&s!=0;i++)

  {

  lcd_write_char(x+i,y,s);

  }

  */

  }

  void lcd_write_char(unsigned char x,unsigned char y, unsigned char d)

  {

  if(y==0)

  {

  lcd_write_cmd(0x80+x);

  }

  else

  {

  lcd_write_cmd(0xc0+x);

  }

  lcd_write_data(d);

  }

  //光标复位

  void lcd_reset_cursor(void)

  {

  lcd_write_cmd(0x02);

  }

  //设置显示模式

  void lcd_set_mode(unsigned char cursor, unsigned char text)

  {

  unsigned char mode=“0x04”;

  if(cursor){//光标右移

  mode|=0x02;

  }

  else{//光标左移

  mode|=0x00;

  }

  if(text){//文字移动

  mode|=0x01;

  }

  else{//文字不移动

  mode|=0;

  }

  lcd_write_cmd(mode);

  }

  void lcd_init(void)

  {

  P0=0;

  LCDE=“1”;

  delay_ms(500);

  lcd_clear();

  lcd_write_cmd(0x38);//设置lcd功能:8位总线,双行显示,5X7点阵字符

  lcd_write_cmd(0x0f);//显示开关控制:显示ON,光标ON,闪烁ON

  lcd_write_cmd(0x06);//光标输入方式增量移位

  lcd_write_cmd(0x80);

  //lcd_write_cmd(0x0c);

  //lcd_clear();

  }

  //读取状态,是否忙

  unsigned char lcd_status(void)

  {

  unsigned char tmp=“0”;

  P0=0xff;

  LCDRS=“0”;

  LCDRW=“1”;

  LCDE=“0”;

  _nop_();

  LCDE=“1”;

  //_nop_();

  tmp=“P0”;

  return tmp;

  }

  //FileName:test.c

  /*******************************

  ** Start51 study board test software

  ** test 1602LCD

  ** author: bluehacker《kernelpaniccrash AT gmail.com》

  ** QQ:282074921

  ***********************************/

  #include “lcd.h”

  #include “delay.h”

  #include “intrins.h”

  void main(void)

  {

  //初始化串口

  SCON=“0x50”;/*mode 1,1 start bit ,8 data bit ,1 stop bit,enable receive*/

  PCON=“0x80”;/*SMOD=1, Baud Rate twice*/

  TMOD=“0x21”;/*timer 0--mode 1 and timer 1 ---mode2*/

  //set baud rate,use timer 1 as baud rate generator

  TH1=BAUD_19200;

  TL1=TH1;

  TR1=TRUE;

  ET1=FALSE;//disable timer 1 interrupt

  EA=“0”;

  //delay_ms(400);

  lcd_init();

  // lcd_set_mode(1,0);

  //lcd_reset_cursor();

  // lcd_write_char(3,1,‘c’);

  lcd_write_str(2,0,“bluehacker”);

  lcd_write_str(2,1,“QQ:282074921”);

  while(1)

  {

  }

  }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    了一款用在毕设上面,那个是能正常工作的。板上有个小负载,LED灯。想让这个灯闪烁。代码是没有问题的,因为下载到从网上买的单片机是正常工作的。用JLink下载到自己做的板子上也是能下载进去的,但是不工作。怀疑晶振......
    是能正常工作的。板上有个小负载,LED灯。想让这个灯闪烁。代码是没有问题的,因为下载到从网上买的单片机是正常工作的。用JLink下载到自己做的板子上也是能下载进去的,但是不工作。怀疑晶振没起振。用示波器测量晶振......
    系数,配置外部晶振分频系数,从而根据外部晶振的频率配置系统时钟。 有思路之后一切就都很简单了,找到时钟配置的代码块,然后将它修改一下就好了,但是这个神秘的代码块在哪里?经过一番研究,终于......
    的单片机,可是外部的两个晶振总是无法起振,没用。请问是什么原因?线路连接是对的,32768Hz没有接外接电容。8M的晶振接56PF的电容。 答:32.768K的晶振接两个30P的电容试试,还有8M的晶振的......
    智能穿戴产品对晶振的要求;智能穿戴行业如火如荼,那么这些有着特殊功能的手表,它们用的是什么晶振呢?用于这些科技智能产品的晶振到底有哪些普通晶振没有的特性?今天小编就带与您一起了解一下: 材料特殊的晶振......
    -LINK和APEX-LINK。 2.3烧录接口 支持JTAG和SWD。 2.4编译下载 随便找一个野火的STM32F103的代码例程,验证一下不修改任何配置和ST的代码是否可以直接烧录使用 打开......
    机做一个交通灯电路。要求是红灯,绿灯30s,黄灯3s。循环变化。那么外界晶振怎样选择?单指令周期多少比较合适?图中外接的两个电容的作用是什么?大小多少合适? 如果选择晶振的话,那两个电容值可以选择:30加减10PF......
    令周期多少比较合适?图中外接的两个电容的作用是什么?大小多少合适? 如果选择晶振的话,那两个电容值可以选择:30加减10PF左右的(频率在0~33MHZ之间); 如果选择陶瓷晶振的话,电容值可以选择:40......
    怎样选择?单指令周期多少比较合适?图中外接的两个电容的作用是什么?大小多少合适? 如果选择晶振的话,那两个电容值可以选择:30加减10PF左右的(频率在0~33MHZ之间); 如果选择陶瓷晶振的话,电容......
    43条说清单片机晶振的那些问题;一、为什么51单片机爱用11.0592MHZ晶振? 其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>