图解LCD硬件原理 && 调色板与Framebuffer原理

您所在的位置:网站首页 指针工作原理图解 图解LCD硬件原理 && 调色板与Framebuffer原理

图解LCD硬件原理 && 调色板与Framebuffer原理

2024-07-17 04:04| 来源: 网络整理| 查看: 265

001LCD硬件原理 LCD操作原理LCD屏幕上的点称为像素屏幕后面有电子枪【红绿蓝】:一边移动,一边发出颜色每来一个clk,移动一个像素R、G、B三组线确定颜色接收到HSYNC(水平同步信号)脉冲,电子枪从最右边跳到最左边。(跳到下一行)接收到VSYNC[垂直同步信号]从最下边跳到最上边。(跳到原点)LCD时序图LCD硬件原理图006 LCD设置打开LCD4.3芯片手册,根据芯片手册设置2440_LCD时序图LCD display config

可以通过调整四边黑框调整屏幕边框

BPP(bit per pixel)

BPP:在FrameBuffer中每个像素占据多少位,

硬件上LCD的BPP是确定的 但是可以对LCD进行封装16条线,每个像素占16位数据,16BPP002 S3C2440_LCD控制器

功能:

1.从内存中(FrameBuffer)取出某个像素的数据:把FrameBuffer的地址告诉LCD控制器,BPP,分辨率

2.配合其他信号把数据发送给LCD:把时序告诉LCD控制器,设置引脚的极性

BLOCK DIAGRAM16BPP

调色板[ palette]

本质:内存

16BPP中,本来用16bit表示1像素,也可用利用调色板,用8位表示;8BPP:伪彩色;16/24BPP:真彩色。

那么当使用像素深度为8pp时候,像素深度和我们的带宽不一致,我们的颜色要用16位表示,如果直接用上肯定不可能,那我们就可以选择用调色板,调色板中存放了256种16bpp的颜色,这时候我们color存放的就不是真实的颜色值了,而是存放的是调色板中256种颜色的索引,成线性关系一一对应,这样我们大大减轻了系统的负担。用16bpp还是8bpp这得取决实际情况,16bpp肯定比8pp清晰,但同时带来的负荷也更加重。

过程:FrameBuffer中8bit —> LCD控制器 —> 调色板中取16bit【用8bit作为索引,取出真正的颜色】 —> LCD003LCD编程_框架与准备定义结构体定义引脚极性结构体代码语言:javascript复制typedef struct pins_polarity{ int vclk; /* normal:在下降沿获取 */ int rgb; /* normal:高电平表示1 */ int hsync; /* normal:高脉冲 */ int vsync; /* normal:高脉冲 */ }pins_polarity,*p_pins_polarity; 定义时序结构体代码语言:javascript复制typedef struct time_sequence{ /* 垂直方向 */ int tvp;/* vysnc脉冲宽度 */ int tvb;/* 上边黑框,Vertical Back porch */ int tvf;/* 下边黑框,Vertical Front porch */ /* 水平方向 */ int thp;/* hysnc脉冲宽度 */ int thb;/* 左边黑框,Horizontal Back porch */ int thf;/* 右边黑框,Horizontal Front porch */ }time_sequence,*p_time_sequence; 定义lcd参数结构体代码语言:javascript复制typedef struct lcd_params{ /* 引脚极性 */ pins_polarity pins_pol; /* 时序 */ pins_sequence time_seq; /* 分辨率,bpp */ int xres; int yres; int bpp; /* framebuffer的地址 */ unsigned int fb_base; }lcd_params,*p_lcd_params; 004LCD_编程_抽象出重要结构体结构体传参005LCD_LCD控制器

S3C2440_controller.c:根据S3C2440数据手册,设置LCD控制器相关寄存器

引脚初始化代码语言:javascript复制void jz2440_lcd_pin_init(void) { /* 初始化引脚 : 背光引脚*/ GPBCON &= ~0x3; GPBCON |= 0x01; /* 初始化引脚 : LCD专用引脚*/ GPCCON = 0xaaaaaaaa; GPDCON = 0xaaaaaaaa; /* PWREN */ GPGCON |= (3bpp == 8 ? 0xb :\ plcdparams->bpp == 16 ? 0xc:\ 0xd; /* 0xd:24bpp */ LCDCON1 = (clkval =y2) { fb_put_pixel(x1,y1,color); if(e>0){x1+=1;e-=dy;} y1-=1; e+=dx; } } } } else //dx= 0) // dy>=0 { if(dx>=dy) // 4/8 octant { e=dy-dx/2; while(x1>=x2) { fb_put_pixel(x1,y1,color); if(e>0){y1+=1;e-=dx;} x1-=1; e+=dy; } } else // 3/8 octant { e=dx-dy/2; while(y10){x1-=1;e-=dy;} y1+=1; e+=dx; } } } else // dy=dy) // 5/8 octant { e=dy-dx/2; while(x1>=x2) { fb_put_pixel(x1,y1,color); if(e>0){y1-=1;e-=dx;} x1-=1; e+=dy; } } else // 6/8 octant { e=dx-dy/2; while(y1>=y2) { fb_put_pixel(x1,y1,color); if(e>0){x1-=1;e-=dy;} y1-=1; e+=dx; } } } } } 009显示文字

字符显示原理

显示字符时,坐标表示

代码语言:javascript复制void fb_print_char(int x, int y, char c,unsigned int color) { int i,j; /* 根据c的asscii码在fontdata_8x16中得到点阵数据 */ unsigned char *dots = &fontdata_8x16[c *16]; unsigned char data; int bit; /* 根据点阵来设置对应像素的颜色 */ for(j = y; j < y+16; j++) { data = *data++; bit = 7; for(i = x; i < x+8; i++) { /* 根据点阵的某位决定是否描颜色 */ if(data & (1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3