自学内容网 自学内容网

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


原文地址:https://blog.csdn.net/L_1068/article/details/144714057

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!