STM32读TFTLCD屏问题

2019-10-12 14:20发布

修改程序后,LCD屏读不出,但是能够打印出  ID9341。

使用原子哥的例程做出的接口修改:
#define LCD_LED PEout(15) //LCD背光     PE15 

#define LCD_CS_SET  GPIOC->BSRR=1<<12    //片选端口       PC12
#define LCD_RS_SET GPIOB->BSRR=1<<5    //数据/命令          B5   
#define LCD_WR_SET GPIOC->BSRR=1<<10    //写数据 PC10
#define LCD_RD_SET GPIOC->BSRR=1<<11    //读数据 PC11
   
#define LCD_CS_CLR  GPIOC->BRR=1<<12     //片选端口       PC12
#define LCD_RS_CLR GPIOB->BRR=1<<5     //数据/命令          B5   
#define LCD_WR_CLR GPIOC->BRR=1<<10     //写数据 PC10
#define LCD_RD_CLR GPIOC->BRR=1<<11     //读数据 PC11  

//PD0~15,作为数据线
#define DATAOUT(x) GPIOD->ODR=x; //数据输出
#define DATAIN     GPIOD->IDR;   //数据输入

下面是寄存器修改:
u16 LCD_RD_DATA(void)
{   
u16 t;
  GPIOD->CRL=0X88888888; //PB0-7  上拉输入
GPIOD->CRH=0X88888888; //PB8-15 上拉输入
GPIOD->ODR=0X0000;     //全部输出0

LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
if(lcddev.id==0X8989)delay_us(2);//FOR 8989,延时2us   
LCD_RD_SET;
t=DATAIN;  
LCD_CS_SET; 

GPIOD->CRL=0X33333333; //PB0-7  上拉输出
GPIOD->CRH=0X33333333; //PB8-15 上拉输出
GPIOD->ODR=0XFFFF;    //全部输出高
return t;  
}

u16 LCD_ReadPoint(u16 x,u16 y)
{
  u16 r,g,b;
if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回   
LCD_SetCursor(x,y);
if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X2E); //9341/6804发送读GRAM指令
else LCD_WR_REG(R34);       //其他IC发送读GRAM指令
GPIOD->CRL=0X88888888; //PB0-7  上拉输入
GPIOD->CRH=0X88888888; //PB8-15 上拉输入
GPIOD->ODR=0XFFFF;     //全部输出高

LCD_RS_SET;
LCD_CS_CLR;    
//读取数据(读GRAM时,第一次为假读)
LCD_RD_CLR;
  delay_us(1);//延时1us   
LCD_RD_SET;
  //dummy READ
LCD_RD_CLR;   
delay_us(1);//延时1us   
LCD_RD_SET;
  r=DATAIN;  
  if(lcddev.id==0X9341)
{  
LCD_RD_CLR;   
LCD_RD_SET;
b=DATAIN;//读取蓝 {MOD}值    
g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位
g<<=8;
}else if(lcddev.id==0X6804)
{
LCD_RD_CLR;   
LCD_RD_SET;
r=DATAIN;//6804第二次读取的才是真实值 
}  
LCD_CS_SET;

GPIOD->CRL=0X33333333; //PB0-7  上拉输出
GPIOD->CRH=0X33333333; //PB8-15 上拉输出
GPIOD->ODR=0XFFFF;    //全部输出高  
if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0X8989||lcddev.id==0XB505)return r; //这几种IC直接返回颜 {MOD}值
else if(lcddev.id==0X9341)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341需要公式转换一下
else return LCD_BGR2RGB(r); //其他IC
}

void LCD_Init(void)

    RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟
RCC->APB2ENR|=1<<5;//先使能外设PORTD时钟
  RCC->APB2ENR|=1<<6;//先使能外设PORTE时钟

RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(SWD_ENABLE);  //开启SWD
 

GPIOC->CRH&=0XFFF000FF;
GPIOC->CRH|=0X00033300;  
GPIOC->ODR|=0X1C00;
 
GPIOE->CRH&=0X0FFFFFFF;
GPIOE->CRH|=0X30000000; 
GPIOE->ODR|=0X8000;

GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000; 
GPIOB->ODR|=0X0020;
   
//PORTD 推挽输出
    GPIOD->CRH&=0X00000000; 
    GPIOD->CRH|=0X33333333; 
    GPIOD->CRL&=0X00000000; 
    GPIOD->CRL|=0X33333333; 
    GPIOD->ODR|=0XFFFFFFFF;

delay_ms(50); // delay 50 ms 
LCD_WriteReg(0x0000,0x0001);
delay_ms(50); // delay 50 ms 
  lcddev.id = LCD_ReadReg(0x0000);   
  if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300)//读到ID不正确,新增lcddev.id==0X9300判断,因为9341在未被复位的情况下会被读成9300
{
  //尝试9341 ID的读取
LCD_WR_REG(0XD3);   
LCD_RD_DATA(); //dummy read
  LCD_RD_DATA();       //读到0X00
  lcddev.id=LCD_RD_DATA();   //读取93   
  lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();   //读取41     
  if(lcddev.id!=0X9341) //非9341,尝试是不是6804
{
  LCD_WR_REG(0XBF);   
LCD_RD_DATA(); //dummy read  
LCD_RD_DATA();      //读回0X01   
LCD_RD_DATA(); //读回0XD0  
  lcddev.id=LCD_RD_DATA();//这里读回0X68 
lcddev.id<<=8;
  lcddev.id|=LCD_RD_DATA();//这里读回0X04    
  } 
if(lcddev.id!=0X9341&&lcddev.id!=0X6804)lcddev.id=0x9341;//新增,用于识别9341     
}
  printf(" LCD ID:%x ",lcddev.id); //打印LCD ID 

请问各问大神是什么地方出错了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。