LCD 读GRAM 指令(详细)

读一个点的颜色,要读三次。

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位数据。完成对一个像素点的数据读取。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值