Chinaunix首页 | 论坛 | 博客
  • 博客访问: 473717
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: 嵌入式

2016-10-09 21:00:56

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.编写代码
  1. /*
  2.  * lcd.c
  3.  *
  4.  * Created on: 2016-10-8
  5.  * Author: root
  6.  */

  7. #define GPCCON (*(volatile unsigned long*) 0x56000020)
  8. #define GPDCON (*(volatile unsigned long*) 0x56000030)
  9. #define GPGCON (*(volatile unsigned long*) 0x56000060)
  10. #define LCDCON1 (*(volatile unsigned long*) 0X4D000000)
  11. #define LCDCON2 (*(volatile unsigned long*) 0X4D000004)
  12. #define LCDCON3 (*(volatile unsigned long*) 0X4D000008)
  13. #define LCDCON4 (*(volatile unsigned long*) 0X4D00000C)
  14. #define LCDCON5 (*(volatile unsigned long*) 0X4D000010)
  15. #define LCDSADDR1 (*(volatile unsigned long*) 0X4D000014)
  16. #define LCDSADDR2 (*(volatile unsigned long*) 0X4D000018)
  17. #define LCDSADDR3 (*(volatile unsigned long*) 0X4D00001C)
  18. #define TPAL (*(volatile unsigned long*) 0X4D000050)



  19. #define CLKVAL 4 //10 = 100/((CLKVAL+1)*2)
  20. #define VSPW 9 //1+9 =10
  21. #define VBPD 1 //1+1 = 2
  22. #define LINEVAL    271
  23. #define VFPD 1 //1+1 = 2
  24. #define HSPW 40 //40+1 = 41
  25. #define HBPD 1
  26. #define HOZVAL    479
  27. #define HFPD 1

  28. unsigned short LCDBUFFER[272][480];

  29. void lcd_port_init()
  30. {
  31.     //引脚初始化
  32.     GPDCON = 0xaaaaaaaa;
  33.     GPCCON = 0xaaaaaaaa;
  34. }

  35. void lcd_control_init()
  36. {
  37.     //时序初始化
  38.     LCDCON1 = (CLKVAL<<8)|(0x3<<5)|(0xc<<1)|(0<<0);
  39.     LCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW<<0);
  40.     LCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD<<0);
  41.     LCDCON4 = (HSPW);
  42.     LCDCON5 = (1<<11)|(1<<9)|(1<<8);//|(1<<0);
  43.     //帧缓冲初始化
  44.     LCDSADDR1 = (((unsigned long)LCDBUFFER>>22)<<21)|(((unsigned long)LCDBUFFER>>1)&0x1fffff);
  45.     LCDSADDR2 = (((unsigned long)LCDBUFFER +272*480*2)>>1&0x1fffff);
  46.     LCDSADDR3 = (0<<11)|(480*2/2);

  47.     TPAL = 0;
  48. }

  49. void lcd_init()
  50. {
  51.     lcd_port_init();
  52.     lcd_control_init();

  53.     //打开LCD电源
  54.     GPGCON |= 0b11<<8;
  55.     LCDCON5 |= (1<<3);
  56.     LCDCON1 |= 1;
  57. }

  58. void point(unsigned int x,unsigned int y,unsigned int color)
  59. {
  60.     unsigned int red, green, blue;
  61.     red = (color>>19) & 0x1f;
  62.     green = (color>>10) & 0x3f;
  63.     blue = (color>>3) & 0x1f;

  64.     LCDBUFFER[y][x] = (unsigned short)(red<<11)|(green<<6)|(blue<<0);
  65. }

  66. void Paint_Bmp(unsigned short x0,unsigned short y0,unsigned short wide,unsigned short high,const unsigned char *bmp)
  67. {
  68.     unsigned short x,y,c;
  69.     unsigned long p = 0;

  70.     for(y = y0; y < y0+high;y++)
  71.     {
  72.         for(x = x0; x < x0+wide;x++)
  73.         {
  74.             c = bmp[p] | (bmp[p+1]<<0);

  75.             if ((x <480) && (y < 272))
  76.                 LCDBUFFER[y][x] = c;

  77.             p = p +2;
  78.         }
  79.     }
  80. }

  81. void clearSrc(unsigned int color)
  82. {
  83.     TPAL = (1<<24)|(color&0xffffff);
  84. }


  85. const unsigned char bmp[90208];
  86. void lcd_test()
  87. {
  88.     int x;

  89.     for(x=0; x<480; x++)
  90.     {
  91.         point(x++,150,0xFF0000);
  92.     }

  93.     Paint_Bmp(0,0,220,220,bmp);
  94.     clearSrc(0xff0000);
  95. }

阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~