LCD1602的使用(51单片机)[亲测有效]

(63) 2023-06-26 17:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说LCD1602的使用(51单片机)[亲测有效],希望能够帮助你!!!。

LCD1602

最近想做一个东西,8位数码管显示不来,于是目光转向了我尘封已久的LCD1602,并学习其原理记录与博客。

文章目录

  • LCD1602
    • 各个数字代表的含义
    • 实物图
    • 对应实物图的端口说明
    • 接线
    • 时序图
      • 读时序
      • 写时序
      • 对应时序的参数
    • 代码
    • 执行结果
    • 代码
      • 下载链接
      • 解压密码

各个数字代表的含义

LCD:液晶显示器
16:16列
02:2行

实物图

LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第1张

对应实物图的端口说明

LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第2张

接线

RW对应P2^5
RS对应P2^6
E对应P2^7
D0到D7对应P00到P07
LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第3张

时序图

读时序

LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第4张

写时序

LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第5张

对应时序的参数

LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第6张

代码

代码分为三个,分别为:LCD1602.h,LCD1602.c,main.c三个文件。

LCD1602.h主要做一些函数声明,以及端口定义,防止后面调用函数出错。

LCD1602.c实现.h当中的一些函数功能,使代码简洁被调用。

main.c用户文件,用户通过调用写好的LCD1602.h就可以调用相应的功能。

LCD1602.h

#include <reg51.h>
#ifndef _LCD1602_H_ //防止多次调用这个头文件
#define _LCD1602_H_
#define DataBuffer P0 //将P0口换个名字并且作为D0~D7的数据端口,对应单片机P00~P07

sbit LCD1602_E=P2^7;			//对应LCD1602的E端口
sbit LCD1602_RW=P2^5;			//对应RW
sbit LCD1602_RS=P2^6;			//对应RS
		
void LCD1602INIT(char mode);		//LCD1602初始化函数的声明
	
void LCD1602WriteCmd(char cmd);		//写命令函数声明
	
void LCD1602WriteData(char dat);	//写数据函数声明

void LCD1602CheckBusy();			//检测忙函数声明

void LCD1602Delay1ms(unsigned int ms);		//对应11.0952晶振的1ms延时函数声明

#endif

LCD1602.c

#include "LCD1602.h"
char LCD1602_Mode;

void LCD1602Delay1ms(unsigned int ms)
{ 
   
	//@11.0592MHZ
	unsigned int i;
	unsigned int j;
	for(i=0;i<ms;i++){ 
   
		for(j=0;j<125;j++);
	}
}

void LCD1602INIT(char mode)
{ 
   
	LCD1602_Mode = mode;
	if(LCD1602_Mode == 8){ 
   
		LCD1602WriteCmd(0x38);//开启显示
		LCD1602WriteCmd(0x0c);//开启显示不显示光标
		LCD1602WriteCmd(0x06);//开启指针向后移
		LCD1602WriteCmd(0x01);//清屏
		LCD1602WriteCmd(0x80);//设置数据起始位置
	}else{ 
   
		LCD1602WriteCmd(0x32);	 //将8位数据初始化为4位数据
		LCD1602WriteCmd(0x28);	 //初始化4位数据
		LCD1602WriteCmd(0x0c);  
		LCD1602WriteCmd(0x06);  
		LCD1602WriteCmd(0x01);  
		LCD1602WriteCmd(0x80);  
	}
}
	
void LCD1602WriteCmd(char cmd)
{ 
   
	if(LCD1602_Mode ==8 ){ 
   //8位数据线模式
		LCD1602CheckBusy();	
		LCD1602_RS = 0;//对应写的时序图对参数调整编程
		LCD1602_RW = 0;
		LCD1602_E = 0;
		DataBuffer = cmd;
		LCD1602Delay1ms(1);	// 等待数据装填
	
		LCD1602_E=1;// 写入时序
		LCD1602Delay1ms(5);
		LCD1602_E=0;
	}else{ 
   //4位数据线模式
		LCD1602CheckBusy();	
		LCD1602_RS = 0;
		LCD1602_RW = 0;
		LCD1602_E = 0;
		DataBuffer = cmd;
		LCD1602Delay1ms(1);	
	
		LCD1602_E=1;
		LCD1602Delay1ms(5);
		LCD1602_E=0;
		
		DataBuffer = cmd<<4;
		LCD1602Delay1ms(1);	
	
		LCD1602_E=1;
		LCD1602Delay1ms(5);
		LCD1602_E=0;
	}
}
	
void LCD1602WriteData(char dat)
{ 
   
	if(LCD1602_Mode ==8 ){ 
   	//8位数据线模式
		LCD1602CheckBusy();	// 检测忙
		LCD1602_RS = 1;			//对应写的时序图对参数调整编程
		LCD1602_RW = 0;
		LCD1602_E = 0;
		DataBuffer = dat;
		LCD1602Delay1ms(1);	// 等待数据装填

		LCD1602_E=1;// 写入时序
		LCD1602Delay1ms(5);
		LCD1602_E=0;
	}else{ 
   				//4位数据线模式
		LCD1602CheckBusy();	 
		LCD1602_RS = 1;
		LCD1602_RW = 0;
		LCD1602_E = 0;
		DataBuffer = dat;
		LCD1602Delay1ms(1);	
	
		LCD1602_E=1;
		LCD1602Delay1ms(5);
		LCD1602_E=0;
		
		DataBuffer = dat<<4;
		LCD1602Delay1ms(1);	
	
		LCD1602_E=1;
		LCD1602Delay1ms(5);
		LCD1602_E=0;
	}
}

void LCD1602CheckBusy()				//按照读的时序图,读取LCD1602的最高位,这个最高位
{ 
   									//是LCD1602的忙位,如果在工作中这个位会置高,所以对
	char temp = 0x80;				//这个位置进行检测,如果忙会一直循环到他不忙然后才能
									//退出
	do{ 
   
		LCD1602_RS = 0;
		LCD1602_RW = 1;
		LCD1602_E = 0;
		LCD1602Delay1ms(1);
		LCD1602_E = 1;
		LCD1602Delay1ms(1);
		temp = DataBuffer;
		LCD1602Delay1ms(1);
		LCD1602_E = 0;
	}while(temp & 0x80);
}

main.c

#include <reg51.h>
#include "LCD1602.h"
/* row行 col列 *dat数据 */
void LCD1602_Display(char row,char col,char *dat)
{ 
   
// char *src = dat;
	switch(row){ 
   
		case 1:
			LCD1602WriteCmd(0x80+col);			//第row行第col列设置
			break;
		case 2:
			LCD1602WriteCmd(0x80+0x40+col);		//第row行第col列设置
			break;
	}
	while(*dat!='\0'){ 
   							//写入数据
		LCD1602WriteData(*dat);
		dat++;
	}
}

void main()
{ 
   
	int i=0;
	LCD1602INIT(8);								//初始化8位数据线
	LCD1602_Display(2,2,"ZHANG JIA JU");		//在第二行第二列写入数据
	while(1);
}

执行结果

LCD1602的使用(51单片机)[亲测有效]_https://bianchenghao6.com/blog__第7张

代码

下载链接

https://download.csdn.net/download/qq_52749711/87365912

解压密码

https://blog.csdn.net/qq_52749711

此文如果对观看者有帮助,可以选择支持一下,关注,点赞,也欢迎高手们评论指点。
持续进攻Linux嵌入式

上一篇

已是最后文章

下一篇

已是最新文章

发表回复