【STM32】驱动LCD1602液晶8线并、4线并

这篇具有很好参考价值的文章主要介绍了【STM32】驱动LCD1602液晶8线并、4线并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

LCD1602液晶

引脚定义说明

字库概述 

LCD1602原理图

 LCD1602时序图

LCD1602代码

接线图

用结构体的方式显示字符

LCD1602动态显示数字

4线驱动LCD1602


lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件


LCD1602液晶

液晶模块和数码管相比,液晶模块会显得更加专业、漂亮。液晶显示器以其体积小、功耗低、超薄、轻巧、显示内容丰富、使用方便等等诸多有点,在电子设备、通讯、家用电器、仪器仪表等低功耗应用系统之中得到越来越广泛的应用了,使得这一些电子设备的人机界面变得越来越直观、越来越形象了,液晶模块现在已经广泛的应用于液晶电视机、电子表、复印机、计算器、便携式电脑、IC卡电话机、掌上型电子玩具、传真机等许多方面。1602的字符型液晶模块(带背光),是现在工控系统之中使用最为广泛的液晶屏之一了。1602采用了标准的16脚接口。

引脚定义说明

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

字库概述 

        1602的液晶模块内一般都是带有标准字库的,在内部的字符发生存储器(CGROM)已经是存储了192个5×7的点阵字符,32个5×10的点阵字符。另外还会有字符生成RAM(CGRAM) 512字节,供给用户来自定义字符,比如表1所示,这一些字符都有:英文字母的大小写、阿拉伯数组、常用的符号以及日文假名等,每一个字符都会有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示是模块会吧地址41H中的点阵字符图形给显示出来,我们就能看到字母“A”了。

        液晶显示模块时一个慢显示器件,所以在执行每一条指令之前都一定要确认模块得忙标志位为低电平,代表不忙,否则此指令会失效。要显示字符时需要先输入显示字符地址,也就是说告诉模块在哪里显示字符。

LCD1602原理图

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

 LCD1602时序图

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

RS = 0 写指令;RS = 1 写数据

LCD1602代码

LCD1602.c

#include "LCD1602.h"

void LCD1602_UserInit(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
	
	//配置控制I/O口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin   = RS | RW | EN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT, &GPIO_InitStructure);
	
	//配置数据I/O口
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin   = DATA;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT, &GPIO_InitStructure);	
}

void LCD1602_Write_Cmd_Data(uint8_t cmd, uint8_t data)
{
	if (cmd) //1 数据
	{        
		RS_HIGH;
		RW_LOW;
		EN_LOW;		
		GPIO_Write(DATA_PROT, data); Delay_ms(3);		
		EN_HIGH; Delay_ms(3);
		EN_LOW;		
	}        
	else	 //0 指令
	{
		RS_LOW;
		RW_LOW;
		EN_LOW;		
		GPIO_Write(DATA_PROT, data); Delay_ms(3);		
		EN_HIGH; Delay_ms(3);
		EN_LOW;
	}
}

void LCD1602_Write_Init(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x06);	//显示光标移动位置
	LCD1602_Write_Cmd_Data(CMD, 0x0C);	//开启显示 不显示光标 并且光标不闪烁
	LCD1602_Write_Cmd_Data(CMD, 0x01);	//清除屏幕内容
	LCD1602_Write_Cmd_Data(CMD, 0x80);	//设置起始地址
}

//开启显示
void LCD1602_Open(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x0C);
}

//关闭显示
void LCD1602_Shut(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x08);
}

/**
 * @brief  
 * @param  com  写的地址   //1602 第一行数据0x80~0x8F 第二行数据0xC0~0xCF
 * @param  num  写的长度
 * @param  *dat 写的内容
 * @retval 无
 */
void LCD1602_Write_Word_Display(uint8_t com, uint8_t num, uint8_t *dat)
{
	LCD1602_Write_Cmd_Data(CMD, com);
	for (uint8_t i = 0; i < num; i ++)
	{
		LCD1602_Write_Cmd_Data(DAT,*dat++);
	}
	
}

LCD1602.h 

#ifndef __LCD1602_H__
#define __LCD1602_H__

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#define RS	GPIO_Pin_0	//RS = 0,指令;RS = 1,数据
#define RW	GPIO_Pin_1	//RW = 0,写  ;RW = 1,读
#define EN	GPIO_Pin_2
#define CMD_PROT 	GPIOC

#define DATA 0x00FF	//0~7引脚
#define DATA_PROT	GPIOF

