普中51单片机学习笔记-LCD1602液晶显示

一、LCD1602简介

LCD1602是一种字符型液晶显示模块,能够显示2行,每行16个字符(16x2)。它采用标准的HD44780控制器,通过并行接口与微控制器通信。

二、主要特性

  1. 显示容量:16列×2行(32个字符)

  2. 字符尺寸:5×8点阵

  3. 工作电压:5V

  4. 接口类型:4位或8位并行接口

  5. 内置字符集:包括ASCII字符、日文片假名等

  6. 指令功能:显示开关、光标控制、屏幕移动等

三、引脚功能(16引脚)

引脚 符号 功能说明
1 VSS 电源地(GND)
2 VDD 电源正(+5V)
3 V0 对比度调整电压(0-5V)
4 RS 寄存器选择:0=指令寄存器,1=数据寄存器
5 R/W 读写选择:0=写入,1=读取
6 E 使能信号(下降沿触发)
7-14 D0-D7 数据总线(4位模式时使用D4-D7)
15 A 背光正极(+5V)
16 K 背光负极(GND)

四、硬件电路

五、示例代码

main.c

复制代码
#include "public.h"
#include "lcd1602.h"

/*******************************************************************************
* 函 数 名       : main
* 函数功能		  : 主函数
* 输    入       : 无
* 输   出		  : 无
*******************************************************************************/
void main()
{
	lcd1602_init();//LCD1602初始化
	lcd1602_show_string(0,0,"Hello World!");//第一行显示
	lcd1602_show_string(0,1,"0123456789");//第二行显示
	while(1)
	{
		
	}
}

public.h

复制代码
#ifndef __PUBLIC_H__
#define __PUBLIC_H__

#include <reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

void delay_10us(u16 ten_us);
void delay_ms(u16 ms);

#endif

public.c

复制代码
#include "public.h"

/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能		  : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输   出		  : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

/*******************************************************************************
* 函 数 名       : delay_ms
* 函数功能		  : ms延时函数,ms=1时,大约延时1ms
* 输    入       : ms:ms延时时间
* 输   出		  : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
}

lcd1602.h

复制代码
#ifndef __LCD1602_H__
#define __LCD1602_H__

#include "public.h"

//LCD1602接口定义
#define LCD1602_4OR8_DATA_INTERFACE 0 //0:8位数据接口,1:4位数据接口

//LCD1602引脚定义
sbit LCD1602_RS=P2^6;
sbit LCD1602_RW=P2^5;
sbit LCD1602_E=P2^7;
#define LCD1602_DATAPORT P0

//函数声明
void lcd1602_write_cmd(u8 cmd);
void lcd1602_write_data(u8 dat);
void lcd1602_init(void);
void lcd1602_clear(void);
void lcd1602_show_string(u8 x,u8 y,u8 *str);

#endif

lcd1602.c

复制代码
#include "lcd1602.h"

/*******************************************************************************
* 函 数 名       : lcd1602_write_cmd
* 函数功能		  : LCD1602写命令
* 输    入       : cmd:指令
* 输   出		  : 无
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_cmd(u8 cmd)
{
	LCD1602_RS=0;//选择命令
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=cmd;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入	
}
#else	 //4位LCD
void lcd1602_write_cmd(u8 cmd)
{
	LCD1602_RS=0;//选择命令
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=cmd;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入
	
	LCD1602_DATAPORT=cmd<<4;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入	
}
#endif

/*******************************************************************************
* 函 数 名       : lcd1602_write_data
* 函数功能		  : LCD1602写数据
* 输    入       : dat:数据
* 输   出		  : 无
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_data(u8 dat)
{
	LCD1602_RS=1;//选择数据
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=dat;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入		
}
#else
void lcd1602_write_data(u8 dat)
{
	LCD1602_RS=1;//选择数据
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=dat;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入
	
	LCD1602_DATAPORT=dat<<4;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入		
}
#endif

/*******************************************************************************
* 函 数 名       : lcd1602_init
* 函数功能		  : LCD1602初始化
* 输    入       : 无
* 输   出		  : 无
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_init(void)
{
	lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
	lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
	lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
	lcd1602_write_cmd(0x01);//清屏	
}
#else
void lcd1602_init(void)
{
	lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符
	lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
	lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
	lcd1602_write_cmd(0x01);//清屏	
}
#endif

/*******************************************************************************
* 函 数 名       : lcd1602_clear
* 函数功能		  : LCD1602清屏
* 输    入       : 无
* 输   出		  : 无
*******************************************************************************/
void lcd1602_clear(void)
{
	lcd1602_write_cmd(0x01);	
}

/*******************************************************************************
* 函 数 名       : lcd1602_show_string
* 函数功能		  : LCD1602显示字符
* 输    入       : x,y:显示坐标,x=0~15,y=0~1;
					  str:显示字符串
* 输   出		  : 无
*******************************************************************************/
void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
	u8 i=0;

	if(y>1||x>15)return;//行列参数不对则强制退出

	if(y<1)	 //第1行显示
	{	
		while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
		{
			if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
			{
				lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置	
			}
			else
			{
				lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置	
			}
			lcd1602_write_data(*str);//显示内容
			str++;//指针递增
			i++;	
		}	
	}
	else	 //第2行显示
	{
		while(*str!='\0')
		{
			if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
			{
				lcd1602_write_cmd(0x80+0x40+i+x);	
			}
			else
			{
				lcd1602_write_cmd(0x80+i+x-16);	
			}
			lcd1602_write_data(*str);
			str++;
			i++;	
		}	
	}				
}

完结,撒花~

相关推荐
hetao17338372 小时前
2025-12-30 hetao1733837 的刷题笔记
c++·笔记·算法
HyperAI超神经2 小时前
【vLLM 学习】Reproduciblity
人工智能·深度学习·学习·cpu·gpu·编程语言·vllm
好奇龙猫2 小时前
【大学院-筆記試験練習:数据库(データベース問題訓練) と 软件工程(ソフトウェア)(4)】
学习
YJlio2 小时前
LDMDump 学习笔记(13.9):动态磁盘元数据“黑盒”拆解工具
windows·笔记·学习
DisonTangor2 小时前
腾讯开源混元翻译——HY-MT1.5
学习·自然语言处理·开源·aigc
找方案2 小时前
我的 hello-agents 学习笔记:框架开发实践,从调用到玩转的进阶之路
人工智能·笔记·学习·hello-agents
青w韵2 小时前
最新SpringAI-1.1.2接入openai兼容模型
java·学习·ai·springai
小徐不会敲代码~2 小时前
Vue3 学习 6
开发语言·前端·vue.js·学习
Cephas、2 小时前
CANoe 操作手册 - Panel
笔记