stm3f103c6t6 LCD1602驱动代码
时间: 2024-01-01 11:53:03 浏览: 163
以下是基于STM32F103C6T6驱动LCD1602的代码:
```
#include "stm32f10x.h"
#define RS GPIO_Pin_0
#define RW GPIO_Pin_1
#define EN GPIO_Pin_2
void delay_us(u32 nus)
{
u32 i,j;
for(i=0;i<nus;i++)
for(j=0;j<8;j++);
}
void delay_ms(u32 nms)
{
u32 i,j;
for(i=0;i<nms;i++)
for(j=0;j<8000;j++);
}
void LCD1602_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = RS|RW|EN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void LCD1602_Write_Cmd(u8 command)
{
GPIO_ResetBits(GPIOC,RS);
GPIO_ResetBits(GPIOC,RW);
GPIO_SetBits(GPIOC,EN);
GPIO_Write(GPIOA,command);
delay_us(1);
GPIO_ResetBits(GPIOC,EN);
delay_ms(2);
}
void LCD1602_Write_Data(u8 data)
{
GPIO_SetBits(GPIOC,RS);
GPIO_ResetBits(GPIOC,RW);
GPIO_SetBits(GPIOC,EN);
GPIO_Write(GPIOA,data);
delay_us(1);
GPIO_ResetBits(GPIOC,EN);
delay_ms(2);
}
void LCD1602_Init(void)
{
delay_ms(50);
LCD1602_Write_Cmd(0x38);
LCD1602_Write_Cmd(0x0c);
LCD1602_Write_Cmd(0x06);
LCD1602_Write_Cmd(0x01);
delay_ms(2);
}
void LCD1602_Display(u8 x, u8 y, u8 *str)
{
u8 addr;
if(y == 0)
{
addr = 0x80 + x;
LCD1602_Write_Cmd(addr);
}
else if(y == 1)
{
addr = 0xc0 + x;
LCD1602_Write_Cmd(addr);
}
while(*str)
{
LCD1602_Write_Data(*str);
str++;
}
}
int main(void)
{
LCD1602_GPIO_Config();
LCD1602_Init();
while(1)
{
LCD1602_Display(0,0,"Hello World!");
LCD1602_Display(0,1,"LCD1602 Test");
delay_ms(1000);
LCD1602_Write_Cmd(0x01);
delay_ms(1000);
}
}
```
需要注意的是,本代码使用了位于PA0-PA7的GPIO口作为LCD1602的数据口,因此需要在代码中将GPIOA打开。如果需要使用其他的GPIO口,需要进行相应的修改。
阅读全文