STM32F103LCD1602程序
时间: 2024-05-13 21:18:21 浏览: 114
以下是一个简单的 STM32F103C8T6 控制 LCD1602 的程序,使用的是 C 语言和标准库函数。这个程序可以显示一些文本信息并且可以通过按键改变显示内容。
```c
#include "stm32f10x.h"
#include "delay.h"
#define RS GPIO_Pin_0
#define RW GPIO_Pin_1
#define EN GPIO_Pin_2
#define D4 GPIO_Pin_4
#define D5 GPIO_Pin_5
#define D6 GPIO_Pin_6
#define D7 GPIO_Pin_7
void lcd_init();
void lcd_cmd(unsigned char cmd);
void lcd_data(unsigned char data);
void lcd_string(char* str);
void lcd_clear();
void lcd_gotoxy(unsigned char x, unsigned char y);
int main(void)
{
/* 初始化时钟,GPIO等 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/* 初始化LCD控制引脚 */
GPIO_InitStructure.GPIO_Pin = RS | RW | EN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* 初始化LCD数据引脚 */
GPIO_InitStructure.GPIO_Pin = D4 | D5 | D6 | D7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 初始化LCD */
lcd_init();
/* 显示欢迎信息 */
lcd_string("Welcome to LCD");
lcd_gotoxy(0, 1);
lcd_string("STM32F103C8T6");
/* 循环等待按键 */
while (1)
{
/* 按键1,显示Hello */
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
{
lcd_clear();
lcd_string("Hello");
lcd_gotoxy(0, 1);
lcd_string("Press Key2");
while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0);
delay_ms(200);
}
/* 按键2,显示World */
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14) == 0)
{
lcd_clear();
lcd_string("World");
lcd_gotoxy(0, 1);
lcd_string("Press Key1");
while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14) == 0);
delay_ms(200);
}
}
return 0;
}
void lcd_init()
{
/* 初始化过程,具体请参照LCD1602的手册 */
lcd_cmd(0x02);
lcd_cmd(0x28);
lcd_cmd(0x0c);
lcd_cmd(0x06);
lcd_cmd(0x01);
}
void lcd_cmd(unsigned char cmd)
{
/* 发送命令到LCD */
GPIO_ResetBits(GPIOC, RS);
GPIO_ResetBits(GPIOC, RW);
GPIO_SetBits(GPIOC, EN);
GPIO_Write(GPIOA, cmd << 4);
delay_us(1);
GPIO_ResetBits(GPIOC, EN);
delay_us(100);
}
void lcd_data(unsigned char data)
{
/* 发送数据到LCD */
GPIO_SetBits(GPIOC, RS);
GPIO_ResetBits(GPIOC, RW);
GPIO_SetBits(GPIOC, EN);
GPIO_Write(GPIOA, data << 4);
delay_us(1);
GPIO_ResetBits(GPIOC, EN);
delay_us(100);
}
void lcd_string(char* str)
{
/* 显示一个字符串 */
while (*str)
{
lcd_data(*str++);
}
}
void lcd_clear()
{
/* 清屏 */
lcd_cmd(0x01);
}
void lcd_gotoxy(unsigned char x, unsigned char y)
{
/* 定位光标位置 */
unsigned char addr = (y == 0 ? 0x80 : 0xc0) + x;
lcd_cmd(addr);
}
```
需要注意的是,这个程序使用了一个自己写的延时函数 `delay_ms()` 和 `delay_us()`,需要在其他地方实现。同时,这个程序只是一个简单的例子,不一定适用于所有的情况,需要根据具体情况进行修改。
阅读全文