【STM32单片机_(HAL库)】3-4-1【中断EXTI】【智能排队控制系统】LCD1602显示字符串
1.硬件
- STM32单片机最小系统
- LCD1602显示模块
2.软件
- LCD1602驱动文件添加
- GPIO常用函数
- 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, 2, "STM32");lcd1602_show_line(2, 1, "HELLO");//从第一个格为0开始数while(1){ }
}
- 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);void lcd1602_init(void)//LCD1602初始化
{//初始化GPIOlcd1602_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) 延时 15msdelay_ms(15);
//(2) 写指令 38H(不检测忙信号)lcd1602_write_cmd(0x38);
//(3) 延时 5msdelay_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程序
#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显示字符串。