利用stm32103c8写lcd1602的程序和库函数
时间: 2023-10-09 17:15:02 浏览: 41
下面是基于STM32F103C8T6芯片的LCD1602驱动程序和库函数:
```c
#include "stm32f10x.h"
// 定义IO口
#define LCD_RS GPIO_Pin_0 // PB0
#define LCD_RW GPIO_Pin_1 // PB1
#define LCD_EN GPIO_Pin_2 // PB2
#define LCD_D4 GPIO_Pin_3 // PB3
#define LCD_D5 GPIO_Pin_4 // PB4
#define LCD_D6 GPIO_Pin_5 // PB5
#define LCD_D7 GPIO_Pin_6 // PB6
#define LCD_PORT GPIOB
void LCD_Init(void);
void LCD_WriteString(char *str);
void LCD_WriteCommand(uint8_t cmd);
void LCD_WriteData(uint8_t data);
void delay_ms(uint16_t ms);
int main(void)
{
LCD_Init();
LCD_WriteString("Hello, world!");
while (1)
{
}
}
void LCD_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = LCD_RS | LCD_RW | LCD_EN | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LCD_PORT, &GPIO_InitStruct);
delay_ms(15);
LCD_WriteCommand(0x30);
delay_ms(5);
LCD_WriteCommand(0x30);
delay_ms(1);
LCD_WriteCommand(0x30);
delay_ms(1);
LCD_WriteCommand(0x20);
LCD_WriteCommand(0x28);
LCD_WriteCommand(0x08);
LCD_WriteCommand(0x01);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x0C);
}
void LCD_WriteString(char *str)
{
while (*str)
{
LCD_WriteData(*str++);
}
}
void LCD_WriteCommand(uint8_t cmd)
{
GPIO_ResetBits(LCD_PORT, LCD_RS);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_SetBits(LCD_PORT, LCD_EN);
GPIO_Write(LCD_PORT, (GPIO_ReadOutputData(LCD_PORT) & 0xFF80) | (cmd >> 4));
delay_ms(1);
GPIO_ResetBits(LCD_PORT, LCD_EN);
delay_ms(1);
GPIO_SetBits(LCD_PORT, LCD_EN);
GPIO_Write(LCD_PORT, (GPIO_ReadOutputData(LCD_PORT) & 0xFF80) | (cmd & 0x0F));
delay_ms(1);
GPIO_ResetBits(LCD_PORT, LCD_EN);
delay_ms(1);
}
void LCD_WriteData(uint8_t data)
{
GPIO_SetBits(LCD_PORT, LCD_RS);
GPIO_ResetBits(LCD_PORT, LCD_RW);
GPIO_SetBits(LCD_PORT, LCD_EN);
GPIO_Write(LCD_PORT, (GPIO_ReadOutputData(LCD_PORT) & 0xFF80) | (data >> 4));
delay_ms(1);
GPIO_ResetBits(LCD_PORT, LCD_EN);
delay_ms(1);
GPIO_SetBits(LCD_PORT, LCD_EN);
GPIO_Write(LCD_PORT, (GPIO_ReadOutputData(LCD_PORT) & 0xFF80) | (data & 0x0F));
delay_ms(1);
GPIO_ResetBits(LCD_PORT, LCD_EN);
delay_ms(1);
}
void delay_ms(uint16_t ms)
{
while (ms--)
{
for (volatile int i = 0; i < 6000; i++);
}
}
```
这个程序中使用了库函数来进行GPIO的初始化和操作。LCD_Init函数用来初始化LCD,LCD_WriteString函数用来往LCD上写入字符串,LCD_WriteCommand函数用来向LCD发送指令,LCD_WriteData函数用来向LCD发送数据。最后一个函数是用来产生延时的。程序中,我们通过调用delay_ms函数来产生1毫秒的延时。