文章目录
- 前言
- 一、液晶介绍
- 1.芯片引脚功能介绍
- 2.读写数据/指令
- 3.显存
- 二、源码
- 总结
提示:以下是本篇文章正文内容
一、液晶介绍 1.芯片引脚功能介绍 符 号 名 称功 能Vss接地0VVDDVDDVEE液晶驱动电压,保证VDD-VEE=4.5∽5V电压差RS寄存器选择信号 H:数据寄存器 L:指令寄存器R/W读/写信号 H:读 L:写E片选信号下降沿触发,锁存数据DB0-DB7数据线 数据传输 2.读写数据/指令头文件
#ifndef __lcd1602_H
#define __lcd1602_H
#include "stm32f4xx.h" // Device header
#include "sys.h"
/*
RS:是命令 / 数据选择引脚; 当 RS为低电平时,选择命令;当RS为高电平时,选择数据。
RW:是读 / 写选择引脚; 当 RW为低电平时,向 LCD1602写入命令或数据;当 RW为高电平时,从 LCD1602读取状态或数据。(如果不需要进行读取操作,可以直接将其接 VSS。)
E:执行命令的使能引脚,接单片机的一个 I/O 。
LCD1602的基本操作分为四种:
1. 读状态:输入 RS=0, RW=1 , E=高脉冲。输出: D0—D7为状态字。
2. 读数据:输入 RS=1, RW=1 , E=高脉冲。输出: D0—D7为数据。
3. 写命令:输入 RS=0, RW=0 , E=高脉冲。输出:无。
4. 写数据:输入 RS=1, RW=0 , E=高脉冲。输出:无。
*/
//拉高功能引脚
#define Set_RS GPIO_SetBits(GPIOC,GPIO_Pin_10)
#define Set_RW GPIO_SetBits(GPIOC,GPIO_Pin_11)
#define Set_EN GPIO_SetBits(GPIOC,GPIO_Pin_12)
//拉低功能引脚
#define Clr_RS GPIO_ResetBits(GPIOC,GPIO_Pin_10)
#define Clr_RW GPIO_ResetBits(GPIOC,GPIO_Pin_11)
#define Clr_EN GPIO_ResetBits(GPIOC,GPIO_Pin_12)
void LCD_Init(void);//LCD初始化
void LCD_Clear(void);//LCD清屏操作
void LCD_Display_Char(u8 x,u8 y,char dat);//LCD显示字符
void LCD_Display_Str(u8 x,u8 y,char *str);//LCD显示字符串
void LCD_RunDisplay(u8 x,u8 y,u8 *str,u8 RL);//LCD整屏滚动显示
#endif
源文件
#include "lcd1602.h"
#include "delay.h"
static void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择工作频率
GPIO_Init( GPIOC, &GPIO_InitStructure );
// PD0-8
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_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择工作频率
GPIO_Init( GPIOD, &GPIO_InitStructure );
}
//向GPIOD的低8位写入8位数据 接线从第几位开始就向左移几位
static void Write_Byte(u8 data)
{
GPIO_Write(GPIOD,data);//写操作最小的建立时间为40ns
delay_ms(10);
}
//LCD写命令
static void LCD_Write_Command(u8 cmd)
{
//配置写入命令
Clr_RS;
delay_ms(10);
Clr_RW;
delay_ms(10);
Set_EN;
delay_ms(10);
//写入命令操作
Write_Byte(cmd);//写完操作最小延迟10ns
delay_ms(5);
//写入完毕 拉低功能引脚
Clr_EN;
}
//LCD写数据
static void LCD_Write_Data(u8 dat)
{
//配置写入数据
Set_RS;
delay_ms(10);
Clr_RW;
delay_ms(10);
Set_EN;
delay_ms(10);
//写入命令操作
Write_Byte(dat);//写完操作最小延迟10ns
delay_ms(5);
//写入完毕 拉低功能引脚
Clr_EN;
}
//LCD初始化
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
LCD_Write_Command(0x38); //工作方式设置(8位数据接口,两行显示,5*8点阵)
delay_ms(5);
LCD_Write_Command(0x0C); //显示开关控制指令设置(显示开+光标不显示+光标不闪烁)
delay_ms(5);
/*
0x0E显示开+光标显示+光标不闪烁
0x0F显示开+光标显示+光标闪烁
*/
LCD_Write_Command(0x06); //光标模式设置指令(写入数据后光标右移 显示不移动)
delay_ms(5);
/*
0x07写入数据后右移+显示移动
0x05左移+显示移动
0x04左移+显示不移动
*/
LCD_Write_Command(0x01); //清屏设置
delay_ms(5);
//LCD_Write_Command(0x02);//光标归为 返回屏幕左上角 不改变屏幕显示内容
}
//清屏函数
void LCD_Clear(void)
{
LCD_Write_Command(0x01);
delay_ms(5);
}
//设置光标坐标
void Set_Cursor(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_Write_Command(0x80|(Column-1));
}
else if(Line==2)
{
LCD_Write_Command(0x80|(Column-1+0x40));
}
}
//显示字符串
void LCD_Display_Str(u8 x,u8 y,char *str)
{
Set_Cursor(x,y);
while(*str != '\0')
{
LCD_Write_Data(*str++);
}
}
//显示字符函数
void LCD_Display_Char(u8 x,u8 y,char dat)
{
Set_Cursor(x,y);
LCD_Write_Data(dat);
}
//长数据滚动显示
/*
@str:要显示的数据
@RL: 0:向左滚动 非零:向右移动
*/
void LCD_RunDisplay(u8 x,u8 y,u8 *str,u8 RL)
{
if(RL==0)
{
LCD_Write_Command(0x18);
}
else
LCD_Write_Command(0x1C);
Set_Cursor(x,y);
while(*str != '\0')
{
LCD_Write_Data(*str++);
}
}
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?