STM32F4驱动LCD1602液晶


前言


提示:以下是本篇文章正文内容

一、液晶介绍

1.芯片引脚功能介绍

符 号 名 称功 能
Vss接地0V
VDDVDD
VEE液晶驱动电压,保证VDD-VEE=4.5∽5V电压差
RS寄存器选择信号 H:数据寄存器 L:指令寄存器
R/W读/写信号 H:读 L:写
E片选信号下降沿触发,锁存数据
DB0-DB7数据线 数据传输

2.读写数据/指令

在这里插入图片描述

3.显存

在这里插入图片描述

二、源码

头文件

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


总结

提示:这里对文章进行总结:

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值