LCD 亮起来

LCD工作原理

硬件体系:
这里写图片描述

液晶:
液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会做有规律的旋转,这样对光线(背光灯产
生)产生了一定的控制,形成一个像素,而很多像素又可构成完整图象。

LCD是Liquid Crystal Display液晶显示器的简称。液晶显示器按驱动方式可分为STN,GF,TFT等种类,其中TFT屏在嵌入式开发中经常使用。

LCD驱动芯片:
LCD驱动芯片是控制液晶分子发生变化的模块,它为液晶分子的偏转提供电压。通常情况下,LCD驱动芯片都与液晶屏面板做到一个电路板上。

LCD控制器:
液晶要能正确的显示图像,除了要有LCD驱动芯片,还要有LCD控制器来给LCD驱动芯片提供必要的数据和控制信号.多数ARM处理器内部都集成有LCD控制器。

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屏)。

显示过程:
1、显示从屏幕左上角第一行的第一个点开始,一个点一个点地在LCD上显示,当显示到屏幕的最右边就结束这一行(Line)。

2、接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。

3、以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成。

时序信号:
这里写图片描述
VSYNC:垂直同步信号
HSYNC:水平同步信号
VCLK:象素时钟信号
VD[23:0]:LCD像素数据输出端口
VDEN:数据使能信号
LEND:行结束信号

1、显示从屏幕左上角第一行的第一个点开始,一个点一个点地在LCD上显示,点与点之间的时间间隔为VCLK(像素时钟信号);当显示到屏幕的最右边就结束这一行(Line),这一行的显示对应时序图上的HSYNC(水平同步信号)。

2、接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。

3、以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成,这一帧的显示时间在时序图上表示为VSYNC(垂直同步信号)。

开发板程序举例

//定义寄存器
#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 VSPW 9
#define VBPD 1
#define LINEVAL 271 //行数
#define VFPD 1
#define CLKVAL 4   //10 = 100/((CLKVAL+1)*2)
#define HSPW 40
#define HBPD 1
#define HOZVAL 479  //列数
#define HFPD 1

unsigned short LCDBUFFER[272][480];//帧缓冲,二维数组

typedef unsigned int U32;
typedef unsigned short U16;
typedef unsigned char U8;

void lcd_port_init()//初始化GPIO引脚
{
    GPDCON = 0xaaaaaaaa;
    GPCCON = 0xaaaaaaaa;        
}

void lcd_control_init() //配置LCD控制寄存器,时序初始化,设置帧缓冲地址,配置一些杂项
{   
    LCDCON1 = (CLKVAL<<8)|(0x3<<5)|(0xc<<1)|(0<<0);
    LCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);
    LCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD);
    LCDCON4 = (HSPW);
    LCDCON5 = (1<<11)|(1<<9)|(1<<8);

    LCDSADDR1 = (((U32)LCDBUFFER>>22)<<21) | (((U32)LCDBUFFER>>1)&0x1fffff);
    LCDSADDR2 = (((U32)LCDBUFFER+272*480*2)>>1)&0x1fffff;
    LCDSADDR3 = (0<<11) | (480*2/2);

    TPAL = 0;//关闭临时调色板
}

void lcd_init() //LCD初始化
{
    lcd_port_init();
    lcd_control_init();

    //打开LCD电源
    GPGCON  |= (0x3<<8);
    LCDCON5 |= (1<<3);   
    LCDCON1 |= 1;
}

//画一个点的函数,颜色分解为红绿蓝,红色为19-23,红绿黄位数分别为5:6:5
//x为第几列,y为第几行
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<<5)|blue);  
}

//画图函数
void Paint_Bmp(U16 x0,U16 y0,U16 wide,U16 high,const U8 *bmp)
{
    U16 x,y;
    U16 c;
    U32 p = 0;

    for( y = y0 ; y < y0+high ; y++ )
    {
        for( x = x0 ; x < x0+wide ; x++ )
        {
            c = bmp[p] | (bmp[p+1]<<8) ;                                        

            if ( ( x < 480) && ( y < 272) )
                LCDBUFFER[y][x] = c ;       
            p = p + 2 ; 
        }
    }
}

//利用调色板实现单色显示,全部为红色
void clearSrc(unsigned int color)
{
    TPAL = (1<<24)|(color&0xffffff);    
}

extern unsigned char bmp[90200];//由专用软件将图片转化为图片数据

void lcd_test()
{
    int x;   
    for(x=0;x<480;x++)  //画一条红色横线
        point(x++,150,0xff0000);

    Paint_Bmp(0,0,220,220,bmp);//画一张图片

    clearSrc(0xff0000);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值