#define RS_HIGH GPIO_SetBits  (CMD_PROT, RS)
#define RS_LOW  GPIO_ResetBits(CMD_PROT, RS)

#define RW_HIGH GPIO_SetBits  (CMD_PROT, RW)
#define RW_LOW  GPIO_ResetBits(CMD_PROT, RW)

#define EN_HIGH GPIO_SetBits  (CMD_PROT, EN)
#define EN_LOW  GPIO_ResetBits(CMD_PROT, EN)

#define CMD 0	//代表RS = 0,指令
#define DAT 1	//代表RS = 1,数据

void LCD1602_UserInit(void);	//LCD1602初始化
void LCD1602_Write_Init(void);	//LCD1602写初始化
void LCD1602_Open(void);
void LCD1602_Shut(void);
void LCD1602_Write_Word_Display(uint8_t com, uint8_t num, uint8_t *dat);

#endif

主函数 

#include "stm32f10x.h"                  // Device header
//#include "Delay.h"
#include "LCD1602.h"

int main(void)
{
	Delay_Init (72);
	
	LCD1602_UserInit();		//LCD1602初始化
	LCD1602_Write_Init();	//LCD1602写初始化
//	LCD1602_Open();
//	LCD1602_Shut();
	LCD1602_Write_Word_Display(0x80, 16, (u8*)&"xiaoliangtongxue" );	
	
	while(1)
	{

	}
}

/***********************************END OF FILE***********************************/

接线图

(参考51单片机接线图)

RS RW EN 分别是PC0、PC1、PC2,数据线依次为PF0、PF1、PF2……

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

崩溃瞬间

插了好一会杜邦线,你竟然不亮 

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

 lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

这块LCD1602好像是坏了 

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

算了算了,继续敲


用结构体的方式显示字符

在LCD1602.h文件里添加结构体的声明

//使用结构体
typedef struct{
	uint8_t com;
	uint8_t num;
	uint8_t *data;
}LCD_InitTypeDef;

将LCD1602.c文件里最后一个函数的形参改成结构体,函数里对应的数据也要修改成结构体成员

void LCD1602_Write_Word_Display(LCD_InitTypeDef  LCD_InitStructure)
{
	LCD1602_Write_Cmd_Data(CMD, LCD_InitStructure.com);
	for (uint8_t i = 0; i < LCD_InitStructure.num; i ++)
	{
		LCD1602_Write_Cmd_Data(DAT,*LCD_InitStructure.data++);
	}
	
}

main.c

#include "stm32f10x.h"                  // Device header
//#include "Delay.h"
#include "LCD1602.h"

LCD_InitTypeDef  LCD_InitStructure;

int main(void)
{
	Delay_Init (72);
	
	LCD1602_UserInit();		//LCD1602初始化
	LCD1602_Write_Init();	//LCD1602写初始化
//	LCD1602_Open();
//	LCD1602_Shut();	
	
	LCD_InitStructure.com = 0xC0;	//第二行
	LCD_InitStructure.num = sizeof("xinniankuaile666")-1;	//计算长度
	LCD_InitStructure.data = (u8*)&"xinniankuaile666";	//显示的内容
	
	LCD1602_Write_Word_Display(LCD_InitStructure);	
	while(1)
	{

	}
}

LCD1602动态显示数字

void LCD1602_Number_Display(u8 com, u8 num)	//数据范围0~255
{
	const u8 numcode[] = {"0123456789"};	//只读,不可修改
	
	LCD1602_Write_Cmd_Data(CMD, com);
	LCD1602_Write_Cmd_Data(DAT, numcode[num/100]);//数位分离
	LCD1602_Write_Cmd_Data(DAT, numcode[num/10%10]);
	LCD1602_Write_Cmd_Data(DAT, numcode[num%10]);
}

while(1)里的代码

for(u8 i = 0; i < 255; i ++)
{
    LCD1602_Number_Display(0x87, i);
    Delay_ms(300);
}

4线驱动LCD1602

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件

只用4567  四个数据引脚 

数据以四位四位的方式发送

代码部分

#include "LCD1602.h"

void LCD1602_UserInit(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
	
	//配置控制I/O口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin   = RS | RW | EN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT, &GPIO_InitStructure);
	
	//配置数据I/O口
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin   = DATA;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT, &GPIO_InitStructure);	
}

