我是靠谱客的博主 无限睫毛膏,最近开发中收集的这篇文章主要介绍STM32入坑(10)STM32驱动1602显示模块简介硬件配置方法注意事项,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

STM32驱动1602显示模块

  • 简介
  • 硬件
    • LCD1602引脚定义
  • 配置方法
    • 1 在.h文件中定义引脚和数据方向
    • 2 对GPIO初始化(E,RW,CS)
    • 3 读1602状态
    • 4 写1602命令
    • 5 写1602数据
    • 6 1602初始化
    • 7 编写主函数
      • 1. 定义一个要显示的数组
      • 2. 初始化1602的引脚
      • 3.初始化1602
      • 4. 写入命令和数据
  • 注意事项
    • 1.数据端口
    • 2.一次写入8位数据
    • 3. 等待可操作状态
    • 4. 不显示字符

简介

1602液晶它也可以被叫做1602字符型液晶,这个是一种只用来显示字母、数字、符号等的点阵型液晶模块。1602里面存储器有三种:CGROM、CGRAM、DDRAM。
关于1602的介绍,CSDN上太多了,但是基本都是用51实现的,发现基本没有用STM32实现的(可能因为太简单了吧)。这里就说说怎么用STM32驱动1602显示模块。

硬件

LCD1602引脚定义

引脚号
1: VSS ( 电源地)
2:: VDD ( 电源正极)
3:: V0 ( 偏压信号)
4:: RS ( 命令/数据)
5:: RW( 读/写)
6 : E ( 脉冲使能)
7 : D0 ( 数据端口)
8 : D1 ( 数据端口)
9:: D2 ( 数据端口)
10: D3 (数据端口)
11: D4 ( 数据端口)
12: D5 ( 数据端口)
13: D6 ( 数据端口)
14: D7( 数据端口)
15: A ( 背光正极)
16: K ( 背光负极)
帮助:
2、15 引脚接+5V;
3 引脚可接一个电位器调节显示屏亮度
1、16 引脚接GND
4-6 引脚接单片机的控制端口
7-14 引脚接单片机的数据端口

配置方法

1 在.h文件中定义引脚和数据方向

#define LCD_CS		PCout(9)//E 脉冲使能引脚
#define LCD_RW		PCout(8)//RW 读写引脚
#define LCD_RS		PCout(7)//RS 命令or数据引脚

#define SDA_IN		{GPIOB->CRH&=0X00000000;GPIOB->CRH|=0x44444444;}
#define SDA_OUT 	{GPIOB->CRH&=0X00000000;GPIOB->CRH|=0x33333333;}

注意:在定义数据传输方向时,一定不能忘记使能相应的端口。因为楼主在初始化的时候打开了GOIOB,所以在定义方向时就没有写了。如果使用其他端口一定要记得打开端口时钟,务必!!!

2 对GPIO初始化(E,RW,CS)

void LCD1602_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOC,&GPIO_InitStruct);
}

注意:我在这里打开了GPIOB的时钟。

3 读1602状态

void Read1602_status(void)
{
	uint8_t sta=0;
	SDA_IN;
	LCD_RS = 0;
	LCD_RW = 1;
	LCD_CS = 1;
	do
	{
		sta = ((GPIOB->IDR&0XFF00)>>8);
//		printf("sta=0x%xrn",sta);
	}while(sta&0X80);	//等待直到允许操作
	LCD_CS = 0;
}

4 写1602命令

void Write1602_cmd(uint8_t cmd)
{
	Read1602_status();	//µÈ´ýÔÊÐí²Ù×÷
	SDA_OUT;
	LCD_CS = 0;
	LCD_RS = 0;
	LCD_RW = 0;
	GPIOB->BSRR|=(0XFFFF<<16);
	delay_ms(1);
	GPIOB->BSRR|=((cmd<<8)&0xff00);
//	printf("GPIOB->ODR:0x%x  rn",GPIOB->ODR);
	delay_ms(1);
	LCD_CS = 1;
	delay_ms(1);
	LCD_CS = 0;
}

5 写1602数据

