STM32-笔记13-红外避障模块-LCD1602模块
1、红外避障模块
红外避障模块不断发射红外信号,当红外信号:
1. 有反射回来,OUT 输出低电平,输出指示灯(绿灯)亮。
2. 没反射回来,OUT 输出高电平,输出指示灯(绿灯)灭。
2、实现项目文件
复制07-震动点灯项目文件,重命名13-红外避障模块
把红外避障接到B4口
把相应的函数名改一下就好
ia_flag
ia_flag_get();
ia_flag_set();
实现手挡住亮灯2秒
3、LCD1602(知识点介绍在C51笔记6中)
复制03-流水灯项目,重命名14-LCD1602模块
新建文件夹LCD1602以及对应的.c和.h文件
加载文件
编译
接线如下:
4、LCD1602显示一个字符
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "LCD1602.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();//初始化led灯
lcd1602_init();
lcd1602_show_char();
// led1_ON();
// led1_OFF();
while(1)
{
led1_ON();
led2_OFF();
delay_ms(500);
led1_OFF();
led2_ON();
delay_ms(500);
}
}
lcd1602.c
#include "LCD1602.h"
#include "delay.h"
//RS引脚定义
#define RS_GPIO_Port GPIOB
#define RS_GPIO_Pin GPIO_PIN_1
#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_Pin,GPIO_PIN_SET);
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_Pin,GPIO_PIN_RESET);
//RW引脚定义
#define RW_GPIO_Port GPIOB
#define RW_GPIO_Pin GPIO_PIN_2
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_Pin,GPIO_PIN_SET);
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_Pin,GPIO_PIN_RESET);
//EN引脚定义
#define EN_GPIO_Port GPIOB
#define EN_GPIO_Pin GPIO_PIN_10
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_Pin,GPIO_PIN_SET);
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_Pin,GPIO_PIN_RESET);
//初始化lcd1602函数
void lcd1602_init(void)
{
//初始化GPIO
lcd1602_gpio_init();
//上电初始化流程
lcd1602_start_init();
}
void lcd1602_gpio_init(void)
{
GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct
//打开时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//调用GPIOA初始化函数
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.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;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLUP;//上拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//调用GPIOB初始化函数
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_10;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLUP;//上拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOB,&gpio_initstruct);
}
void lcd1602_start_init(void)
{
//(1)延时 15ms
delay_ms(15);
//(2)写指令 38H(不检测忙信号)
lcd1602_write_cmd(0x38);
//(3)延时 5ms
delay_ms(5);
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置
lcd1602_write_cmd(0x38);
//(6)写指令 08H:显示关闭
lcd1602_write_cmd(0x08);
//(7)写指令 01H:显示清屏
lcd1602_write_cmd(0x01);
//(8)写指令 06H:显示光标移动设置
lcd1602_write_cmd(0x06);
//(9)写指令 0CH:显示开及光标设置
lcd1602_write_cmd(0x0C);
}
//写指令
void lcd1602_write_cmd(char cmd)
{
RS_LOW;
RW_LOW;
EN_LOW;
GPIOA->ODR = cmd;
delay_ms(5);
EN_HIGH;
delay_ms(5);
EN_LOW;
}
//写数据
void lcd1602_write_data(char dataShow)
{
RS_HIGH;
RW_LOW;
EN_LOW;
GPIOA->ODR = dataShow;
delay_ms(5);
EN_HIGH;
delay_ms(5);
EN_LOW;
}
//在一般情况下,不会让其读数据寄存器和指令寄存器的,因为用处不大,故在这里先不写了
//lcd1602显示内容,行,列,数据
void lcd1602_show_char()
{
//在哪里显示?
lcd1602_write_cmd(0x80+0x02);
//显示什么?
lcd1602_write_data('L');
}
lcd1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "sys.h"
void lcd1602_gpio_init(void);
void lcd1602_start_init(void);
void lcd1602_init(void);
void lcd1602_write_cmd(char cmd);
void lcd1602_write_data(char dataShow);
void lcd1602_show_char(void);
#endif
5、显示一行字符串
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "LCD1602.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();//初始化led灯
lcd1602_init();
lcd1602_show_char();
lcd1602_show_line(1,1,"hello");//第一行,第一列开始显示字符
lcd1602_show_line(2,2,"word");
// led1_ON();
// led1_OFF();
while(1)
{
led1_ON();
led2_OFF();
delay_ms(500);
led1_OFF();
led2_ON();
delay_ms(500);
}
}
lcd1602.c
#include "LCD1602.h"
#include "delay.h"
//RS引脚定义
#define RS_GPIO_Port GPIOB
#define RS_GPIO_Pin GPIO_PIN_1
#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_Pin,GPIO_PIN_SET);
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_Pin,GPIO_PIN_RESET);
//RW引脚定义
#define RW_GPIO_Port GPIOB
#define RW_GPIO_Pin GPIO_PIN_2
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_Pin,GPIO_PIN_SET);
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_Pin,GPIO_PIN_RESET);
//EN引脚定义
#define EN_GPIO_Port GPIOB
#define EN_GPIO_Pin GPIO_PIN_10
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_Pin,GPIO_PIN_SET);
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_Pin,GPIO_PIN_RESET);
//初始化lcd1602函数
void lcd1602_init(void)
{
//初始化GPIO
lcd1602_gpio_init();
//上电初始化流程
lcd1602_start_init();
}
void lcd1602_gpio_init(void)
{
GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct
//打开时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//调用GPIOA初始化函数
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.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;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLUP;//上拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//调用GPIOB初始化函数
gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_10;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLUP;//上拉
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOB,&gpio_initstruct);
}
void lcd1602_start_init(void)
{
//(1)延时 15ms
delay_ms(15);
//(2)写指令 38H(不检测忙信号)
lcd1602_write_cmd(0x38);
//(3)延时 5ms
delay_ms(5);
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置
lcd1602_write_cmd(0x38);
//(6)写指令 08H:显示关闭
lcd1602_write_cmd(0x08);
//(7)写指令 01H:显示清屏
lcd1602_write_cmd(0x01);
//(8)写指令 06H:显示光标移动设置
lcd1602_write_cmd(0x06);
//(9)写指令 0CH:显示开及光标设置
lcd1602_write_cmd(0x0C);
}
//写指令
void lcd1602_write_cmd(char cmd)
{
RS_LOW;
RW_LOW;
EN_LOW;
GPIOA->ODR = cmd;
delay_ms(5);
EN_HIGH;
delay_ms(5);
EN_LOW;
}
//写数据
void lcd1602_write_data(char dataShow)
{
RS_HIGH;
RW_LOW;
EN_LOW;
GPIOA->ODR = dataShow;
delay_ms(5);
EN_HIGH;
delay_ms(5);
EN_LOW;
}
//在一般情况下,不会让其读数据寄存器和指令寄存器的,因为用处不大,故在这里先不写了
//lcd1602显示内容,行,列,数据
void lcd1602_show_char()
{
//在哪里显示?
lcd1602_write_cmd(0x80+0x02);
//显示什么?
lcd1602_write_data('L');
}
void lcd1602_show_line(char row,char col,char *string)
{
switch(row)
{
case 1:
lcd1602_write_cmd(0x80 + col);
while(*string)
{
lcd1602_write_data(*string);
string++;
}
break;
case 2:
lcd1602_write_cmd(0x80 + 0x40+col);
while(*string)
{
lcd1602_write_data(*string);
string++;
}
break;
}
}
lcd1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "sys.h"
void lcd1602_gpio_init(void);
void lcd1602_start_init(void);
void lcd1602_init(void);
void lcd1602_write_cmd(char cmd);
void lcd1602_write_data(char dataShow);
void lcd1602_show_char(void);
void lcd1602_show_line(char row,char col,char *string);
#endif