Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65045
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 138
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-26 16:24
文章分类

全部博文(38)

文章存档

2014年(38)

我的朋友

分类: 嵌入式

2014-03-13 16:55:49

经过一个周的反复学习调试,今晚终于把mini2440 lcd液晶屏裸机驱动调试成功了,最难设置的主要是它配套的统宝3.5寸液晶屏频率及参数的设置,主要需要配置几个寄存器。LCDCON1-5用来配置时钟频率,水平竖直宽度,前肩后肩以及脉宽的设置。

VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值。

VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值。

VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。

HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数。

HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数。

HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数。

LCDSADDR1-3用来设置缓存区,管脚的配置这里就不说了具体根据实验原理图和芯片手册完全可以设置,屏幕填充函数就是给二元数组赋值,相应每个点就带上那种颜色了。

 

具体实验代码如下,经过H-JTAGE在线调试通过的,网上基本没有可用源码,分享给大家希望对大家有所帮助。

 

#define    GLOBAL_CLK              1

#include

#include

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "lcdlib.c"

#include "lcdlib.h"

 

#define LCD_XSIZE  LCD_WIDTH

#define LCD_YSIZE  LCD_HEIGHT

#define SCR_XSIZE  LCD_WIDTH

#define SCR_YSIZE  LCD_HEIGHT

 

volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

 

void delay(int times)//延时函数

{

    int i;

    for(;times>0;times--)

      for(i=0;i<400;i++);

}

 

void Lcd_init(void)

{

       //管脚的配置

       rGPCUP  = 0xffffffff;

       rGPCCON = 0xaaaa 02a9;

       rGPDUP  = 0xffffffff;

       rGPDCON = 0xaaaaaaaa;

 

       rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 <<  5) | (12 << 1);

       rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);

       rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH  - 1) <<  8) | (LCD_LEFT_MARGIN << 0);

       rLCDCON4 = (13 <<  8) | (LCD_HSYNC_LEN << 0);

       rLCDCON5   =  LCD_CON5;

 

       rLCDSADDR1 = (((U32)LCD_BUFFER >> 22) << 21) | ((M5D((U32)LCD_BUFFER >> 1)) <<  0);

       rLCDSADDR2 = M5D(((U32)LCD_BUFFER + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);

       rLCDSADDR3 = LCD_WIDTH;       

 

       rLCDINTMSK|=(3);      // 屏蔽LCD中断

 

       rTCONSEL = 0;            //无效LPC3480

 

 

       rGPGUP=rGPGUP&(~(1<<4))|(1<<4);      //GPG4上拉电阻无效

 

       rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //设置GPG4LCD_PWREN

 

       rGPGDAT = rGPGDAT | (1<<4) ;               //GPG41

 

 

 

       rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3);   //有效PWREN信号

 

       rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5);   //PWREN信号极性不翻转

 

       rLCDCON1|=1;                   //LCD开启

 

}

 

void Draw_Circular(U32 c)//画圆函数

 

{

 

       int x,y ;

 

       int tempX,tempY;

 

       int radius = 80;

 

       int SquareOfR = radius*radius;

 

              

 

    for( y = 0 ; y

 

    {

 

           for( x = 0 ; x <  LCD_HEIGHT ; x++ )

 

           {

 

                  if(y<=120 && x<=160)

 

                  {

 

                         tempY=120-y;

 

                         tempX=160-x;                        

 

                  }

 

                     else if(y<=120&& x>=160)

 

                     {

 

                            tempY=120-y;

 

                         tempX=x-160;                        

 

                     }

 

                     else if(y>=120&& x<=160)

 

                     {

 

                            tempY=y-120;

 

                         tempX=160-x;                        

 

                     }

 

                     else

 

                     {

 

                            tempY = y-120;

 

                            tempX = x-160;

 

                     }

 

                    

 

                     if ((tempY*tempY+tempX*tempX)<=SquareOfR)

 

                                LCD_BUFFER[y][x] = c ;

 

           }

 

    }

 

}

 

//绘制屏幕背景颜色,颜色为c

 

void Brush_Background( U32 c)

 

{

 

       int x,y ;

 

             

 

    for( y = 0 ; y < SCR_YSIZE; y++ )

 

    {

 

           for( x = 0 ; x < SCR_YSIZE; x++ )

 

           {

 

                     LCD_BUFFER[y][x] = c ;

 

           }

 

    }

 

}

 

void Main(void)//主函数

{ 

          Lcd_init();

         

          while(1)

          {

      

                     Brush_Background(0x00ff00);

                     delay(5000);

                    

                     Draw_Circular(0x000000);

                     delay(5000);

                    

                     Brush_Background(0xff0000);

                     delay(5000);

                    

                     Draw_Circular(0x0000ff);

                     delay(5000);

                    

                     Brush_Background(0x0000ff);

                     delay(5000);

                    

                     Draw_Circular(0x000000);

                     delay(5000);

                    

                     Brush_Background(0xffffff);

                     delay(5000);

                    

                     Draw_Circular(0xff0000);

                     delay(5000);

        }

}

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

iuyinxiao2016-10-06 21:17:56

请问rLCDCON2 和rLCDCON3中的那些参数怎么设?比如LCD_UPPER_MARGIN,我在统宝3.5寸屏的手册中时序里也找不到这些参数啊?谢谢!