修改程序后,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
请问各问大神是什么地方出错了。
0X0000说明是下拉。
一周热门 更多>