/*4线传输*/
void LCD1602_Write_Cmd_Data(uint8_t cmd, uint8_t data)
{
//	/*代码优化*/
//	if (cmd) //1 数据       
//		RS_HIGH;
//	else	 //0 指令
//		RS_LOW;
	
	//对上面四行代码继续优化,用到了三目运算符
	(CMD) ? RS_HIGH : RS_LOW;
	
	
	//依次执行
	RW_LOW;
	EN_LOW;	
	
	GPIO_Write(DATA_PROT, data | 0x0f); Delay_ms(3);//传输高四位数据	
	EN_HIGH; Delay_ms(3);
	EN_LOW;
	
	GPIO_Write(DATA_PROT, (data << 4) | 0x0f); Delay_ms(3);//左移四位,将低四位数据传输
	EN_HIGH; Delay_ms(3);
	EN_LOW;	
	 
	
}

void LCD1602_Write_Init(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x33);	//设置显示模式
	LCD1602_Write_Cmd_Data(CMD, 0x32);	//设置8线转4线显示模式
	LCD1602_Write_Cmd_Data(CMD, 0x28);	//设置指定模式初始化
	LCD1602_Write_Cmd_Data(CMD, 0x06);	//显示光标移动位置
	LCD1602_Write_Cmd_Data(CMD, 0x0C);	//开启显示 不显示光标 并且光标不闪烁
	LCD1602_Write_Cmd_Data(CMD, 0x01);	//清除屏幕内容
	LCD1602_Write_Cmd_Data(CMD, 0x80);	//设置起始地址
}

//开启显示
void LCD1602_Open(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x33);	//设置显示模式
	LCD1602_Write_Cmd_Data(CMD, 0x32);	//设置8线转4线显示模式
	LCD1602_Write_Cmd_Data(CMD, 0x28);	//设置指定模式初始化
	LCD1602_Write_Cmd_Data(CMD, 0x0C);
}

//关闭显示
void LCD1602_Shut(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x33);	//设置显示模式
	LCD1602_Write_Cmd_Data(CMD, 0x32);	//设置8线转4线显示模式
	LCD1602_Write_Cmd_Data(CMD, 0x28);	//设置指定模式初始化
	LCD1602_Write_Cmd_Data(CMD, 0x08);
}

/**
 * @brief  
 * @param  com  写的地址   //1602 第一行数据0x80~0x8F 第二行数据0xC0~0xCF
 * @param  num  写的长度
 * @param  *dat 写的内容
 * @retval 无
 */
void LCD1602_Write_Word_Display(LCD_InitTypeDef  LCD_InitStructure)
{
	LCD1602_Write_Cmd_Data(CMD, LCD_InitStructure.com);
	for (uint8_t i = 0; i < LCD_InitStructure.num; i ++)
	{
		LCD1602_Write_Cmd_Data(DAT,*LCD_InitStructure.data++);
	}
	
}

void LCD1602_Number_Display(u8 com, u8 num)	//数据范围0~255
{
	const u8 numcode[] = {"0123456789"};	//只读,不可修改
	
	LCD1602_Write_Cmd_Data(CMD, com);
	LCD1602_Write_Cmd_Data(DAT, numcode[num/100]);//数位分离
	LCD1602_Write_Cmd_Data(DAT, numcode[num/10%10]);
	LCD1602_Write_Cmd_Data(DAT, numcode[num%10]);
}

#ifndef __LCD1602_H__
#define __LCD1602_H__

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

//使用结构体
typedef struct{
	uint8_t com;
	uint8_t num;
	uint8_t *data;
}LCD_InitTypeDef;

#define RS	GPIO_Pin_0	//RS = 0,指令;RS = 1,数据
#define RW	GPIO_Pin_1	//RW = 0,写  ;RW = 1,读
#define EN	GPIO_Pin_2
#define CMD_PROT 	GPIOC

#define DATA 0x00F0	//4~7引脚
#define DATA_PROT	GPIOF

#define RS_HIGH GPIO_SetBits  (CMD_PROT, RS)
#define RS_LOW  GPIO_ResetBits(CMD_PROT, RS)

#define RW_HIGH GPIO_SetBits  (CMD_PROT, RW)
#define RW_LOW  GPIO_ResetBits(CMD_PROT, RW)

#define EN_HIGH GPIO_SetBits  (CMD_PROT, EN)
#define EN_LOW  GPIO_ResetBits(CMD_PROT, EN)

#define CMD 0	//代表RS = 0,指令
#define DAT 1	//代表RS = 1,数据

void LCD1602_UserInit(void);	//LCD1602初始化
void LCD1602_Write_Init(void);	//LCD1602写初始化
void LCD1602_Open(void);
void LCD1602_Shut(void);

