LCD1602驱动编写(基于51单片机)

从前村里的狗蛋捡到了阿拉丁神灯,狗蛋向神灯许了三个愿望。第一个愿望狗蛋说“我想学会如何驱动LCD1602”,神灯说:“so easy”,然后把这篇博客的链接发给了他。神灯问他还有两个愿望是什么,狗蛋说:“希望神灯给这篇博客点赞加评论”,神灯看了文章但是忘记点赞,三天后,神灯猝。

目录

1. LCD1602基本介绍
2. LCD1602原理图
3. 引脚说明
4. 基本时序操作
5. 状态字说明
6. 1602地址映射
7. 指令说明
8. 程序及仿真

OK,这当然是和大家开个玩笑,你们的肯定就是对我最大的支持与鼓励,在接触我们的1602之前先来放松一下神经,接下来,我们就来了解LCD1602不能说的秘密

管他三七二十一,我用液晶显示器————我国著名诗人1602

LCD1602基本介绍:

从他的名言中我们可以定性的知道,LCD1602是一款液晶显示器。
LCD是 Liquid Crystal Display也就是液晶显示器的英文缩写。
1602是由于他可显示的区域是由16列2行的小黑块构成,如下图:
在这里插入图片描述

LCD1602原理图:

在这里插入图片描述

引脚说明:

引脚 功能说明
GND、VCC 1,2号是电源正负极,15,16号是LCD背光电源正负极
VEE 液晶显示偏压信号,给的电压不同对比度有所区别
RS 数据/命令选择端(H/L)
RW 读写选择端(H/L)
E 液晶使能端
D0~D7 写入数据/命令端

基本时序操作:

操作 输入 输出
读状态 RS=L,RW=H,E=H D0~D7状态字
写指令 RS=L,RW=L.D0~D7=指令码,E=高脉冲
读数据 RS=H,RW=H,E=H D0~D7数据
写数据 RS=H,RW=L,D0~D7=数据,E=高脉冲

(高脉冲就是一个信号由0到1再到0一个非常短暂而迅速的过程)

状态字说明:

在这里插入图片描述
在每次进行读写操作时,要进行读写检测,确保STA7(D7)为0。
STA0~STA6(D0-D6)为最开始写入的指针地址。

1602地址映射图:

在这里插入图片描述
每一行有40个字节,但是只能显示前16个字节,后面的地址主要是为了显示移动字幕而设置。

指令说明:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体程序:

#include <reg52.h>

#define DB P3
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;

void read_sta();		//读状态
void write_data(unsigned char dat);	//写数据
void write_cmd(unsigned char cmd);		//写指令
void set_cursor(unsigned int x,unsigned int y);  //设置初始显示位置
void show_str(unsigned int x,unsigned int y,unsigned char *str); //显示字符
void lcd_init(); //初始化LCD1602


void main()
{
	lcd_init();
	show_str(0,0,"LQJ_LCD1206");
	show_str(0,1,"HELLO_WORLD");
	while(1);
}

void read_sta()
{
	unsigned char sta;
	DB = 0XFF;
	RS = 0;
	RW = 1;
	do
	{
		E = 1;
		sta = DB;
		E = 0;
	}
	while(sta & 0x80);    //检测到STA7=0,即可开始读写操作
}

void write_data(unsigned char dat)
{
	read_sta();      //对照写数据的时序来看
	RS = 1;
	RW = 0;
	DB = dat;
	E = 1;
	E = 0;
}

void write_cmd(unsigned char cmd)
{
	read_sta();
	RS = 0;         //写指令的时序来看
	RW = 0;
	DB = cmd;
	E = 1;   
	E = 0;
}

void set_cursor(unsigned int x,unsigned int y)
{
	unsigned char address;
	if(y == 0)           
		address = 0x00 + x;      //第一行,第x-1列
	else 
		address = 0x40 +x;       //第二行,第x-1列
	write_cmd(address | 0x80);   //地址或上1000 0000,写入STA0~STA6地址值
}

void show_str(unsigned int x,unsigned int y,unsigned char *str)
{
	set_cursor(x,y);       //设置起始位置
	while(*str != '\0')    //不等于结束符就继续写入数据
	{
		write_data(*str++);
	}
}

void lcd_init()
{
	write_cmd(0x38);      //0011 1000,设置16X2显示,5X7点阵,8位数据接口
	write_cmd(0x0c);      //0000 1100,开显示,不显示光标
	write_cmd(0x06);	  //0000 0110,读一个字符后地址指针加一
	write_cmd(0x01);      //0000 0001,显示清屏
}

在这里插入图片描述

原创文章 6 获赞 7 访问量 716

猜你喜欢

转载自blog.csdn.net/lqj11/article/details/105886134