stm32f106c6t6 LCD1602驱动程序设计
时间: 2023-10-24 16:05:57 浏览: 173
首先需要准备好以下材料:
- STM32F106C6T6开发板
- LCD1602液晶显示屏
- 杜邦线若干
接下来我们需要配置开发板的GPIO引脚,来控制LCD1602液晶显示屏。
1. 首先打开STM32CubeMX软件,选择STM32F106C6T6型号,然后在Pinout中配置如下GPIO引脚:
- PB0 : LCD1602的RS引脚
- PB1 : LCD1602的EN引脚
- PB10-PB15 : LCD1602的D0-D5引脚
2. 在Configuration中配置时钟和时钟分频器
- HCLK : 72 MHz
- APB1 : 36 MHz
3. 在Configuration中的USART中,使能USART1
- Baud rate : 9600
- Word length : 8 bits
- Stop bits : 1 bit
- Parity : None
4. 生成代码并打开工程文件,在main.c文件中编写LCD1602的驱动程序。
```
#include "stm32f1xx_hal.h"
/* 定义LCD1602引脚 */
#define RS_Pin GPIO_PIN_0
#define RS_GPIO_Port GPIOB
#define EN_Pin GPIO_PIN_1
#define EN_GPIO_Port GPIOB
#define D0_Pin GPIO_PIN_10
#define D0_GPIO_Port GPIOB
#define D1_Pin GPIO_PIN_11
#define D1_GPIO_Port GPIOB
#define D2_Pin GPIO_PIN_12
#define D2_GPIO_Port GPIOB
#define D3_Pin GPIO_PIN_13
#define D3_GPIO_Port GPIOB
#define D4_Pin GPIO_PIN_14
#define D4_GPIO_Port GPIOB
#define D5_Pin GPIO_PIN_15
#define D5_GPIO_Port GPIOB
/* 定义命令和数据 */
#define COMMAND 0
#define DATA 1
/* 延时函数 */
void delay(uint16_t time)
{
uint16_t i,j;
for(i=0;i<time;i++)
{
for(j=0;j<1000;j++);
}
}
/* 发送数据函数 */
void lcd_send_data(uint8_t data)
{
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, DATA);
HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin, (data&0x01)>>0);
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, (data&0x02)>>1);
HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin, (data&0x04)>>2);
HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin, (data&0x08)>>3);
HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, (data&0x10)>>4);
HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, (data&0x20)>>5);
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET);
delay(1);
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET);
}
/* 发送命令函数 */
void lcd_send_command(uint8_t command)
{
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, COMMAND);
HAL_GPIO_WritePin(D0_GPIO_Port, D0_Pin, (command&0x01)>>0);
HAL_GPIO_WritePin(D1_GPIO_Port, D1_Pin, (command&0x02)>>1);
HAL_GPIO_WritePin(D2_GPIO_Port, D2_Pin, (command&0x04)>>2);
HAL_GPIO_WritePin(D3_GPIO_Port, D3_Pin, (command&0x08)>>3);
HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, (command&0x10)>>4);
HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, (command&0x20)>>5);
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET);
delay(1);
HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET);
}
/* 初始化LCD1602屏幕 */
void lcd_init(void)
{
lcd_send_command(0x38); // 初始化LCD1602,设置为8位数据,2行显示,5x7点阵字符
lcd_send_command(0x06); // 设置光标移动方式为右移
lcd_send_command(0x0c); // 开启显示屏,关闭光标
lcd_send_command(0x01); // 清空屏幕
}
/* 显示字符串 */
void lcd_show_string(uint8_t line, uint8_t *str)
{
if(line == 1) // 如果是第一行
{
lcd_send_command(0x80); // 设置光标到第一行
}
else if(line == 2) // 如果是第二行
{
lcd_send_command(0xc0); // 设置光标到第二行
}
while(*str) // 循环发送字符
{
lcd_send_data(*str++);
}
}
int main(void)
{
/* 使能时钟 */
HAL_Init();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* 初始化LCD1602 */
lcd_init();
/* 显示字符串 */
lcd_show_string(1, "Hello, World!");
lcd_show_string(2, "This is STM32!");
while (1)
{
}
}
```
5. 编译并下载程序到开发板中,接上LCD1602液晶显示屏,应该可以看到屏幕上显示出 "Hello, World!" 和 "This is STM32!" 两个字符串。
这样,我们就成功地实现了STM32F106C6T6驱动LCD1602的功能。
阅读全文