LCD1602液晶显示屏详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图​编辑

2.接口说明

三、程序设计

main文件

lcd1602.h文件

lcd1602.c文件

四、实验效果

五、资料获取

项目分享


一、介绍

LCD1602A字符型液晶显示模块是专门用于显示字母、数字元、符号等的点阵型液晶显示模块。分4位和8位数据传输方式。提供5×7点阵+光标的显示模式,最初代模块采用HD44780控制器,在各厂家生产的LCD1602模块中,基本也都采用了与之兼容的IC,所以特性上基本上一样的,只是字符颜色和背光不同。

以下是LCD1602液晶显示屏的参数:

|------|------------|
| 名称 | LCD1602A |
| 模块电压 | DC:5V |
| 工作电流 | 1.7mA(MAX) |
| 背光电流 | 24mA(MAX) |
| 驱动 | HDD44780 |
| 显示 | 蓝底白字/黄底黑字 |
| 工作温度 | -20℃~70℃ |

哔哩哔哩视频链接:

LCD1602液晶显示屏(STM32)

(资料分享见文末)

二、传感器原理

1.原理图

2.接口说明

三、程序设计

1.使用STM32F103C8T6将英文字符、数字和显示在LCD1602液晶显示屏上

|----|------|
| D0 | PA0 |
| D1 | PA1 |
| D2 | PA2 |
| D3 | PA3 |
| D4 | PA4 |
| D5 | PA5 |
| D6 | PA6 |
| D7 | PA7 |
| RS | PC13 |
| RW | PC14 |
| E | PC15 |

main文件

cpp 复制代码
#include "delay.h"
#include "sys.h"
#include "lcd1602.h"
#include "led.h"

/*****************辰哥单片机设计******************
											STM32
 * 项目			:	LCD1602液晶显示屏实验                     
 * 版本			: V1.0
 * 日期			: 2025.2.6
 * MCU			:	STM32F103C8T6
 * 接口			:	参看lcd1602.h							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

uint8_t Disp[]="HELLO";//后加4个空格

int main(void)
{
	SystemInit();//配置系统时钟为72M	
	delay_init(72);
	LED_Init();
	LED_On();
	LCD1602_Init();

	LCD1602_Write_String(0,0,"    HELLO!!!   ");//显示字符串
	LCD1602_Write_String(0,1,"                ");
	
	int i=0;
	
	while(1)
	{
		LED_Toggle();
		i++;
		delay_ms(500);
		LCD1602_WriteCom(0xC6);
		LCD1602_WriteData(i+0x30);
		
	}
}

lcd1602.h文件

cpp 复制代码
#ifndef __LCD1602_H
#define __LCD1602_H 
#include "sys.h"
#include "stdlib.h"	

/*****************辰哥单片机设计******************
											STM32
 * 文件			:	LCD1602液晶显示屏h文件                     
 * 版本			: V1.0
 * 日期			: 2025.2.6
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/

//----------------OLED端口定义----------------- 
/***************根据自己需求更改****************/
#define LCD1602_RS_GPIO_PORT				GPIOC
#define LCD1602_RS_GPIO_PIN					GPIO_Pin_13
				
#define LCD1602_RW_GPIO_PORT				GPIOC
#define LCD1602_RW_GPIO_PIN					GPIO_Pin_14
				
#define LCD1602_E_GPIO_PORT					GPIOC
#define LCD1602_E_GPIO_PIN					GPIO_Pin_15
				

/*********************END**********************/


#define LCD1602_RS_H   	GPIO_SetBits(LCD1602_RS_GPIO_PORT,LCD1602_RS_GPIO_PIN)
#define LCD1602_RS_L	 	GPIO_ResetBits(LCD1602_RS_GPIO_PORT,LCD1602_RS_GPIO_PIN)

#define LCD1602_RW_H		GPIO_SetBits(LCD1602_RW_GPIO_PORT,LCD1602_RW_GPIO_PIN)
#define LCD1602_RW_L		GPIO_ResetBits(LCD1602_RW_GPIO_PORT,LCD1602_RW_GPIO_PIN)

#define LCD1602_E_H   	GPIO_SetBits(LCD1602_E_GPIO_PORT,LCD1602_E_GPIO_PIN)
#define LCD1602_E_L  		GPIO_ResetBits(LCD1602_E_GPIO_PORT, LCD1602_E_GPIO_PIN)



void LCD1602_Init(void);
void LCD1602_WriteCom(uint8_t com);
void LCD1602_WriteData(uint8_t dat);
void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s);
void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data); 
void LCD1602_Clear(void); 


