目录
一、介绍
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);
}
四、实验效果
