液晶显示简介
①液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、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);
}
}
知乎发布AI大模型!特定条件下水平接近ChatGPT-4,全面AIGC时代要来了?
PLC选择型号的方法都有哪些
MP3播放器
嘉楠科技曝光AI芯片新突破 联合AWS实现国内首家IC上云
微软游戏主管:微软和索尼比苹果和谷歌更有理由保留 30% 的抽成
lcd1602显示程序
小米6什么时候上市:小米6设计图曝光、配备双镜头!传4月16日发布
电气维修方法论第二十七篇(排查过程的繁难故障2)
国内外人工智能专家聚首RAIC雷克大会
安捷伦直流电源分析仪N6705B开机跳闸维修
挖掘数据:视觉AI初创企业“深挖”矿业和建筑业的数字孪生
新型智能移动电源
旭日X3派更新最小启动固件
亚马逊美国站纽扣电池锂电池新增UL4200A标准详解
压电偏转镜的特点、应用及参数
投资合计2750亿美元 特朗普:5G的竞争已经开始,美国必须赢得胜利!
美的与云米洗碗机专利战结果逐渐明朗美的保持赢面索赔额度或打折扣
区块链技术有什么价值
详解通信威纶通触摸屏与英威腾变频器的使用
手势识别+AR产品的特性和主要应用领域