野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11492|回复: 12

LCD中读GRAM数据的返回函数看不懂

[复制链接]
发表于 2015-3-28 09:49:40 | 显示全部楼层 |阅读模式
return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11)) ;这句话是什么意思?
回复

使用道具 举报

发表于 2015-3-28 10:26:52 | 显示全部楼层
返回RGB565格式
回复 支持 反对

使用道具 举报

发表于 2015-3-28 11:04:33 | 显示全部楼层
本帖最后由 11kxmx 于 2015-3-28 11:18 编辑

我是这样看的
R是16位数 要保留5位,肯定取高5位 右移11位就去掉了低11位 再左移11位 就到了它该去的地方 高5位
G是16位数 要保留6位,肯定取高6位 右移10位就去掉了低10位 再左移5   也到了它该去的地方 中间6位
B是16位数 要保留5位,肯定取高5位 右移11位就去掉了低11位 并且已经到了它该去的地方      低5位
移来移去丢失的位数都补0了 求"或"后对结果无影响
这样操作后 颜色排列成了 RRRRR GGGGGG BBBBB 即RGB 565格式 
不过我也有些疑问,RGB是我们从摄像头读出后写入LCD的数据 从摄象头读出时得到的是两个8位数 合成16位后一次写入LCD
当照相机用时,再从LCD读出来,可读出后怎么就变成了3个16位的数,并且能保证有效数据都跑到高8位上了?
如果有效数据不是在高8位上,移来移去岂不把颜色数据丢失了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-28 11:21:39 | 显示全部楼层
11kxmx 发表于 2015-3-28 11:04
我是这样看的
R是16位数 要保留5位,肯定取高5位 右移11位就去掉了低11位 再左移11位 就到了它该去的 ...

谢谢你的解答。 不好意思, 我没学过摄像头,所以不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-28 11:23:04 | 显示全部楼层

RGB是我们从摄像头读出后写入LCD的数据 从摄象头读出时得到的是两个8位数 合成16位后一次写入LCD
当照相机用时,再从LCD读出来,可读出后怎么就变成了3个16位的数,并且能保证有效数据都跑到高8位上了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-28 11:23:27 | 显示全部楼层

RGB是我们从摄像头读出后写入LCD的数据 从摄象头读出时得到的是两个8位数 合成16位后一次写入LCD
当照相机用时,再从LCD读出来,可读出后怎么就变成了3个16位的数,并且能保证有效数据都跑到高8位上了?
回复 支持 反对

使用道具 举报

发表于 2015-3-28 12:39:15 | 显示全部楼层
本帖最后由 亽亼 于 2015-3-28 12:42 编辑

读写只是互逆过程,过来过程相反而已啊
回复 支持 反对

使用道具 举报

发表于 2015-3-28 12:45:56 | 显示全部楼层
QQ截图20150328124312.png
读到也是RGB565数据啊,结果处理(红色框),变成uchar型的3个数据
回复 支持 反对

使用道具 举报

发表于 2015-3-29 13:02:47 | 显示全部楼层
本帖最后由 11kxmx 于 2015-3-30 09:29 编辑

火哥:
r g b参数是read_data read_data来自LCD_GetPoint(y+j, x+i)
LCD_GetPoint(uint16_t x , uint16_t y)又来自LCD_RD_data(void)
LCD_RD_data(void) 原程序是這樣的:
uint16_t LCD_RD_data(void)        
{        
        uint16_t R=0, G=0, B=0 ;
        R = *(__IO uint16_t *)Bank1_LCD_D;           /*FIRST READ OUT DUMMY DATA*/
        R = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT RED DATA  */
        B = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT BLACK DATA*/
        G = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT GREEN DATA*/        
    return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11));
}
R  G   B  三個變量都 是16 位的 若是8位(或有效數據都在低8 位上), 象R右移11 位不就成0了嗎?再左移11位回去還是0
主要是下面幾句話不太明白:
    R = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT RED DATA  */
    B = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT BLACK DATA*/
    G = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT GREEN DATA*/

我想它們只是簡單的讀出,讀出來都是16位數據,因為我們配置8080數據總線寬度也是16位的,可當初寫入LCD時RGB三個參數合起來才占16位呀
是不是讀出的這三個16 位數的低8 位全是0呀,還是低8 位根本就無意義?

回复 支持 反对

使用道具 举报

发表于 2015-3-30 09:31:37 | 显示全部楼层
本帖最后由 11kxmx 于 2015-3-30 09:41 编辑
亽亼 发表于 2015-3-28 12:45
读到也是RGB565数据啊,结果处理(红色框),变成uchar型的3个数据


火哥:
r g b参数是read_data read_data来自LCD_GetPoint(y+j, x+i)
LCD_GetPoint(uint16_t x , uint16_t y)又来自LCD_RD_data(void)
LCD_RD_data(void) 原程序是這樣的:
uint16_t LCD_RD_data(void)        
{        
        uint16_t R=0, G=0, B=0 ;
        R = *(__IO uint16_t *)Bank1_LCD_D;           /*FIRST READ OUT DUMMY DATA*/
        R = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT RED DATA  */
        B = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT BLACK DATA*/
        G = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT GREEN DATA*/        
    return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11));
}
R  G   B  三個變量都 是16 位的 若是8位(或有效數據都在低8 位上), 象R右移11 位不就成0了嗎?再左移11位回去還是0
主要是下面幾句話不太明白:
    R = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT RED DATA  */
    B = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT BLACK DATA*/
    G = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT GREEN DATA*/

我想它們只是簡單的讀出,讀出來都是16位數據,因為我們配置8080數據總線寬度也是16位的,可當初寫入LCD時RGB三個參數合起來才占16位呀
是不是讀出的這三個16 位數的低8 位全是0呀,還是低8 位根本就無意義?

另外照相机这一章没有文字教程,我又翻了ISO-V2 和 ISO-MINI 的教程,都没有



  

回复 支持 反对

使用道具 举报

发表于 2015-3-30 11:48:27 | 显示全部楼层
楼主纠结的问题关系到ili9341这款液晶本身特性,可参考ili9341技术手册了解
楼主完全可以把
    R = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT RED DATA  */
    B = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT BLACK DATA*/
    G = *(__IO uint16_t *)Bank1_LCD_D;          /*READ OUT GREEN DATA*/
R,B,G数值通过串口打印出来看看啊
回复 支持 反对

使用道具 举报

发表于 2015-3-30 12:00:03 | 显示全部楼层
read R=4 B=0 G=1024
read R=4 B=0 G=1024
read R=4 B=0 G=1024
read R=8200 B=2080 G=2056
read R=8200 B=2080 G=2056
read R=48152 B=6332 G=6168
read R=39956 B=6300 G=5144
read R=8200 B=2080 G=2056
read R=8200 B=2080 G=2056
read R=4100 B=16 G=1024
read R=56348 B=8412 G=7200
read R=26636 B=4200 G=3088
read R=4 B=0 G=1024
这是部分打印出来R,B,G的值,说明液晶在存储每个像素点时是使用三个16位的寄存器存储
即一点就有对应的三个16位寄存器分别存储R,B,G的值(为什么要这样,那是液晶的事)
回复 支持 反对

使用道具 举报

发表于 2015-3-30 15:00:45 | 显示全部楼层
谢谢!知道怎么读就行了.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-5 10:24 , Processed in 0.033825 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表