基于stm32的lcd1602显示代码
时间: 2023-11-05 12:04:33 浏览: 263
STM32的1602程序.doc
以下是基于STM32的LCD1602显示代码的示例:
```c
#include "stm32f10x.h"
#define LCD_RS GPIO_Pin_8 // LCD Register Select Pin
#define LCD_EN GPIO_Pin_9 // LCD Enable Pin
#define LCD_D4 GPIO_Pin_10 // LCD Data Pin 4
#define LCD_D5 GPIO_Pin_11 // LCD Data Pin 5
#define LCD_D6 GPIO_Pin_12 // LCD Data Pin 6
#define LCD_D7 GPIO_Pin_13 // LCD Data Pin 7
void delay_ms(uint32_t ms) {
SysTick->LOAD = (SystemCoreClock / 1000) - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
for (uint32_t i = 0; i < ms; i++) {
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
}
SysTick->CTRL = 0;
}
void lcd_send_command(uint8_t command) {
GPIO_ResetBits(GPIOA, LCD_RS);
GPIO_SetBits(GPIOA, LCD_EN);
GPIO_Write(GPIOA, (GPIO_ReadOutputData(GPIOA) & 0xFFF0) | (command >> 4));
delay_ms(1);
GPIO_ResetBits(GPIOA, LCD_EN);
GPIO_Write(GPIOA, (GPIO_ReadOutputData(GPIOA) & 0xFFF0) | (command & 0x0F));
GPIO_SetBits(GPIOA, LCD_EN);
delay_ms(1);
GPIO_ResetBits(GPIOA, LCD_EN);
}
void lcd_send_data(uint8_t data) {
GPIO_SetBits(GPIOA, LCD_RS);
GPIO_SetBits(GPIOA, LCD_EN);
GPIO_Write(GPIOA, (GPIO_ReadOutputData(GPIOA) & 0xFFF0) | (data >> 4));
delay_ms(1);
GPIO_ResetBits(GPIOA, LCD_EN);
GPIO_Write(GPIOA, (GPIO_ReadOutputData(GPIOA) & 0xFFF0) | (data & 0x0F));
GPIO_SetBits(GPIOA, LCD_EN);
delay_ms(1);
GPIO_ResetBits(GPIOA, LCD_EN);
}
void lcd_init(void) {
delay_ms(20);
lcd_send_command(0x02);
lcd_send_command(0x28);
lcd_send_command(0x0C);
lcd_send_command(0x01);
delay_ms(2);
}
void lcd_clear(void) {
lcd_send_command(0x01);
delay_ms(2);
}
void lcd_set_cursor(uint8_t row, uint8_t col) {
uint8_t address = 0x80;
if (row == 1) {
address |= 0x40;
}
address |= col;
lcd_send_command(address);
}
void lcd_write_string(const char *string) {
while (*string) {
lcd_send_data(*string++);
}
}
int main(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_init);
lcd_init();
lcd_clear();
lcd_set_cursor(0, 0);
lcd_write_string("Hello, World!");
while (1) {}
return 0;
}
```
这个示例使用了STM32的SysTick定时器来实现毫秒级别的延迟。它实现了基本的LCD功能,包括发送命令、发送数据、清屏、设置光标位置和写字符串。您可以根据需要修改代码以适应您的应用程序。
阅读全文