tracymars 发表于 2017-4-14 12:12:14

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()的时候,发现就第一次的状态位是对的,后面全错了

无薪税绵 发表于 2017-7-7 08:31:52

由于状态位作用不一样,因此执行不同指令必须检测不同的状态位。
感觉是楼主用的指令错了。
给个参考你看看:http://www.docin.com/p-1673347868.html

ts2000 发表于 2017-7-7 08:45:37

可能程序有点问题,时序上有偏差吧

wolfgang2015 发表于 2017-7-7 13:26:02

低速端口配高速的数据通信?
页: [1]
查看完整版本: STM32f103驱动T6963芯片的LCD屏幕问题