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); //设置GPG4为LCD_PWREN
rGPGDAT = rGPGDAT | (1<<4) ; //GPG4置1
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);
}
}