(一)什么是LCD1602
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。
注意:LCD1602仅能显示字母、符号或数字,无法显示汉字。
(二)字符型液晶显示原理
点阵图形式液晶由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,常用16×1,16×2,20×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780,能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。
(三)LCD1602引脚表
引脚功能介绍:
·引脚1:VSS为地电源。
·引脚2:VDD接5V正电源。
·引脚3:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10kQ的电位器调整其对比度。
·引脚4:RS为寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。
·引脚5:R/W为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据。
·引脚6:E端为使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。
·引脚714:D0D7为8位双向数据线。
·引脚15:背光源正极。
·引脚16:背光源负极。
(四)控制器接口时序图
1:读操作时序图
2:写操作时序图
首先要对寄存器的选择和读、写操作选择进行配置。RS是寄存器选择,RS = 1对数据进行操作;RS = 0对指令进行操作。
接着对读写操作选择进行配置,RW = 0 写操作。
打开使能端,输入使能信号 E = 1。
数据总线,对DB0~DB7赋值,进行数据的传输
【注】如果先打开使能,再进行其他配置的话,有可能传输的数据不是自己想要的。
(五)1602的原理图
此部分是谱中科技单片机的1602原理图(大多数老师教学51单片机都是这块板子,如需要原理图请直接找我就好)
(六)1602的配置代码部分解读
1:端口的定义
#define LCD1602_PORT P0 //对数据传输口进行定义
sbit LCD1602_RS = P2^6; //命令端口
sbit LCD1602_RW = P2^5; //读写端口
sbit LCD1602_EN = P2^7; //使能端口
特别注意:端口一定别写错了!!!写错了无法显示。
2:写指令
void LCD1602_write_com(unsigned char com)
{
LCD1602_RS = 0;//写入命令
LCD1602_PORT = com;
LCD1602_delay_ms(1);
LCD1602_EN = 1;//使能端口高电平
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
3:写数据
void LCD1602_write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_PORT = dat;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
4:初始化
void Init_LCD1602()
{
LCD1602_EN = 0;
LCD1602_RW = 0; //设置为写状态
LCD1602_write_com(0x38);//显示模式设定
LCD1602_write_com(0x0c);//开关显示,光标有无设置、光标闪烁设置
LCD1602_write_com(0x06);//写一个字符后指针加一
LCD1602_write_com(0x01);//清屏指令
LCD1602_write_com(0x80);//设置数据指针起点
}
(七)LCD1602代码
1:lcd1602.c
#include "LCD1602.h"
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
//****************************************************
//写指令
//****************************************************
void LCD1602_write_com(unsigned char com)
{
LCD1602_RS = 0;
LCD1602_PORT = com;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
//****************************************************
//写数据
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_PORT = dat;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
//****************************************************
//连续写字符
//****************************************************
void LCD1602_write_word(unsigned char *s)
{
while(*s>0)
{
LCD1602_write_data(*s);
s++;
}
}
void Init_LCD1602()
{
LCD1602_EN = 0;
LCD1602_RW = 0;
LCD1602_write_com(0x38);
LCD1602_write_com(0x0c);
LCD1602_write_com(0x06);
LCD1602_write_com(0x01);
LCD1602_write_com(0x80);
}
2:LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include <reg52.h>
//LCD1602 IO设置
#define LCD1602_PORT P0
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;
//函数或者变量申明
extern void LCD1602_delay_ms(unsigned int n);
extern void LCD1602_write_com(unsigned char com);
extern void LCD1602_write_data(unsigned char dat);
extern void LCD1602_write_word(unsigned char *s);
extern void Init_LCD1602();
#endif
如有错误的地方,还请前辈们指出来!感激不尽!