读一个点的颜色,要读三次。
1.dummy 假读(增加容错)、2.R1G1 3.B1R2 (需要两行去构成一个RGB)
uint16_t r,g,b;
r = lcd_rd_data();
g = lcd_rd_data(); (对rgb每个都预留一个16位的寄存单元)
b = lcd_rd_data();
uint16_t lcd_rd_data(void)
{
uint16_t ram; /* 定义变量 */
DATA_IN_MODE(); /* 设置数据输入 */
LCD_RS(1); /* 操作数据 */
LCD_CS(0); /* 选中 */
LCD_RD(0); /* RD低电平 */
ram = LCD_DATA_IN; /* 读取数据 */
LCD_RD(1); /* RD高电平 */
LCD_CS(1); /* 释放片选 */
DATA_OUT_MODE(); /* 设置数据输出 */
return ram; /* 返回读数 */
}
uint16_t lcd_read_point (uint16_t x, uint16_t y)
{
uint16_t r = 0, g = 0, b = 0; /* 定义变量 */
lcd_set_cursor(x, y); /* 设置坐标 */
lcd_wr_regno(0X2E); /* 发读点命令 */
r = lcd_rd_data(); /* 假读 */
r = lcd_rd_data(); /* 读rg */
b = lcd_rd_data(); /* 读b */
g = r & 0XFF; /* 得到g值 */
return (((r >> 11) << 11) | ((g >> 2) << 5) | (b >> 11));
}
重点是理解这行代码 g = r & 0XFF; /* 得到g值 */
return (((r >> 11) << 11) | ((g >> 2) << 5) | (b >> 11));
g = r & 0XFF; 这条代码是对第一次读取的16位数据中提取绿色Green的数据,将r与0XFF做与运算,换算成二进制就是1111 1111,与是都为1时才输出1,否则为0;所以是将16位数据的后八位与1111 1111做与运算,即是将r的后八位非零数据提出,即是得:
由于g在之前通过uint16_t r,g,b;定义,g的前八位默认补成0。即0000 0000 G1【5;0】xx (X代表未知位)
然后到 return (((r >> 11) << 11) | ((g >> 2) << 5) | (b >> 11));这条代码
R1[4:0] XX G1[5:0] XX 右移11位的途中将所有位都清零,因为右移是右边一位是将所有数据右移,最右数据清除,最左数据补零,左移反之。右移11位后是0000 0000 000 R1【4:0】
再左移11位后得到R1【4:0】 000 0000 0000,完成16位数据中只保留红色的参数。
绿色与蓝色数据同理,然后通过 | 的或运算将三条16位的数据拼接。或是只要有1就会输出1,只有两个都是0时才输出0。
最后组成 R1【4:0】G1【5:0】B1【4:0】的RGB565的16位数据。完成对一个像素点的数据读取。