因为最近想移植ucgui来玩玩,正好手头有一块在网上买的ILI9341-SPI的屏幕模块。但是里面带的读点程序有问题,一直读不对。在网上没能找到合适的源码,于是参照一些网友的思路在卖家给的驱动基础上自己写了一下读点函数,这回可以读点的颜 {MOD}回来了。C写的不很规范,望大家见谅,嘿嘿。
第1张图片是main.c。采用横屏方式,背景颜 {MOD}为绿 {MOD},在点(25,40)画了一个颜 {MOD}为GRAY1(颜 {MOD}为0x8410)的点,。第2张图为debug时读取该点的颜 {MOD}到color变量中,读回的结果为0x8410。愿这份驱动给大家带来一些便利。附件为源代码,编译环境为MDK4.74
先看手册: 读RAM指令36H 下面的解释是 先发36H,然后一个空字节,然后回来3个字节颜 {MOD},再看你软件怎么把3字节拼接2字节了。 实际就是直接按手册操作即可,3字节依次RGB,分别去掉3,2,3位后拼接。
再看你的
//读点
u16 Lcd_ReadPoint(u16 x, u16 y)
{
u8 r = 0, g = 0, b = 0;
u16 R, G, B, Data;
Lcd_SetRegion(x, y, x, y); //设置窗口
lcd_w_reg(0X2E); //读数据?
Lcd_ReadData(0xff); //两个空操作
Lcd_ReadData(0xff);
g = Lcd_ReadData(0xff); //读出3字节
b = Lcd_ReadData(0xff); //
r = Lcd_ReadData(0xff); //读出的数据是按照GBR顺序的
R = (r >> 3)& 0x00ff;
G = (g >> 2)& 0x00ff;
B = (b >> 3)& 0x00ff; //重新排列
Data = (R << 11) | (G << 5) | (B);
return Data;
}
首先设置窗口就严重不合逻辑,设计芯片的人是傻逼才会做成读一个点居然要重新设置窗口,读一个点肯定是设置坐标啊!!!
Lcd_ReadData(0xff); //两个空操作
Lcd_ReadData(0xff);
两个空操作,不知道你从哪看来的时序。
r = Lcd_ReadData(0xff); //读出的数据是按照GBR顺序的
明明设计成读写一样逻辑很顺溜,谁做的9341会闲的没事去加个读写反序呢,又是不合逻辑。
真相就是你把窗口设置成1*1大小了,这没毛病,你就是嫌单片机跑太快故意做成低效函数反复切换窗口。 就1*1总共就一个坐标也不会递增坐标巡回了,连续读或写会在同一个GRAM单元循环WR,就是RGBRGBRGBRGB... 你把第一个R扔掉了,读回来自然是GBRGBRGBRGBR... 同理,你也可以再创造一个瞄点函数,把第一个扔掉,后面再补,煞有介事的重新挪腾一下RGB顺序,将降低效率发扬光大。
应该
u16 Lcd_ReadPoint(u16 x, u16 y)
{
u8 r = 0, g = 0, b = 0;
u16 R, G, B, Data;
Lcd_Setpoint(x, y); //设置坐标
lcd_w_reg(0X2E); //读数据
Lcd_ReadData(0xff); //空操作
r = Lcd_ReadData(0xff); //读出3字节RGB 降位拼合
b = Lcd_ReadData(0xff); //
b = Lcd_ReadData(0xff); //
R = (r >> 3)& 0x00ff;
G = (g >> 2)& 0x00ff;
B = (b >> 3)& 0x00ff; //重新排列
Data = (R << 11) | (G << 5) | (B);
return Data;
}
一周热门 更多>