void Write1602_data(uint8_t data)
{
	Read1602_status();	//µÈ´ýÔÊÐí²Ù×÷
	SDA_OUT;
	LCD_CS = 0;
	LCD_RS = 1;
	LCD_RW = 0;
	GPIOB->BSRR|=(0XFFFF<<16);
	delay_ms(1);
	GPIOB->BSRR|=((data<<8)&0xff00);
//	printf("GPIOB->ODR:0x%x  n",GPIOB->ODR);
	delay_ms(1);
	LCD_CS = 1;
	delay_ms(1);
	LCD_CS = 0;
}

6 1602初始化

void LCD_init(void)
{
	Write1602_cmd(0x38);

	Write1602_cmd(0x0c);

	Write1602_cmd(0x06);
	
	Write1602_cmd(0x01);
}

7 编写主函数


int main(void)
{
	uint8_t i,times=0;
	uint8_t a[7]={"Niu Lei"};
	uint8_t b[11]={"15895949575"};
	uint8_t a1[39]={"If you have problem,you can call me!!!"};

	delay_init();
	uart_init(9600);
	LED_Init();
	LCD1602_GPIO_Init();
	GPIO_ResetBits(LED_PORT,LED_PIN);
	LCD_init();

	while(1)
	{
			Write1602_cmd(0X80);
			printf("seziof(a)=%drn",sizeof(a));
			for(i=0;i<sizeof(a);i++)
				Write1602_data(a[i]);

			Write1602_cmd(0X80+0x40);
			for(i=0;i<sizeof(b);i++)
				Write1602_data(b[i]);
			while(times<5)
			{
				delay_ms(50000);
				times++;
			}
			Write1602_cmd(0x01);
			times=0;
			
			Write1602_cmd(0X80);
			printf("seziof(a)=%drn",sizeof(a));
			for(i=0;i<sizeof(a1);i++)
				Write1602_data(a1[i]);
			delay_ms(10000);
			//以下实现字幕左移的效果
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x18);
			delay_ms(5000);
			Write1602_cmd(0x01);
	}
}

别被主函数那么长给吓到了,下面一长串代码只是实现字幕左移,不需要完全可以删了。
主要也就需要下面几个定义和函数:

1. 定义一个要显示的数组

uint8_t a[7]={“Niu Lei”};

2. 初始化1602的引脚

LCD1602_GPIO_Init();

3.初始化1602

LCD_init();

4. 写入命令和数据

		Write1602_cmd(0X80);
		for(i=0;i<sizeof(a);i++)
			Write1602_data(a[i]);
注:Write1602_cmd(0X80);即显示在第一行开始;

	for(i=0;i<sizeof(a);i++)
		Write1602_data(a[i]);即写入数组;

注意事项

1.数据端口

数据端口采用的是PB8-15

2.一次写入8位数据

51单片机可以一次写入8位,stm32作为其升级版当然也可以,不过要用这种方式:
GPIOB->BSRR|=(0XFFFF<<16);
delay_ms(1);
GPIOB->BSRR|=((cmd<<8)&0xff00);
(先将BSRR的高16位写入1,将端口B全部拉低;
再cmd左移8位&0xff00,将数据写入BSRR的高8位)
当然也可以直接写入ODR寄存器,不过看说明好像有被打断的风险,所以楼主采用写入BSRR的方式。

3. 等待可操作状态

do
{
	sta = ((GPIOB->IDR&0XFF00)>>8);

// printf(“sta=0x%xrn”,sta);
}while(sta&0X80); //等待直到允许操作
1602的第7位是其忙标志,可以检测第7位确定是否在忙得状态。 因为使用的端口是GPIOB的高8位,因此要右移。直到其输出为0,才结束while循环。

4. 不显示字符

1.检查数据端口有误接反,楼主就把D0-D7错误的街道了PB15-8;
2.检查3:: V0 ( 偏压信号) 调节的是否合适(忘了是电压太高还是太低,字会很浅甚至不显示);
3.检查端口是否使能
4.检查数据方向
5.检查发送的命令,地址,数据是否正确。

在这里插入图片描述

程序已经过调试验证
完整程序传送门:
https://download.csdn.net/download/m0_46195580/13749323

最后

以上就是无限睫毛膏为你收集整理的STM32入坑(10)STM32驱动1602显示模块简介硬件配置方法注意事项的全部内容,希望文章能够帮你解决STM32入坑(10)STM32驱动1602显示模块简介硬件配置方法注意事项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部