【TI原创】采用8962驱动3.2寸TFT屏幕(非官方GUI版本)
[复制链接]
看到坛子里面有关于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上却只显示一半,还是两幅图片拼成的,好纠结。使用单写入一个字节的方式,能够全屏显示,只是颜色不对,而且图片是镜像的。
上些图片:
取模软件截图:
|