#endif

lcd1602.c文件

cpp 复制代码
#include "lcd1602.h"
#include "stdlib.h" 	 
#include "delay.h"

/*****************辰哥单片机设计******************
											STM32
 * 文件			:	LCD1602液晶显示屏c文件                     
 * 版本			: V1.0
 * 日期			: 20245.2.6
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 

**********************BEGIN***********************/



/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能		 : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/		

void LCD1602_Init(void)
{		
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;

	/*开启LED相关的GPIO外设时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
//LCD_RS引脚初始化
	GPIO_InitStructure.GPIO_Pin = LCD1602_RS_GPIO_PIN;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOC, &GPIO_InitStructure);	
	
//LCD_RW引脚初始化
	GPIO_InitStructure.GPIO_Pin = LCD1602_RW_GPIO_PIN;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
//LCD_E引脚初始化
	GPIO_InitStructure.GPIO_Pin = LCD1602_E_GPIO_PIN;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

//D0-D7引脚初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
	LCD1602_WriteCom(0x38);  //开显示
	LCD1602_WriteCom(0x0c);  //开显示不显示光标
	LCD1602_WriteCom(0x06);  //写一个指针加1
	LCD1602_WriteCom(0x01);  //清屏
	LCD1602_WriteCom(0x80);  //设置数据指针起点

}

void LCD1602_DATAPINS(uint8_t Date)
{
	uint16_t dat_buf;
	dat_buf=GPIO_ReadOutputData(GPIOA);
	dat_buf=dat_buf&0xFF00;
	dat_buf=dat_buf|Date;

	GPIO_Write(GPIOA, dat_buf);
	
}



void LCD1602_WriteCom(uint8_t com)	  //写入命令
{
	LCD1602_RS_L;	   //选择发送命令
	LCD1602_RW_L;	   //选择写入
	LCD1602_E_L;     //使能

	LCD1602_DATAPINS(com);     //放入命令
	delay_ms(1);		//等待数  据稳定

	LCD1602_E_H;	          //写入时序
	delay_ms(5);		  //保持时间
	LCD1602_E_L;

}

/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/		   
   
void LCD1602_WriteData(uint8_t dat)			//写入数据
{
	LCD1602_RS_H;	   //选择发送命令
	LCD1602_RW_L;	   //选择写入
	LCD1602_E_L;     //使能
	
	LCD1602_DATAPINS(dat);  //写入数据
	delay_ms(1);

	LCD1602_E_H;   //写入时序
	delay_ms(5);   //保持时间
	LCD1602_E_L;

}

/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
 void LCD1602_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
{     
 if (y == 0) 
 	{     
 	LCD1602_WriteCom(0x80 + x);    //第一行    
 	}    
 else 
 	{     
 	LCD1602_WriteCom(0xC0 + x);  //第二行     
 	}        
 LCD1602_WriteData( Data); //显示字符      
}
 



/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD1602_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
 if (y == 0) 
 	{     
	 LCD1602_WriteCom(0x80 + x);  //第一行   
 	}
 else 
 	{     
 	LCD1602_WriteCom(0xC0 + x);  //第二行   
 	}        
	while (*s) //判断是否检测到结尾符
 	{     
		 LCD1602_WriteData( *s);//显示字符     
		 s ++;  //指针加1   
 	}
 }
 
  /*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD1602_Clear(void) 
{ 
 LCD1602_WriteCom(0x01); 
 delay_ms(5);
}

四、实验效果

五、资料获取

项目分享

相关推荐
FAQEW3 小时前
Redis的简单介绍
数据库·redis·缓存
十夫长3 小时前
Redis Info 性能指标描述
数据库·redis·缓存
枫叶20003 小时前
OceanBase数据库-学习笔记4-租户
数据库·笔记·学习·oceanbase
夜光小兔纸6 小时前
SQL Server 数据库重命名
运维·数据库·sql server
多多*6 小时前
SQL语句练习 自学SQL网 多表查询
数据库·数据仓库·hive·hadoop·sql·mysql·mybatis
maomi_95267 小时前
Mysql之数据库基础
数据库·mysql
XY.散人7 小时前
初识Redis · 分布式锁
数据库·redis·分布式
Elastic 中国社区官方博客7 小时前
Elasticsearch:没有 “AG” 的 RAG?
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
南隅。8 小时前
【Redis】基础3:一些应用场景
数据库·redis