STM32控制ST7920点阵LCD,只能显示2个字符或一个汉字,后面即使重新设置地址,也不能显示。请问是怎么回事?
void LcdInit(void){
u8 y;
//FREEDOG;
SET_LCDRST;
delay(20);
CLR_LCDRST;
delay(20);
SET_LCDRST;
delay(20);
delay(20);
SendCmd(0x30);
delay(20);
SendCmd(0x01);
delay(20);
SendCmd(0x06);
delay(20);
SendCmd(0x0c);//0c
delay(20);
delay(3000);
SendCmd(0x80);
delay(20);
SendDat(0x50);
delay(20);
SendCmd(0x81);
delay(20);
SendDat(0xb0);
delay(20);
SendDat(0xa1);
delay(20);
}
写命令和写数据函数应该没问题,因为可以显示2个字符,硬件方面EN,RW,RS,RST,D0-D7都通过10K上拉电阻接5V,STM32这些IO口都设置为开漏输出。
u8 ChkBusy(void)
{
u8 i;
u16 j;
i=1;j=0;
GPIO_Write(GPIOE,0x00ff);
CLR_RS;
SET_RW;
SET_EN;
GPIOE->CRL&=~0xf0000000;//PE7 置为输入口
GPIOE->CRL|=0x40000000;
delayus();
i=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0);
while(i)
{if(++j>65500) break;}
GPIOE->CRL&=~0xf0000000;//PE7 置为输出口OD 2M
GPIOE->CRL|=0x60000000;
delayus();
CLR_EN;
if(j>=65500) return 0;
else return 1;
}
void SendCmd(uint8_t dat)
{
if(ChkBusy())
{
CLR_RS;
CLR_RW;
GPIO_Write(GPIOE,dat);
SET_EN;
delayus();
CLR_EN;
}
}
void SendDat(uint8_t dat)
{
if(ChkBusy())
{
SET_RS;
CLR_RW;
GPIO_Write(GPIOE,dat);
SET_EN;
delayus();
CLR_EN;
}
} |