概述
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显示模块简介硬件配置方法注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复