基于ST89C52在LCD1602显示hello word程序

LCD1602介绍

在这里插入图片描述
LCD1602相关引脚
在这里插入图片描述
LCD1602写命令、写数据相关操作图
在这里插入图片描述

根据上面时序图和时序参数图我们可以写出 写命令代码 和写数据代码

写命令 代码
写命令
void write_com(char command)
{
    
    
	RS = 0; 
	RW = 0; //高读低写
	LCD = command;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}
写数据 代码
写数据
void write_data(char data)
{
    
    
	RS = 1;
	RW = 0;
	LCD = data;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}

LCD1602显示程序步骤及如何初始化

1. 初始化
2. 写命令(RS=0)
3. 写数据(RS=1)

具体需要初始化什么?


1.显示开关控制指令(功能:控制显示器开/关 光标显示/关闭 是否闪烁)

2.进入模式设置指令(功能:每写入一位数据后光标的移动 左/右 显示屏不移动/整体右移 )

3.功能设定指令(功能:设定数据总线的位数 显示的行数 字型 )

4.清屏指令(功能:清屏显示空白 光标归位 地址计数器(AC)的值为05.显示位置设置(功能:指定在1602上哪个位置上显示数据)

具体指令相关介绍:

1.显示开关控制指令
在这里插入图片描述

write_com(0x0c);  //开显示功能 无光标 不闪烁

2.进入模式设置指令
在这里插入图片描述

write_com(0x06); //写入数据后光标自动右移 整屏不移动。

3.功能设定指令
在这里插入图片描述

	write_com(0x38); //数据总线8位 16X2显示 5*7点阵

4.清屏指令

write_com(0x01); //清屏 0000 0001

5.显示位置设置
在这里插入图片描述
如果想在1602屏幕上第一行第一个开始显示 就是0x80
如果想在1602屏幕上第二行第一个开始显示 就是0xc0

我这里就设置在第一行第三个开始显示hello word

write_com(0x83); //在1602第一行第3个开始显示

初始化代码

void init_lcd()
{
    
    	
	write_com(0x0c); //开显示功能 无光标 不闪烁
	write_com(0x06); //写入数据后光标自动右移 整屏不移动
	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
	write_com(0x01); //清屏 0000 0001
	write_com(0x83); //在1602第一行第3个开始显示
}

原理图及显示程序

在这里插入图片描述
在这里插入图片描述
引脚定义

//引脚定义
#define LCD P0
sbit E = P2^7;
sbit RS = P2^6;
sbit RW = P2^5;

lcd1602.h

void write_com(unsigned char command);	//写命令函数
void write_data(unsigned char dat);		//写数据函数
void init_lcd();  //初始化LCD1602函数
void delay5ms();  //延时5ms函数	

lcd1602.c

#include <reg52.h>
#include "lcd1602.h"

#define LCD P0
sbit E = P2^7;  //使能
sbit RS = P2^6; //数据/命令(H/L)
sbit RW = P2^5; //读写(H/L)

/******延迟5毫秒函数********/
void delay5ms()   //误差 -0.000000000001us
{
    
    
    unsigned char a,b;
    for(b=15;b>0;b--)
        for(a=152;a>0;a--);
}


/******LCD1602写命令函数********/
void write_com(unsigned char command)
{
    
    
	RS = 0; 
	RW = 0; 	//高读低写
	LCD = command;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;		//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}

/******LCD1602写数据函数********/
void write_data(unsigned char dat)
{
    
    
	RS = 1;
	RW = 0;
	LCD = dat;
	delay5ms(); //这里延时最低要30纳秒 我们直接给5ms
	E = 1;		//使能拉高 
	delay5ms(); //最低要求延迟150纳秒 我们直接给5ms
	E = 0;
}
/******初始化LCD1602********/
void init_lcd()
{
    
    	
	write_com(0x06); //写入数据后光标自动右移 整屏不移动。
	write_com(0x0c); //开显示功能 无光标 不闪烁
	write_com(0x38); //数据总线8位 16X2显示 5*7点阵
	write_com(0x01); //清屏 0000 0001
	write_com(0x83); //在1602第一行第3个开始显示
}

main.c

#include <reg52.h>
#include "lcd1602.h"

unsigned char array[] = {
    
    "hello word"};
unsigned char i = 0;


void main()
{
    
    
	//1.初始化lcd1602
	init_lcd();
	//2.写数据(hello word)到LCD1602显示
	while(array[i] != '\0')
	{
    
    	
		write_data(array[i]);
		i++;
	}	
	while(1);
}

最终项目展示

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47457689/article/details/113190405