写一个stm32f103vet6驱动lcd1602的代码
时间: 2023-06-11 19:07:39 浏览: 154
基于stm32 的LCD1602驱动代码
以下是一个基本的 STM32F103VET6 驱动 LCD1602 的代码:
```c
#include "stm32f10x.h"
#define RS_PIN GPIO_Pin_0
#define RW_PIN GPIO_Pin_1
#define EN_PIN GPIO_Pin_2
#define D4_PIN GPIO_Pin_4
#define D5_PIN GPIO_Pin_5
#define D6_PIN GPIO_Pin_6
#define D7_PIN GPIO_Pin_7
#define LCD_PORT GPIOB
void delay_us(uint32_t us)
{
for (uint32_t i = 0; i < us * 8; i++);
}
void send_nibble(uint8_t nibble)
{
GPIO_WriteBit(LCD_PORT, D4_PIN, (nibble & 0x01) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_PORT, D5_PIN, (nibble & 0x02) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_PORT, D6_PIN, (nibble & 0x04) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_PORT, D7_PIN, (nibble & 0x08) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_PORT, EN_PIN, Bit_SET);
delay_us(1);
GPIO_WriteBit(LCD_PORT, EN_PIN, Bit_RESET);
}
void send_byte(uint8_t byte, uint8_t mode)
{
GPIO_WriteBit(LCD_PORT, RS_PIN, mode ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_PORT, RW_PIN, Bit_RESET);
send_nibble(byte >> 4);
send_nibble(byte);
delay_us(50);
}
void lcd_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = RS_PIN | RW_PIN | EN_PIN | D4_PIN | D5_PIN | D6_PIN | D7_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_PORT, &GPIO_InitStructure);
delay_us(50000);
send_nibble(0x03);
delay_us(4500);
send_nibble(0x03);
delay_us(4500);
send_nibble(0x03);
delay_us(150);
send_nibble(0x02);
delay_us(150);
send_byte(0x28, 0);
send_byte(0x0C, 0);
send_byte(0x06, 0);
send_byte(0x01, 0);
delay_us(2000);
}
void lcd_puts(char *str)
{
while (*str)
{
send_byte(*str++, 1);
}
}
int main(void)
{
lcd_init();
lcd_puts("Hello, World!");
while (1);
return 0;
}
```
这个代码使用 GPIOB 控制 LCD1602,其中 RS、RW、EN、D4、D5、D6、D7 分别使用了 PB0、PB1、PB2、PB4、PB5、PB6、PB7 。
在主函数中,我们初始化 LCD1602 并且打印 "Hello, World!"。
阅读全文