看到坛子里面有关于8962驱动TFT的文章,主要是讲解如何使用官方的tft示例程序,个人觉得那个代码繁琐难懂,移植起来也是相当不方便。所以打算先使用8962实现tft驱动之后再去移植过来,而不是直接去修改那个代码。最终想实现使用ti的图形驱动库,做些界面。同时结构上做些调整,最好是类似zlggui的那种,初学者还是高手看起啦都不费劲。
目前还在进行过程中,初步实现简单的功能,暂时还有点问题,主要是显示的底层好像还有点问题。还没发现问题在哪里,不过我会继续跟进,实现预期功能。基本的测试已经完成,先前是在stm32上调试的代码,移植到ti的m3上却不好使了。初步比对,修改的部分如下:
St的代码:
void DataToWrite(u16 data)
{
GPIO_Write(GPIOE, data);
}
TI的代码:
void DataToWrite(u16 data)
{
GPIOPinWrite(DATA_PORT_H , GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 ,
(unsigned char)((data&0xff00)>>8));
GPIOPinWrite(DATA_PORT_L , GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7 ,
(unsigned char)(data&0xff));
}
这个TI提供的GPIO函数尽然都是对八位数据操作的,特地看了下数据手册,发现原来都是八位的寄存器。
本来还打算直接使用寄存器实现一次性写入16位数据的,这些还是乖乖的分两次吧。
我想这个算是最底层的函数了,也是和移植最相关的函数,最终结果让我蛋都碎了。全部是显示一半或者四分之一,在St上的代码没问题的,移植过来最多也就是这里变了点。
比如我的清屏函数:
void Lcd_Clear(u16 Color)
{
u32 temp;
u32 i;
Lcd_SetCursor(0x00, 0x0000);
LCD_WR_REG(0x0050,0x00);//水平 GRAM起始位置
LCD_WR_REG(0x0051,239);//水平GRAM终止位置
LCD_WR_REG(0x0052,0x00);//垂直GRAM起始位置
LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
Lcd_WR_Start();
Set_Rs;
for(i=110000;i>0;i--);
for (temp = 0; temp < 76800; temp++)
{
DataToWrite(Color);
Clr_nWr;
Set_nWr;
}
Set_Cs;
}
320*240刚好是76800个点,应该是全屏清除的。我使用Lcd_Clear(blue);结果只清了半个屏幕为Blue。
修改为for (temp = 0; temp < 76800*2; temp++) 就正常了。
还有函数是显示图片的,也是一样的问题,由于我使用的图片取模软件是按字节算的,所以使用一下方式实现(当初ST上)
void DispPic240_320(const u8 *str)
{
u32 temp;
u16 tmp;
Lcd_SetCursor(0x0000, 0x0000);
LCD_WR_REG(0x0050,0); //水平 GRAM起始位置
LCD_WR_REG(0x0051,239);//水平GRAM终止位置
LCD_WR_REG(0x0052,0); //垂直GRAM起始位置
LCD_WR_REG(0x0053,319);//垂直GRAM终止位置
Lcd_WR_Start();
Set_Rs;
for (temp = 0; temp < 153600/2;temp++)
{
//tmp = *str++;
tmp = (u16)((*str++)<<8);
tmp += *str++;
DataToWrite(tmp);
Clr_nWr;
Set_nWr;
}
}
图片显示正常,而在TI上却只显示一半,还是两幅图片拼成的,好纠结。使用单写入一个字节的方式,能够全屏显示,只是颜色不对,而且图片是镜像的。
上些图片:
取模软件截图: