【STM32单片机_(HAL库)】3-4-1【中断EXTI】【智能排队控制系统】LCD1602显示字符串

1.硬件

2.软件

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, 2, "STM32");
    lcd1602_show_line(2, 1, "HELLO");//从第一个格为0开始数

    while(1)
    { 

    }
}
  • LCD1602.c程序
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);

void lcd1602_init(void)//LCD1602初始化
{
    //初始化GPIO
    lcd1602_gpio_init();
    //上电初始化
    lcd1602_start();
}

void lcd1602_gpio_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    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;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOA, &gpio_initstruct);
    
    gpio_initstruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);
}

void lcd1602_start(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=0,根据写指令时序图
{
    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=1
{
    RS_HIGH;
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = dataShow;
    delay_ms(5);
    EN_HIGH;
    delay_ms(5);
    EN_LOW;
}

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);//第一行第col+1个位置,对照显存地址
            while(*string)
            {
                lcd1602_write_data(*string);
                string++;
            }
            break;
        
        case 2:
            lcd1602_write_cmd(0x80 + 0x40 + col);//第一行第col+1个位置,对照显存地址
            while(*string)
            {
                lcd1602_write_data(*string);
                string++;
            }
            break;
    }
}
  • LCD1602.h程序
c 复制代码
#ifndef __LCD1602_H__
#define __LCD1602_H__

#include "sys.h"

void lcd1602_init(void);
void lcd1602_gpio_init(void);
void lcd1602_start(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

3.实物效果

  • 硬件模块接线
LCD1602 STM32
VSS GND
VDD 5V
V0 GND
RS PB1
RW PB2
E PB10
D0 PA0
D1 PA1
D2 PA2
D3 PA3
D4 PA4
D5 PA5
D6 PA6
D7 PA7
BLA 3.3V
BLK GND

**注意:**STM32F103CBT6最小系统中PB2管脚与BOOT1为统一管脚,可在下载完程序后,将BOOT1跳线帽拔掉连接中间排针。

ST-Link下载方式

  • 实验现象
    LCD1602显示字符串。

LCD1602显示模块字符串keil源文件

相关推荐
boneStudent1 小时前
Day18:系统滴答定时器 (SysTick)
stm32·单片机·嵌入式硬件
d111111111d1 小时前
再STM32F103C8T6中小端存储和大端存储有什么不同,STM32F103C8T6用的是那个,为什么要这么使用?
笔记·stm32·单片机·嵌入式硬件·学习
云山工作室1 小时前
基于物联网的体温心率监测系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·课程设计
猫猫的小茶馆1 小时前
【ARM】VSCode和IAR工程创建
c语言·开发语言·arm开发·ide·vscode·stm32·嵌入式硬件
zephyr_zeng1 小时前
CubeMX项目轻松导入Vscode+EIDE编译
c语言·ide·vscode·stm32·mcu·物联网·编辑器
IAR Systems1 小时前
在IAR Embedded Workbench for Renesas RH850中开发和调试Renesas RH850 MCU
单片机·嵌入式硬件·rh850·iar
小李做物联网2 小时前
【物联网毕设】130.1基于单片机stm32的智慧民宿环境监测物联网嵌入式项目程序开发系统
stm32·单片机·嵌入式硬件·物联网
Jerry丶Li2 小时前
三十八、W25Q64简介
stm32·嵌入式硬件·c
brave and determined2 小时前
传感器学习(day04):红外感知:从经典热释电开关到智能时代的隐形慧眼
嵌入式硬件·算法·传感器·红外·嵌入式设计·红外矩阵·人体红外
llilian_162 小时前
微型低功耗原子钟筑牢多行业时频基准 低功耗原子钟
人工智能·单片机·嵌入式硬件·网络协议·其他·51单片机