好,这一季,我们来说说我手头上的这个B505的屏的问题.
我们先看看它是如何表达颜色的.上些季我们学了颜色的格式,就是 Bit0~Bit4 表示蓝色, Bit5~Bit10表示绿色. Bit11~Bit15表示红色.
蓝色,红色用5个Bit来表示,绿色用6个Bit来表示.就是说 蓝色和红色只有31个色阶.我们人眼能分辨出256种色阶,我们的数码产品显示图片,都是256个色阶.多了没用,我们分不出来.
所以可以十分肯定,这种屏显示文字可以,但显示图片会很坑爹.丢个灰度球进去那个球就象西瓜一样了.很多色阶显不出来,显示图片会丢很多细节.
好,我们写些代码,一个个色来显示出他的各色阶情况.我们的屏有320行,如每10条线一种色阶,那就能将31个色阶全显出来.我们更改一下MAIN()函数.显示一下蓝色的色阶.
int main(void)
{
u16 RGB1;
u16 CRGB,k,l;
u16 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB1=CRGB=0x00;//0x1f;
k=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==10)
{
RGB1=RGB1+1;
CRGB=RGB1;
k=0;
}
}
//********************************************************************************************
}
}
大家看一下,这就是我们所能出的纯蓝色.只能有这么多种了纯蓝了.我们再试下红色,代码如下:
int main(void)
{
u16 RGB1;
u16 CRGB,k,l;//FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800};
u16 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
// LCD_WriteReg(0x0007, 0x0); //<<====关屏
// LCD_WriteReg(0x0007, 0x0173); //26万色显示开启 1001000100000
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB1=CRGB=0x00;//0x1f;
k=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==10)
{
RGB1=RGB1+1;
CRGB=RGB1<<11;
k=0;
}
}
//********************************************************************************************
}
}
好,我们再来显示一下绿色.因为它用6个Bit来表示,比蓝色和红色多一倍.所以我们画5行再加一个色阶.代码如下.
int main(void)
{
u16 RGB1;
u16 CRGB,k,l;//FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800};
u16 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
// LCD_WriteReg(0x0007, 0x0); //<<====关屏
// LCD_WriteReg(0x0007, 0x0173); //26万色显示开启 1001000100000
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB1=CRGB=0x00;//0x1f;
k=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==5)
{
RGB1=RGB1+1;
CRGB=RGB1<<5;
k=0;
}
}
//********************************************************************************************
}
}
看到没有,三种颜色我们都看过了,发现在暗色的那好几个色阶很明显分段.说明它在显示图片时暗色部位失真更厉害,失直多少?那要用专业的分光密度仪来量了. 色彩学有很多很多东东可以说,
我们到此为止吧,要不几十季都说不完.
有人说为啥不写个代码一次全显出来?其实我是从一次显三色的代码改过来的,我有个经验要说一下,学习计算机或其外设的时候,写代码越简单越好,经验告诉我,写得复杂的话还没学会
就在找自己的代码的错处.这样越学就越不想学了.最快的时间出成绩,才会让我们更有兴趣学下去!
好了,我再扫一下色学盲,RGB有了,那么他们的补色,就是它们的反色是怎么显示出来呢,它的的补色是 CMY 青品黄 ,红色R的补色是青C, 绿G的补色是品色M,蓝B的补色是黄, 它们的关系就象
数学的正负数, 合在一起就会没有颜色!! 相互吸叫掉了,如你用蓝色的电筒去照黄的的纸, 你看到的颜色是黑色!!
我们如何用RGB来产生CMY呢,三基色原理==> B+G=C B+R=M R+G=Y ,明白了吧,RGB中,任意两种颜色的各是第三种颜色的补色!!
好,我们来写个代码显示青色CMY, RGB的数值都是等量的:
好,先来显示C的代码:
int main(void)
{
u16 RGB1,RGB2,RGB3;
u16 CRGB,k,l;//FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800};
u16 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB1=RGB2=RGB3=CRGB=0x00;//0x1f;
k=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==10)
{
RGB1=RGB1+1;
CRGB=RGB1;
RGB2=RGB2+2; <<====也可以加1,但觉得青不够,你们可以试一下加1看结果
RGB3=RGB2<<5;
CRGB |=RGB3;
k=0;
}
}
//********************************************************************************************
}
}
不要以为是蓝哈,这是青!!只是不纯的青!!因为这屏只能表达成这样了.
好,品M是这样的.代码如下:
int main(void)
{
u16 RGB1,RGB2,RGB3;
u16 CRGB,k,l;//FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800};
u16 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB1=RGB2=RGB3=CRGB=0x00;//0x1f;
k=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==10)
{
RGB1=RGB1+1;
CRGB=RGB1;
RGB2=RGB2+1;
RGB3=RGB2<<11;
CRGB |=RGB3;
k=0;
}
}
//********************************************************************************************
}
}
这就是品了,好,显示黄色的代码如下:
int main(void)
{
u16 RGB1,RGB2,RGB3;
u16 CRGB,k,l;//FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800};
u16 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB1=RGB2=RGB3=CRGB=0x00;//0x1f;
k=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==10)
{
RGB1=RGB1+2;<<====也可以加1,但觉得青不够,但加了2绿又多了......你们可以试一下加1看结果
CRGB=RGB1<<5;
RGB2=RGB2+1;
RGB3=RGB2<<11;
CRGB |=RGB3;
k=0;
}
}
//********************************************************************************************
}
}
这就是黄.有人说有几行偏色了.对,没错,我们的屏只能这样了,我们的屏是给山寨手机用的.显示字符可以但显示图片是太勉强它了.
其实,要真正能按要求显示纯正图片的屏普通人是很难见到的,这样的屏,21英寸的,价格要20万人民币左右.我们常用的电脑显示屏,要稳定达到正真的真彩,是达不到的.SO我们的电脑
显示器只要1000左右,山寨手机屏 30元左右, 所以,我们要知足哈.
好了,从我的B505颜色寄存器可知,能显示2的16次方种颜色,就是65535种色彩.灰阶只有31种.
好,我们写个灰阶的代码出来:~~~~~~~~~~~~~~~
不行,为啥呢?
因为大家看 原子的书, 153页. 屏里的寄存器 是18位的.就是说红色的Bit0和Bit5是连在一起的.蓝色的Bit4和Bit0是连在一起的.坑爹了!!!!!!!!!!!!!!!!!!!!
就是说,要在屏的显存里RGB三个色的值都一样的话,只有很少的几个值了.我编了个程式,算出 只有 0到7 25到31这15个值的时候 屏里的RGB三色的色值才相等.所以 代码只能这样写了:
那么上边的CMY的代码都得变了,怎么变,大家自己思考了,真坑爹呀,不够脚就不要加内存嘛,这样搞更麻烦,真不知做屏的人怎么想的!!
int main(void)
{
u16 CRGB,RGB0,RGB1,RGB2,RGB3,RGB4,RGB5;
u16 i,j,k,l;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
// LCD_WriteReg(0x0007, 0x0); //<<====关屏
// LCD_WriteReg(0x0007, 0x0173); //26万色显示开启 1001000100000
while (1)
{
//********************************************************************************************
LCD_WriteReg(0x0020,0x00); //X
LCD_WriteReg(0x0021,0x00); //Y
LCD_WR_REG(0x22);
RGB0=RGB1=RGB2=RGB3=RGB4=CRGB=0x00;
k=l=0;
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WR_DATA(CRGB);
}
k=k+1;
if (k==10)
{
RGB0=RGB0+1;
RGB1=RGB1+2;<<====也可以加1,但觉得偏品色,你们可以试一下加1看结果
RGB2=RGB1<<5;
RGB3=RGB3+1;
RGB4=RGB3<<11;
l=l+1;
if ((l<=7)|(l>=25))
{
CRGB =RGB0|RGB2|RGB4;
}
k=0;
}
}
//********************************************************************************************
}
}
看到没,这个灰中间层掉了好多.只能有一头一尾......................
哇靠呀,这个屏基本做不了颜色运算.白搭.只能做些简单的色彩介面了,但总比我们之前用过的屏好多了~~~~~~~~~~~~~~~~~~~
|