基于STM32F103C8T6,LCD1602显示程序
时间: 2024-05-06 19:16:11 浏览: 90
STM32F103C8T6配套程序源码-LCD1602显示,stm32f103c8t6驱动彩屏,C,C++
5星 · 资源好评率100%
以下是基于STM32F103C8T6的LCD1602显示程序,使用的是4位数据线模式:
```c
#include "stm32f10x.h"
#define LCD_RS_PIN GPIO_Pin_0
#define LCD_RW_PIN GPIO_Pin_1
#define LCD_EN_PIN GPIO_Pin_2
#define LCD_D4_PIN GPIO_Pin_4
#define LCD_D5_PIN GPIO_Pin_5
#define LCD_D6_PIN GPIO_Pin_6
#define LCD_D7_PIN GPIO_Pin_7
void delay_us(uint32_t us) {
uint32_t i;
for(i = 0; i < us * 8; i++);
}
void delay_ms(uint32_t ms) {
uint32_t i;
for(i = 0; i < ms * 8000; i++);
}
void LCD_send_nibble(uint8_t nibble) {
GPIO_WriteBit(GPIOB, LCD_D4_PIN, (nibble >> 0) & 0x01);
GPIO_WriteBit(GPIOB, LCD_D5_PIN, (nibble >> 1) & 0x01);
GPIO_WriteBit(GPIOB, LCD_D6_PIN, (nibble >> 2) & 0x01);
GPIO_WriteBit(GPIOB, LCD_D7_PIN, (nibble >> 3) & 0x01);
delay_us(1);
GPIO_SetBits(GPIOB, LCD_EN_PIN);
delay_us(1);
GPIO_ResetBits(GPIOB, LCD_EN_PIN);
delay_us(100);
}
void LCD_send_byte(uint8_t data, uint8_t rs) {
GPIO_WriteBit(GPIOB, LCD_RS_PIN, rs ? Bit_SET : Bit_RESET);
GPIO_ResetBits(GPIOB, LCD_RW_PIN);
LCD_send_nibble(data >> 4);
LCD_send_nibble(data & 0x0F);
}
void LCD_init() {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = LCD_RS_PIN | LCD_RW_PIN | LCD_EN_PIN | LCD_D4_PIN | LCD_D5_PIN | LCD_D6_PIN | LCD_D7_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
delay_ms(50);
LCD_send_nibble(0x03);
delay_ms(5);
LCD_send_nibble(0x03);
delay_us(100);
LCD_send_nibble(0x03);
delay_us(100);
LCD_send_nibble(0x02);
delay_us(100);
LCD_send_byte(0x28, 0); // 4-bit mode, 2 lines, 5x8 font
LCD_send_byte(0x0C, 0); // display on, cursor off, blink off
LCD_send_byte(0x06, 0); // cursor increment, no shift
LCD_send_byte(0x01, 0); // clear display
delay_ms(2);
}
void LCD_set_cursor(uint8_t col, uint8_t row) {
uint8_t row_offsets[] = {0x00, 0x40, 0x14, 0x54};
if(row >= 2) {
row = 1;
}
LCD_send_byte(0x80 | (col + row_offsets[row]), 0);
}
void LCD_write_char(uint8_t c) {
LCD_send_byte(c, 1);
}
void LCD_write_str(char *str) {
while(*str) {
LCD_write_char(*str++);
}
}
int main(void) {
LCD_init();
LCD_set_cursor(0, 0);
LCD_write_str("Hello, world!");
LCD_set_cursor(0, 1);
LCD_write_str("LCD1602 demo");
while(1);
}
```
在这个程序中,我们使用了GPIOB的0~7号引脚,其中0、1、2号引脚分别连接到LCD1602的RS、RW、EN引脚,4~7号引脚分别连接到LCD1602的D4~D7引脚。我们使用了delay_us和delay_ms函数来进行延时,以保证LCD能够正常工作。在初始化LCD时,我们先发送了3个0x03命令和1个0x02命令,这些命令是LCD1602初始化的必备命令。然后我们设置LCD的显示模式、光标模式以及清屏。在主函数中,我们先初始化LCD,然后在第一行显示"Hello, world!",在第二行显示"LCD1602 demo"。
阅读全文