(C语言问题)LCD驱动舍弃RGB位数的编程问题
因为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 = (*********** & ***********) = ***********(前5位有效)
g = G & 0xFC = (*********** & ***********) = ***********(前6位有效)
b = B & 0xF8 = (*********** & ***********) = ***********(前5位有效)
color是16位的short int类型,高8位由r的5位和g的前3位组合而成。
high就可以写成这样:high = r | (g<<5)?应该是high = r | (g>>5)吧
high = r | (g>>5) = *********** | (***********>>5) = *********** | *********** = ***********
low = (g<<3) | (b>>3) = (***********<<3) | (***********>>3) = 0000000 | 0001110 = ***********
所有把低位和高位合起来就是color=(high << 8) | low=(*********** ***********<<8) | (*********** ***********) = (*********** ***********)|(*********** ***********) = *********** *********** = 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))