STM32f103驱动T6963芯片的LCD屏幕问题
在操作屏幕的时候,在每次写command或者Data时候,都要去check状态,发现在调用自动写命令的时候,第一次状态的对的,后面的状态就错了,不知道什么原因,求指导void LCD_IO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = LCD_WR|LCD_RD|LCD_CE|LCD_RST|LCD_CD|LCD_HALT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
//data bus
/* Configure PD.0, ~PD7 */
GPIO_InitStruct.GPIO_Pin = 0x00ff;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = LCD_BG;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStruct);
SET_LCD_HALT;
SET_LCD_RST;
delay_ms(200);
CLR_LCD_RST;
delay_ms(200);
SET_LCD_RST;
}
/*
Êý¾ÝÒý½Å·½ÏòÇл»
*/
void LCD_Data_Pin_Change(unsigned char u8dir)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = 0x00ff;
if(u8dir)
{
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
}
else
{
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
}
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
/*ÅжÏSTA0 and STA1 µÄ£¨Ö¸ÁîºÍÊý¾Ý¶Áд״̬£©*/
void CheckRWStatus(void)
{
unsigned intu16data;
LCD_Data_Pin_Change(0);
do{
CLR_LCD_CE;
SET_LCD_CD;
SET_LCD_WR;
CLR_LCD_RD;
u16data = GPIO_ReadInputData(GPIOD);
// USART_SendData(USART1,0X11);
// USART_SendData(USART1,(u8)u16data);//debug
SET_LCD_RD;
SET_LCD_CE;
}while((u16data&0x0003) != 0x0003);
LCD_Data_Pin_Change(1);
}
/*ÅжÏSTA3£¬×Ô¶¯Ð´µÄ״̬
·µ»ØÖµ£º1£º ready0:busy
*/
void CheckAutoWriteStatus(void)
{
unsigned intu16data;
LCD_Data_Pin_Change(0); //set bus pin input sataus
do{
CLR_LCD_CE;
SET_LCD_CD;
SET_LCD_WR;
CLR_LCD_RD;
u16data = GPIO_ReadInputData(GPIOD);
USART_SendData(USART1,0X22);
USART_SendData(USART1,(u8)u16data); //debug
SET_LCD_RD;
SET_LCD_CE;
}while((u16data&0x0008) != 0x0008);
LCD_Data_Pin_Change(1); //set bus pin output sataus
}
void LCD_Write_Com(unsigned char u8cmd)
{
uint16_t u16data;
u16data = GPIOD->ODR;
u16data &=0xFF00;
u16data|= u8cmd;
SET_LCD_CD;
CLR_LCD_CE;
SET_LCD_RD;
CLR_LCD_WR;
GPIOD->ODR= u16data;
SET_LCD_WR;
SET_LCD_CE;
}
void LCD_Write_Data(unsigned char u8dat)
{
uint16_t u16data;
u16data = GPIOD->ODR;
u16data &=0xFF00;
u16data|= u8dat;
CLR_LCD_CD;
CLR_LCD_CE;
SET_LCD_RD;
CLR_LCD_WR;
GPIOD->ODR= u16data;
SET_LCD_WR;
SET_LCD_CE;
}
//ÎÞ²ÎÊýÖ¸ÁîдÈë
void LCD_WriteCommand(unsigned char u8cmd)
{
CheckRWStatus();
LCD_Write_Com(u8cmd);
}
//µ¥²ÎÊýдÈë
void LCD_WriteCommand1(unsigned char u8cmd, unsigned char u8data)
{
CheckRWStatus();
LCD_Write_Data(u8data);
CheckRWStatus();
LCD_Write_Com(u8cmd);
}
//Ë«²ÎÊýдÈë
void LCD_WriteCommand2(unsigned char u8cmd, unsigned char u8data1,unsigned char u8data2)
{
CheckRWStatus();
LCD_Write_Data(u8data1);
CheckRWStatus();
LCD_Write_Data(u8data2);
CheckRWStatus();
LCD_Write_Com(u8cmd);
}
void LCD_full_clr(unsigned char u8dat)
{
unsigned int i;
LCD_WriteCommand2(LCD_ADR_POS, 0x00, 0x00);
LCD_WriteCommand(LCD_AUT_WR); //×Ô¶¯Ð´
for(i=0;i<128*20;i++)
{
CheckAutoWriteStatus();
LCD_Write_Data(u8dat); //
}
LCD_WriteCommand(LCD_AUT_OVR); // ×Ô¶¯Ð´½áÊø
}
调用这个函数CheckAutoWriteStatus()的时候,发现就第一次的状态位是对的,后面全错了
由于状态位作用不一样,因此执行不同指令必须检测不同的状态位。
感觉是楼主用的指令错了。
给个参考你看看:http://www.docin.com/p-1673347868.html 可能程序有点问题,时序上有偏差吧 低速端口配高速的数据通信?
页:
[1]