LCD驱动舍弃RGB位数的编程问题

来源:互联网 发布:aftereffect软件下载 编辑:程序博客网 时间:2024/05/22 18:10

因为RGB的有效位数都不足一个字节(8位),那我们只能忍痛割爱了,舍弃掉低位数据,代码如下:
r = R & 0xF8;
g = G & 0xFC;
b = B & 0xF8;
high = r | (g<<5);  //???
low = (g<<3) | (b>>3);//????
color= (high << 8) | low;//????

在编写lcd驱动,16位的 而RGB分别8位共24位所以要舍弃 rgb分别位5,6,5位 。前面三行看得懂 后三行加注释??的谁帮解析一下啊

 

主要是一个位的移位转换问题。
举个例子:一个24位颜色RGB(0x50,0x60,0x70)转换为565的16位:
r = R & 0xF8 = (01010000 & 11111000) = 01010000(前5位有效)
g = G & 0xFC = (01100000 & 11111100) = 01100000(前6位有效)
b = B & 0xF8 = (01110000 & 11111000) = 01110000(前5位有效)
color是16位的short int类型,高8位由r的5位和g的前3位组合而成。
high就可以写成这样:high = r | (g<<5)?应该是high = r | (g>>5)吧
high = r | (g>>5) = 01010000 | (01100000>>5) = 01010000 | 00000011 = 01010011
low = (g<<3) | (b>>3) = (01100000<<3) | (01110000>>3) = 0000000 | 0001110 = 00001110
所有把低位和高位合起来就是color=(high << 8) | low=(00000000 01010011<<8) | (00000000 00001110) = (01010011 000000000)|(00000000 00001110) = 01010011 00001110 = 01010 011000 01110(565) (这个结果就是取r的前5位,g的前6位,b的前5位)

在microwindow中888向565转换的宏定义如下:更好理解一些
/* create 16 bit 5/6/5 format pixel from RGB colorval (0x00BBGGRR)*/*///c是一个unsigned long型值,0x00BBGGRR
/* In this format, alpha is ignored. #define COLOR2PIXEL565(c) /
((((c) & 0xf8) << 8) | (((c) & 0xfc00) >> 5) | (((c) & 0xf80000) >> 19))

原创粉丝点击