基于51单片机LCD1602显示

文章目录[隐藏]

基于51单片机LCD1602显示

要在1602上显示字符,要大概明白1602液晶显示屏工作原理。
一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD是指显示的内容16×2,即最多只能显示32个字符。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。5X7点阵可以看做5行7列等间距分布的led灯,每一个灯相当于一个像素点,你要表达的字母或者数字都是由这些像素点组成的。只需控制灯的亮灭就可以了。
一般1602一共有16位引脚。(引脚作用如下表)

编号 符号 引脚作用 编号 符号 引脚作用
1 VSS 电源正级 9 D2 数据口
2 VDD 电源地 10 D3 数据口
3 VO 液晶显示对比度调节(即亮度需要接滑动电阻) 11 D4 数据口
4 RS 数据命令选择端(H\L) 12 D5 数据口
5 RW 读写选择端(H\L) 13 D6 数据口
6 E 使能端 14 D7 数据口
7 D0 数据口 15 BLA 背光电源正极
8 D1 数据口 16 BLK 背光电源负极

明白了引脚后,就可以将引脚链接到单片机用单片机I\O口来控制每一个引脚来让1602显示字符。编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);编程便主要围绕这三个管脚展开按照时序进行初始化,写命令,写数据。基本操作如下:
(1) 读状态:输入:RS=L, RW=H,E=H 输出:D0-D7=状态字。
(2) 写指令:输入:RS=L, RW=L,D0-D7=指令码,E=H,输出:无。
(3) 读数据:输入:RS=H, RW=H,E=H 输出:D0~D7=数据。
(4) 写数据:输入:RS=L,RW=H,D0-D7=数据,E=高脉冲,输出:无。

由于此次是让1602显示我们让1602显示的字符所以使用向1602写指令,写数据具体操做代码如下:

//写指令代码
void write_com(uint com){
	E=0;
	RS=0;
	P0=com;
	delay_ms(5);//软件延时
	E=1;
	delay_ms(5);
	E=0;
}
//写数据代码
void write_date(uint date){
	E=0;
	RS=1;
	P0=date;
	delay_ms(5);//软件延时
	E=1;
	delay_ms(5);
	E=0;
}

写指令就是向1602发送设置指令,如在那一行显示,从这一行的什么位置开始,显示时是滚动显示还是静态显示。
写数据就是将我们想要显示的字符用循环的方式写入1602。
显示指令设置(具体如下表)

指令码 功能
0 0 1 1 1 0 0 0 设置16X2显示,5X7点阵,8位数据口
0 0 0 0 1 D C B D=1开显示: D=0关显示;
C=1显示光标: C=0不显示光标
B=1光标闪烁; B=0 光标不显示
0 0 0 0 0 1 N S N=1当读或写一个字符后地址指针加1,且光标加1
N=0当读或写一个字符后地址指针减1,且光标减1
S=1,当写一个字符时,整屏显示左移(N=1)或右移(N=0), 以得到光标不移动而屏幕移动的效果
S=0,当写一个字符时,整屏显示不移动
0 0 0 1 0 0 0 0 光标左移
0 0 0 1 0 1 0 0 光标右移
0 0 0 1 1 0 0 0 整屏左移,同时光标跟随移动
0 0 0 1 1 1 0 0 整屏右移,同时光标跟随移动

将以上所需要的指令通过写指令函数写入1602来设置1602就是1602初始化,这次我们要让1602显示一行字符,初始化代码为:

void write_init(){
	E = 0;
	write_com(0x38);//开显示
	write_com(0x0c);//开显示不显示光标
	write_com(0x06);//写一个字符指针加1
	write_com(0x01);//清屏
	write_com(0x80);//设置数据指针起点
}

将以上设置好然后就可以用写数据将想要显示的显示在1602上了
代码如下

#include <reg52.h>                     
#define uint unsigned int
#define uchar unsigned char
sbit	RS=P3^1;
sbit	E=P3^2;
uchar code table[]="Welcome to china";
void delay(ms){
uint i,j;
	for(i=0;i<ms;i++){
	for(j=0;j<123;j++){
	}
 
	}
}
void write_com(uchar com){
	E=0;
	RS=0;
	P0=com;
	delay(5);
	E=1;
	delay(5);
	E=0;
}

void write_data(uchar dat){
	E=0;
	RS=1;
	P0=dat;
	delay(5);
	E=1;
	delay(5);
	E=0;
}

void init(){
    write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
}

void main(){
	uint i;
	init();
	write_com(0x80+0x40);
	for(i=0;i<16;i++){
	write_data(table[i]);
		delay(5);		
	}while(1);//这里是防止1602一闪一闪的显示就让代码跑一边在显示完后就停在那

}

仿真结果如下
在这里插入图片描述

版权声明:本文为CSDN博主「余玄机」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lucifer_min/article/details/112133408

生成海报
点赞 0

余玄机

我还没有学会写个人说明!

暂无评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

【STM32Cube笔记】12-配置外部中断

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配