液晶显示简介
①液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类
液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:
线段的显示
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。
字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
汉字的显示
汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。
1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚说明
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
用51单片机编写lcd1602显示程序
#include 《reg51.h》
#define uchar unsigned char
#define uint unsigned int
sbit LCD_E=P3^5; //定义接口
sbit LCD_RW=P3^6;
sbit LCD_RS=P3^7;
#define LCD_Data P1 //数据接口
uchar up[]={“IvU,hupeixian”};
uchar code down[]={“_by fu ”}
/*************************延时函数*****************************/
void Delay_ms(uint time)
{
uint i,j;
for(i = 0;i 《 time;i ++)
for(j = 0;j 《 930;j ++);
}
/**********************检测状态************************************/
uchar LCD_ReadStatus(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
while (LCD_Data & 0x80); //检测忙信号
return(LCD_Data);
}
/************************写数据***********************************/
void LCD_WriteData(uchar WDLCD)
{
LCD_ReadStatus();//检测忙
LCD_Data = WDLCD
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;//若晶振速度太高可以在这后加小的延时
LCD_E = 1;//延时
LCD_E = 0;
}
/************************写指令********************************/
void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC)
LCD_ReadStatus(); //根据需要检测忙
LCD_Data = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/*****************初始化***********************************/
void LCD_Init(void)
{
LCD_Data = 0;
LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
Delay_ms(5);
LCD_WriteCommand(0x38,0);
Delay5Ms();
LCD_WriteCommand(0x38,0);
Delay_ms(5);
LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号
LCD_WriteCommand(0x08,1); //关闭显示
LCD_WriteCommand(0x01,1); //显示清屏
LCD_WriteCommand(0x06,1); // 显示光标移动设置
LCD_WriteCommand(0x0C,1); // 显示开及光标设置
}
/***********************显示一个字符********************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码
LCD_WriteData(DData);
}
/************************显示一串字符*******************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]》0x20) //若到达字串尾则退出
{
if (X 《= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
/******************************************************************/
void main(void)
{
Delay_ms(400); //启动等待,等LCD讲入工作状态
LCD_Init(); //LCD初始化
Delay_ms(5); //延时片刻(可不要)
DisplayListChar(0, 1, up);
DisplayListChar(6, 0, down);
LCD_Data=0xff;
while(1);
}
用16F877A编写lcd1602显示程序
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
#define DB PORTD //定义端口
#define rs RB0 #define e RB1
__CONFIG(0x3B31);
const uchar data[]=“happy everyday”;//输入的字符串 第一行
const uchar data1[]=“xiexie”;//第二行
void init();
void write_commond(uchar dat);//写指令函数
void write_data(uchar dat);//写数据函数
void delay(uint x);
void delay(uint x)
{
uint a,b;
for(a=x;a》0;a--)
for(b=110;b》0;b--); }
void init()//初始化指令
{
write_commond(0x01);//0000000001,清除屏幕显示
write_commond(0x28);//设置4位格式,2行,5X7,功能设定
write_commond(0x0C);//0000001100,开显示,无光标,不闪烁
write_commond(0x06);//0000000110,置输入模式,光标右移,屏幕上的文字不移动
write_commond(0x14);//0001000100,设定CGRAM地址显示屏或光标移动方向
}
void write_commond(uchar dat)
{
rs=0;//指令 DB=dat;
e=1;//允许 下降沿触发1-0
delay(5);
e=0;
DB=DB《《4;//左移四位从RD4~RD7进入LCD
delay(5);
e=1; delay(5);
e=0;
}
void write_data(uchar dat)
{
rs=1;//数据
DB=dat;
e=1;//允许
delay(5);
e=0;
delay(5);
DB=DB《《4;
e=1;
delay(5);
e=0;
}
void main()
{
uchar i;
TRISD=0X00;//定义端口寄存器
PORTD=0X00;
PORTB=0X00;
TRISB=0X00;
init();
write_commond(0x80);//第一行的DDRAM的地址,不加0x10时,也可以从//最左边开始
for(i=0;i《12;i++)
{
write_data(data[i]);//第一行的数据字符
delay(5);
}
write_commond(0xc0);//第二行的DDRAM地址不加0x10也可
for(i=0;i《16;i++)
{
write_data(data[i]);//第二行的数据字符
delay(5);
}
/* for(i=0;i《16;i++)
{
write_commond(0x18);//光标不动,数据左移一位
delay(5);
}*/
while(1);
}
写近一个字符A程序如下:
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
#define DB PORTD
#define rs RB0
#define e RB1
__CONFIG(0x3B31);
void init();
void write_commond(uchar dat);//写指令函数
void write_data(uchar dat);//写数据函数
void disp_char(uchar x,uchar y,uchar dat);//在屏幕某个位置显示一个字符,x(0-16),y(1-2)
void delay(uint x);
void delay(uint x)
{
uint a,b;
for(a=x;a》0;a--)
for(b=110;b》0;b--);
}
void init()//初始化指令
{
write_commond(0x01);//0000000001,清除屏幕显示
write_commond(0x28);//设置4位格式,2行,5X7,功能设定
write_commond(0x0C);//0000001100,开显示,无光标,不闪烁
write_commond(0x06);//0000000110,置输入模式,光标右移,屏幕上的文字不移动
write_commond(0x80);//0001000100,设定CGRAM地址显示屏或光标移动方向
}
void write_commond(uchar dat)
{
rs=0;//指令
DB=dat;
e=1;//允许
delay(5);
e=0;
DB=DB《《4;
delay(5);
e=1;
delay(5);
e=0;
}
void write_data(uchar dat)
{
rs=1;//数据
DB=dat;
e=1;//允许
delay(5);
e=0;
delay(5);
DB=DB《《4;
e=1;delay(5);
e=0;
}
void disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1) address=0x80+x;
else
address=0xc0+x;
write_commond(address);
write_data(dat);
delay(5);
}
void main()
{
TRISD=0X00;
PORTD=0X00;
PORTB=0X00;
TRISB=0X00;
init();
disp_char(0,1,‘A’);
while(1);
}
也可以是如下:
void disp_char(uchar x,uchar y,uchar dat)
{
uchar i;
write_commond(0x80+x);
if(i=0;i《16;i++)
{
write_data(‘A’);
delay(5);
}
}
评论
查看更多