STM32F103系列读写LCD1604显示屏
问题,STM32F103的IO口都是单独操作的,做为并口与LCD1604通讯需要怎么操作?看到网上有很多人问这个问题,刚好前段时间做了一个小程序,所以贴出来和大家分享。
首先配置LCD的接口
//----------------------------------------------------------------------------------
//STM32 CONNECT TO BOARD GPIO INIT
//---------------------------------------------------------------------------------
void BoardGPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOE,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_Init(GPIOG,&GPIO_InitStruct);
}
其他的就是接口函数了
bool LCD1604A_BusyCheck(void)
{
u8 BusyStatus;
GPIO_Write(GPIOD,0xff);
RS_CLR;//CLR RS;
RW_SET;//SETB RW;
delay_ms(1);
EN_SET;//SETB EN;
delay_ms(5);
BusyStatus=GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7);
EN_CLR;//CLR EN;
if(BusyStatus==0)
return false;
else
return true;
}
然后是初始化LCD
void LCD1604A_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStruct);
//GPIO_Write(GPIOD, 0XFF);
//GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
//GPIO_Init(GPIOE,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_Init(GPIOC,&GPIO_InitStruct);
//2 line 5*8
LCD1604A_riteCMD(0x38);//38 06 0E 01
delay_ms(10);
LCD1604A_WriteCMD(0x01);
delay_ms(10);
LCD1604A_WriteCMD(0x06);//6);
LCD1604A_WriteCMD(0x0C);
}
void LCD1604A_WriteCMD(u8 cmd)
{
//while(LCD1604A_BusyCheck());
RS_CLR;
RW_CLR;
GPIO_Write(GPIOD,cmd);//cmd<<8);
EN_SET;
delay_ms(10);
EN_CLR;
}
void LCD1604A_WriteData(u8 data)
{
while(LCD1604A_BusyCheck());
RS_SET;
RW_CLR;
GPIO_Write(GPIOD,data);
EN_SET;
delay_ms(10);
EN_CLR;
}
好了,到这里就初始化完成了,接下来就是使用了
while(1)
{
LED1(1);
delay_ms(1);
LCD1604A_WriteCMD(0xC0);
//LCD1604A_WriteCMD(0x0E);
for(i=1;i<10;i++)
{
delay_ms(10);
LCD1604A_WriteCMD(0xC0+i);
delay_ms(10);
LCD1604A_WriteData(0x30+i);
}
LED1(0)
delay_ms(500);
}
一周热门 更多>