2018科协硬件方向培训–显示屏部分
显示屏LCD的介绍
液晶显示器(LCD)的主要原理是以电流刺激液晶分子产生点,线,面并配合背部灯管构成画面。
各种型号的液晶通常按照显示字符的行数或液晶点阵的行,列数来命名。比如:1602的意思是每行显示16个字符,一共可以显示两行:类似的命名还有0801,1601等,这类液晶通常都是字符型液晶,而像12864液晶的意思液晶由128列,64行组成,即共有128*64个点来显示各种图形,这类液晶是图形型液晶。
液晶的体积小,功耗低,显示操作简单,但是其使用的温度范围很窄,通用型液晶正常工作温度0~+55℃。
LCD1602的介绍
本次培训以1602为例简单介绍LCD的使用,本次培训用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。
1.接口信号说明
2.主要技术参数
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
3.基本操作时序
1.读状态:输入:RS=L,RW=H,E=H
输出:D0~D7=状态字
2.写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲
输出:无
3.读数据:输入:RS=H,RW=H,E=H
输出:D0~D7=数据
4.写数据:输入:RS=W,RW=L,D0~D7=数据,E=高脉冲
输出:无
4.RAM地址映射图
控制器内部RAM缓冲区,对应关系如图所示:
当我们在00~0F,40~4F地址中的任一处写入显示数据时,液晶可以显示出来,当在其他地址写入数据时,必须通过移屏等指令操作将他们移入可显示区域,方能正常显示。
5.状态字说明
比较细心可以发现在1602的基本操作时介绍,输出D0~D7=状态字。
一般D0~D6都指当前地址指针的数值
而D7则是读写操作使能,1指禁止,0指允许。
注意:原则上每次对控制器进行读写操作之前,都必须进行读写检测,俗称判忙,确保D7为0。但实际上,由于51单片机的操作速度慢于液晶控制器的反应速度,因此可以进行简单短暂延时即可。
一般读写操作检测函数(判忙函数):
bit LCD1602_Check_Busy(void){
Data= 0xFF;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
return (bit)(Data & 0x80);
}
6.命令指令码
1602的操作时序中写指令,主要就是选用这些指令码。
除此之外还有数据指针设置:80H+地址码(0~27H,40~67H)
还有很多丰富的指令码。
LCD1602的编程
1.写操作时序
2.1602显示字符必要条件:
(1)液晶显示模式的设置
(2)字符显示位置的指定
(3)待显示字符的字模代码
因为1602内部CGRAM自带128个字符,我们显示需要的字符只用直接写入即可。然而要让LCD1602显示自定义字符,就得用到CGRAM指令,设置字库CGRAM地址命令码是0100 0000. 1602能存储8个自定义字符的首地址分别是:0X40,0X48,0X50,0X60,0X68,0X70,0X78
以0X40为例,它的存储空间如图:
我们一般用5*7点阵,但1602也可以调成5*8点阵显示模式,意思是用五列八行其余置0。然后显示如“上”字:
3.简单显示程序如下:
#include "reg52.h"
void LCD_init();
void LCD_write_com(unsigned char com);
void LCD_write_data(unsigned char dat);
void LCD_delayus(unsigned int c);
#define LCD1602 P0
sbit E=P2^7;
sbit RW=P2^5;
sbit RS=P2^6;
unsigned char DIS[]= "S";
void main(){
int i;
LCD_init();
LCD_write_com(0x80+0x40);
for(i=0;i<2;i++)
{
LCD_write_data(DIS[0]);
}
LCD_delayus(1000);
for(i=0;i<4;i++)
{
LCD_write_com(0x1c);
}
while(1);
}
void LCD_delayus(unsigned int c)
{
int i,j;
for(;c>0;c--)
for(i=119;i>0;i--)
for(j=1;j>0;j--);
}
void LCD_write_com(unsigned char com)
{
RS=0;
RW=0;
E=0;
LCD_delayus(1);
LCD1602=com;
E=1;
LCD_delayus(5);
E=0;
}
void LCD_write_data(unsigned char dat)
{
RS=1;
RW=0;
E=0;
LCD_delayus(1);
LCD1602 = dat;
E=1;
LCD_delayus(5);
E=0;
}
void LCD_init()
{
LCD_write_com(0x38);
LCD_write_com(0x0c);
LCD_write_com(0x06);
LCD_write_com(0x01);
LCD_write_com(0x80);
}
1602的使用介绍到此,当然1602只是LCD显示屏中很简单一个例子,它最对只能显示简单汉字,所以我们经常会有其他用处更广的LCD屏代替例如12864。希望大家多多学习,本次培训总结完毕。