当前位置: 首页 > article >正文

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


http://www.kler.cn/a/456708.html

相关文章:

  • swiftui开发页面加载发送请求初始化@State变量
  • 绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图
  • vue中使用exceljs组件库导入导出json到excel
  • FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持
  • 适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成
  • Qt仿音乐播放器:QFileDialog添加本地文件
  • 基于单片机的抽油烟机自动控制无级调速电路设计
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之2
  • QML 之过渡
  • MySQL Workbench菜单汉化为中文
  • WPF使用资源定义和样式资源,解耦视图与逻辑(较多样式重复的时候使用)
  • 有没有免费提取音频的软件?音频编辑软件介绍!
  • 【深度学习基础之多尺度特征提取】特征金字塔(Feature Pyramid)是如何在深度学习网络中提取多尺度特征的?附代码
  • curl -fsSL https://get.docker.com|sh 解释命令
  • Pytorch | 利用GRA针对CIFAR10上的ResNet分类器进行对抗攻击
  • doris集群存储目录切换
  • Function.prototype和Object.prototype 的区别
  • 【自动驾驶】3 激光雷达③
  • webflux版定时任务实现方案
  • LeetCode 242. 有效的字母异位词 (C++实现)
  • 超短波自组网如何守护森防安全?
  • Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据
  • AI开发 - 算法基础 递归 的概念和入门(一) 递归算法的常见应用 PYTHON
  • STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
  • Gavin Wood 的 Polkadot 2024 年度回顾:技术突破与未来的无限可能
  • 汽车的hmi设计还能有哪些创新?要从哪些方面下手