1.硬件体系架构
1. LCD硬件体系
1.1 液晶
液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会做有规律的旋转,这样对光线(背光灯产生)产生了一定的控制,形成一个像素,而很多像素又可构成完整图象。
1.2 LCD~液晶屏
LCD是Liquid Crystal Display的简称。液晶显示器按驱动方式可分为
STN,GF,TFT等种类,其中TFT屏在嵌入式开发中经常使用。
1.3 LCD驱动芯片
LCD驱动芯片是控制液晶分子发生变化的模块,
它为液晶分子的偏转提供电压。通常情况下,LCD驱动芯片都与液晶屏面板做到一个电路板上。
1.4 LCD控制器
液晶要能正确的显示图像,除了要有LCD驱动芯片,还要有LCD控制器来给LCD驱动芯片提供必要的数据和控制信号.多数ARM处理器内部都集成有LCD控制器。
拥有四个寄存器,如图:
1.
REGBANK: 由17个可编程的寄存器组和一块
256*16的调色板内存组成,通过这些寄存器,可以配置LCD控制器.
2. LCDCDMA: 一个专用的DMA,它能自动地把在帧内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上.
3. VIDPRCS: 接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;
4.TIMEGEN: 由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等,而这些控制信号又与REGBANK寄存器组中的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同值,从而支持不同的LCD驱动器(即不
同的STN/TFT屏)。
2.LCD显示与信号
2.1图解LCD图形显示过程
1. 显示从屏幕左上角第一行的第一个点开始,一个点一个点地在LCD上显示,当显示到屏幕的最右边就结束这一行(Line)。
2. 接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。
3. 以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成。
2.2时序信号
VSYNC:垂直同步信号
HSYNC:水平同步信号
VCLK:象素时钟信号
VD[23:0]:LCD像素数据输出端口
VDEN:数据使能信号?LEND:行结束信号
2.2 显示过程与时序
1. 显示从屏幕左上角第一行的第一个点开始,一个点一个点地在
LCD上显示,点与点之间的时间间隔为VCLK(像素时钟信号);当显示到屏幕的最右边就结束这一行(Line),这一行的显示对应时序图上的HSYNC(水平同步信号)
2. 接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。
3. 以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成,这一帧的显示时间在时序图上表示为VSYNC(垂直同步信号)。
3.编写代码
-
/*
-
* lcd.c
-
*
-
* Created on: 2016-10-8
-
* Author: root
-
*/
-
-
#define GPCCON (*(volatile unsigned long*) 0x56000020)
-
#define GPDCON (*(volatile unsigned long*) 0x56000030)
-
#define GPGCON (*(volatile unsigned long*) 0x56000060)
-
#define LCDCON1 (*(volatile unsigned long*) 0X4D000000)
-
#define LCDCON2 (*(volatile unsigned long*) 0X4D000004)
-
#define LCDCON3 (*(volatile unsigned long*) 0X4D000008)
-
#define LCDCON4 (*(volatile unsigned long*) 0X4D00000C)
-
#define LCDCON5 (*(volatile unsigned long*) 0X4D000010)
-
#define LCDSADDR1 (*(volatile unsigned long*) 0X4D000014)
-
#define LCDSADDR2 (*(volatile unsigned long*) 0X4D000018)
-
#define LCDSADDR3 (*(volatile unsigned long*) 0X4D00001C)
-
#define TPAL (*(volatile unsigned long*) 0X4D000050)
-
-
-
-
#define CLKVAL 4 //10 = 100/((CLKVAL+1)*2)
-
#define VSPW 9 //1+9 =10
-
#define VBPD 1 //1+1 = 2
-
#define LINEVAL 271
-
#define VFPD 1 //1+1 = 2
-
#define HSPW 40 //40+1 = 41
-
#define HBPD 1
-
#define HOZVAL 479
-
#define HFPD 1
-
-
unsigned short LCDBUFFER[272][480];
-
-
void lcd_port_init()
-
{
-
//引脚初始化
-
GPDCON = 0xaaaaaaaa;
-
GPCCON = 0xaaaaaaaa;
-
}
-
-
void lcd_control_init()
-
{
-
//时序初始化
-
LCDCON1 = (CLKVAL<<8)|(0x3<<5)|(0xc<<1)|(0<<0);
-
LCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW<<0);
-
LCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD<<0);
-
LCDCON4 = (HSPW);
-
LCDCON5 = (1<<11)|(1<<9)|(1<<8);//|(1<<0);
-
//帧缓冲初始化
-
LCDSADDR1 = (((unsigned long)LCDBUFFER>>22)<<21)|(((unsigned long)LCDBUFFER>>1)&0x1fffff);
-
LCDSADDR2 = (((unsigned long)LCDBUFFER +272*480*2)>>1&0x1fffff);
-
LCDSADDR3 = (0<<11)|(480*2/2);
-
-
TPAL = 0;
-
}
-
-
void lcd_init()
-
{
-
lcd_port_init();
-
lcd_control_init();
-
-
//打开LCD电源
-
GPGCON |= 0b11<<8;
-
LCDCON5 |= (1<<3);
-
LCDCON1 |= 1;
-
}
-
-
void point(unsigned int x,unsigned int y,unsigned int color)
-
{
-
unsigned int red, green, blue;
-
red = (color>>19) & 0x1f;
-
green = (color>>10) & 0x3f;
-
blue = (color>>3) & 0x1f;
-
-
LCDBUFFER[y][x] = (unsigned short)(red<<11)|(green<<6)|(blue<<0);
-
}
-
-
void Paint_Bmp(unsigned short x0,unsigned short y0,unsigned short wide,unsigned short high,const unsigned char *bmp)
-
{
-
unsigned short x,y,c;
-
unsigned long p = 0;
-
-
for(y = y0; y < y0+high;y++)
-
{
-
for(x = x0; x < x0+wide;x++)
-
{
-
c = bmp[p] | (bmp[p+1]<<0);
-
-
if ((x <480) && (y < 272))
-
LCDBUFFER[y][x] = c;
-
-
p = p +2;
-
}
-
}
-
}
-
-
void clearSrc(unsigned int color)
-
{
-
TPAL = (1<<24)|(color&0xffffff);
-
}
-
-
-
const unsigned char bmp[90208];
-
void lcd_test()
-
{
-
int x;
-
-
for(x=0; x<480; x++)
-
{
-
point(x++,150,0xFF0000);
-
}
-
-
Paint_Bmp(0,0,220,220,bmp);
-
clearSrc(0xff0000);
-
}
阅读(463) | 评论(0) | 转发(0) |