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文件
#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文件
#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文件
#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); //写一个指针加1LCD1602_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);
}