LCD使用时需要注意的几个小问题,AT89C51写入字符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)
{
}
}