LCD学习

xiaoxiao2021-02-28  9

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); } <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 阅读(34) | 评论(0) | 转发(0) | 0

上一篇:设置使Linux下双击文件夹时不要每次都打开一个新窗口

下一篇:触摸屏学习

相关热门文章 SHTML是什么_SSI有什么用...查看linux中某个端口(port)...卡尔曼滤波的原理说明...shell中字符串操作关于java中的“错误:找不到或... 给主人留下些什么吧!~~ 评论热议
转载请注明原文地址: https://www.6miu.com/read-450129.html

最新回复(0)