void LCD1602_Write_Word_Display(LCD_InitTypeDef  LCD_InitStructure);

void LCD1602_Number_Display(u8 com, u8 num);

#endif
#include "stm32f10x.h"                  // Device header
//#include "Delay.h"
#include "LCD1602.h"

LCD_InitTypeDef  LCD_InitStructure;

int main(void)
{
	Delay_Init (72);
	
	LCD1602_UserInit();		//LCD1602初始化
	LCD1602_Write_Init();	//LCD1602写初始化
	LCD1602_Open();
//	LCD1602_Shut();		
	
	LCD_InitStructure.com = 0xC0;	//第二行
	LCD_InitStructure.num = sizeof("xinniankuaile666")-1;	//计算长度
	LCD_InitStructure.data = (u8*)&"xinniankuaile666";	//显示的内容
	LCD1602_Write_Word_Display(LCD_InitStructure);	
	
	while(1)
	{
		for(u8 i = 0; i < 255; i ++)
		{
			LCD1602_Number_Display(0x87, i);
			Delay_ms(300);
		}
		
	}
}

好像是这个函数没有取消注释才不亮 LCD1602_Open();

lcd1602接stm32,STM32标准库,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-575661.html

到了这里,关于【STM32】驱动LCD1602液晶8线并、4线并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Stm32F103RC驱动ili9488 LCD TFT 3.5寸液晶屏

    芯片:stm32f103rct6 3.5寸屏幕驱动:ili9488 驱动方式:8080 接口方式:16位并口 LCD屏幕 Stm32引脚 LCD_CS PC9 LCD_RS PC8 LCD_WR PC7 LCD_RD PC6 D0-D15 PB0~15

    2024年02月15日
    浏览(40)
  • 51单片机 | LCD1602 液晶显示实验

      在前面章节,我们已经学习过几种显示装置,例如静态数码管、动态数码管、 8*8LED 点阵、串口通信。使用它们可以直观显示一些字符数据,但是它们也有各种局限性,比如显示字符数据太少,硬件设计复杂、代码编写难度大等。这一章就来介绍一种非常简单且常用的显

    2023年04月11日
    浏览(60)
  • STM32—LCD1602

    LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行) 第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会产生“鬼影”,使用时可以通过一个

    2024年02月04日
    浏览(26)
  • 51单片机LCD1602液晶屏显示方法

    以显示hello,world!    2022.10.17  为例。 首先把LCD1602的模块化程序添加到项目目录中,模块化方法在51单片机之程序模块化_学习笔记吧的博客-CSDN博客这里可以学习。 实验程序: LCD1602.c文件代码: LCD1602.h文件代码: 把这两个代码,分别添加到LCD1602.c 和 LCD1602.h 文件,然后添加

    2023年04月08日
    浏览(50)
  • 51单片机学习笔记-12LCD1602液晶屏

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字

    2024年02月11日
    浏览(49)
  • 【STM32】LCD液晶显示

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! 显示器属于计算机的 I/O 设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见的有 CRT 显示器、液晶显示器、 LED 点阵显示器及 OLED 显示器。本

    2024年02月03日
    浏览(42)
  • 【51单片机】LCD1602 液晶显示实验指导书

             来介绍一种非常简单且常用的显示装置——LCD1602 液晶显示器,使用它可以显示更多的字符数字。这将有助于我们清晰的观察程序的运行结果,更加方便我们的后续调试和开发。         我们的开发板上集成了一个 LCD1602 液晶显示器接口,将LCD1602 液晶对应插

    2024年02月01日
    浏览(59)
  • 单片机C语言实例:18、LCD1602液晶显示

    学单片机的小朋友应该都见过这个显示器--LCD1602,这是最古老最简单的显示屏,上世纪80年代的产物。 它显示的图案如下所示 显示部分放大就是下面这样 ,像素就是一个个小方块,相当于描点法绘图了。 如果把所有像素全部显示出来就是下面这样,全部是小黑点  全部点亮

    2024年02月09日
    浏览(45)
  • STM32—LCD液晶显示屏

    目录 LCD液晶显示屏介绍 液晶的组成  物理特性 液晶显示屏内部构造  颜色深度 点亮LCD显示屏 查看原理图 图片显示 保存到工程用户代码的Inc目录下 参数为数组名 字符显示  汉字显示 某些物质在熔融状态或被溶剂溶解之后,尽管失去固态物质的刚性,却获得了液体的易流动

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包