ILI9341芯片驱动程序的问题

2019-07-14 21:10发布

本人刚入门STM32不久。最近自己设计了一款stm32最小系统+SD卡+TFT触摸屏。在写3.2寸TFT驱动程序时,参数设置使用了原厂提供的初始化程序,可是屏幕变成背景灰 {MOD},有一道一道的纹线,使用原子的驱动程序也出现同样的情况。读取屏幕的ID,可以正确的读到9431。现在卡在这里,不知道怎么办。请各位大神指点迷津。
程序如下:
ILI9341驱动程序:
#include <ILI9341.h>
#include "delay.h"

extern int REK;                        //ID号

void ILI9341_GPIO_config(void)        //引脚配置
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;           
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_All);
}

void LCD_WR_DATA(unsigned int val)        //写数据
{  
        LCD_RS_SET;
        LCD_RD_SET;
        LCD_CS_CLR;
        DATAOUT(val);
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;
}

void LCD_WR_REG(unsigned int reg)                //写命令字
{        
        LCD_RS_CLR;//дµØÖ·
        LCD_RD_SET;
        LCD_CS_CLR;
        DATAOUT(reg);
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;
}

u16 LCD_RD_DATA(void)        //读数据 使用原子的程序
{                                                                                   
        u16 t;
        GPIOA->CRL=0X88888888;
        GPIOA->CRH=0X88888888;
        GPIOA->ODR=0X0000;     

        LCD_RS_SET;
        LCD_CS_CLR;
        LCD_RD_CLR;                                   
        t=DATAIN;  
        LCD_RD_SET;
        LCD_CS_SET;

        GPIOA->CRL=0X33333333;
        GPIOA->CRH=0X33333333;
        GPIOA->ODR=0XFFFF;  
        return t;  
}

void LCD_Init(void)                //ILI9341初始化
{
        ILI9341_GPIO_config();
        
        LCD_RE_SET;        
        delay_ms(100);
        LCD_RE_CLR;
        delay_ms(200);
        LCD_RE_SET;        
        delay_ms(300);
        
        LCD_WR_REG(0xD3);                                   
        LCD_RD_DATA();                                 //dummy read         
        LCD_RD_DATA();                       
        REK=LCD_RD_DATA();                                                                              
        REK<<=8;
        REK|=LCD_RD_DATA();         
        
LCD_WR_REG(0xCF);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0xC1);
LCD_WR_DATA(0X30);
LCD_WR_REG(0xED);
LCD_WR_DATA(0x64);
LCD_WR_DATA(0x03);
LCD_WR_DATA(0X12);
LCD_WR_DATA(0X81);
LCD_WR_REG(0xE8);
LCD_WR_DATA(0x85);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x79);
LCD_WR_REG(0xCB);
LCD_WR_DATA(0x39);
LCD_WR_DATA(0x2C);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x34);
LCD_WR_DATA(0x02);
LCD_WR_REG(0xF7);
LCD_WR_DATA(0x20);
LCD_WR_REG(0xEA);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xC0); //Power control
LCD_WR_DATA(0x1D); //VRH[5:0]
LCD_WR_REG(0xC1); //Power control
LCD_WR_DATA(0x12); //SAP[2:0];BT[3:0]
LCD_WR_REG(0xC5); //VCM control
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x3F);
LCD_WR_REG(0xC7); //VCM control
LCD_WR_DATA(0x92);
LCD_WR_REG(0x3A); // Memory Access Control
LCD_WR_DATA(0x55);
LCD_WR_REG(0x36); // Memory Access Control
LCD_WR_DATA(0x08);
LCD_WR_REG(0xB1);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x12);
LCD_WR_REG(0xB6); // Display Function Control
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0xA2);

LCD_WR_REG(0x44);
LCD_WR_DATA(0x02);

LCD_WR_REG(0xF2); // 3Gamma Function Disable
LCD_WR_DATA(0x00);
LCD_WR_REG(0x26); //Gamma curve selected
LCD_WR_DATA(0x01);
LCD_WR_REG(0xE0); //Set Gamma
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x22);
LCD_WR_DATA(0x1C);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x08);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x48);
LCD_WR_DATA(0xB8);
LCD_WR_DATA(0x34);
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x0C);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x00);
LCD_WR_REG(0XE1); //Set Gamma
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x23);
LCD_WR_DATA(0x24);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x10);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x38);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x4B);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x13);
LCD_WR_DATA(0x06);
LCD_WR_DATA(0x30);
LCD_WR_DATA(0x38);
LCD_WR_DATA(0x0F);
LCD_WR_REG(0x11); //Exit Sleep
delay_ms(120);
LCD_WR_REG(0x29); //Display on
}

void LCD_SetArea(unsigned int stx,unsigned int sty,unsigned int endx,unsigned int endy)        //设置窗口
{
        LCD_WR_REG(0x2A);  
//        LCD_WR_DATA((stx>>8)&0x00ff);   
//        LCD_WR_DATA(stx&0x00ff);            
//        LCD_WR_DATA((endx>>8)&0x00ff);
//        LCD_WR_DATA(endx&0x00ff);        
        LCD_WR_DATA(0x00);   
        LCD_WR_DATA(0x00);            
        LCD_WR_DATA(0x01);
        LCD_WR_DATA(0x3f);        
//        LCD_WR_DATAX(stx);
//        LCD_WR_DATAX(endx);

        LCD_WR_REG(0x2B);  
//        LCD_WR_DATA((sty>>8)&0x00ff);
//        LCD_WR_DATA(sty&0x00ff);        
//        LCD_WR_DATA((endy>>8)&0x00ff);
//        LCD_WR_DATA(endy&0x00ff);        
        LCD_WR_DATA(0x00);   
        LCD_WR_DATA(0x00);            
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0xef);        
//        LCD_WR_DATAX(sty);
//        LCD_WR_DATAX(endy);
}

void LCD_SetAreaXY(unsigned char x,unsigned int y)
{
        LCD_SetArea(x,y,x,y);        
}

void LcdWirteColorData(unsigned int color)        //写颜 {MOD}值至ILI9341
{
        LCD_RS_SET;
        LCD_RD_SET;
        LCD_CS_CLR;
        DATAOUT(color);
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;        
}

void LCD_Clear(unsigned int color)        //清屏操作
{  
        unsigned int i,j;

        LCD_SetArea(0,0,239,319);
        LCD_WR_REG(0x2C);
        for(i = 0;i < 320;i++)
        {
                for(j = 0;j < 240;j++)
                {
                        LcdWirteColorData(color);
                }
        }
}
主函数:
int REK = 0xffff;

int main(void)
{        
                USART3_Config(9600);
                delay_init();
                LCD_Init();
                LCD_Clear(Yellow);
                while(1)
                {
                        printf("ID is :%x ",REK);
                        LCD_Clear(Yellow);
                }
}
电路图如图所示:
未命名.JPG
0条回答

一周热门 更多>