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);
}

四、实验效果

五、资料获取

项目分享

相关推荐
松涛和鸣25 分钟前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa43 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦1 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i3 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.3 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql