纠结。。。最近在看LCD。我的mini2440带的是W35的屏。。。出现几个问题,总结如下:
1:宏定义为320x240分辨下(CLKVAL=2OR3OR1),能清屏(用颜色),当CLKVAL为4以上,开始闪烁;
2:也是320x240,想显示sunflower_320x240这张图片,CLKVAL取以上值都是闪烁;
3:当调成240x240,CLKVAL=4,可以显示带颜色的清屏加图片。。。。。。
2440test怎么能显示320x240的sunfolwer_320x240??
版主以及各位高手这次一定要伸出你们的手啊,知道你们时间很忙,但你们的一点点指点可以让我们更加热爱这个过程,谢谢!!
以下是代码:
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
//================================
#define uartPCLK 50000000
#define uart_rate 115200
#define ADCFEQ 2500000
#define M5D(n) ((n)&0x1fffff)
#define LCD_ADDR ((U32)LCD_BUFFER)
#define uart_brd ((int)(uartPCLK/(uart_rate*16))-1)
//=========LCD SIZE====//
#define LCD_PIXCLOCK 4
#define LCD_WIDTH 240
#define LCD_HEIGHT 240
#define LCD_RIGHT_MARGIN 0x44
#define LCD_LEFT_MARGIN 0x04
#define LCD_HSYNC_LEN 0x01
#define LCD_UPPER_MARGIN 10
#define LCD_LOWER_MARGIN 4
#define LCD_VSYNC_LEN 1
#define SCR_XSIZE LCD_WIDTH
#define SCR_YSIZE LCD_HEIGHT
#define LCD_CON5 ((1<<11) | (1<<8) | (1<<9) | (1<<0) )
/*BMP C file converted from BMP file*/
extern const unsigned char sunflower_320x240[];
/*end of the file*/
static void __irq AdcTsAuto(void);
volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE]; //定义320行,240列的数组,用于存放显示数据
void dely(U32 tt)
{
U32 i;
for(;tt>0;tt--)
{
for(i=0;i<10000;i++){}
}
}
void init_uart()
{
rGPHCON = rGPHCON & (~(0xffff)) ;
rGPHCON = rGPHCON | (0xaaa0) ;
rGPHUP = 0x0; // 使用内部上拉电阻。
rUFCON0=0x00; //不使用FIFO
rUMCON0=0x00; //不使用自动流控制
rULCON0=0x03; //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
rUCON0=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止 //信号,传输模式为中断请求模式,接收模式也为中断请求模式。
rUBRDIV0=uart_brd;
}
void putc(char c)
{
if(c=='\n')
{
while(!(rUTRSTAT0&0x2));
// dely(10);
rUTXH0='\r';
}
while(!(rUTRSTAT0&0x02));
dely(10);
rUTXH0 = c;
//rUTXH0(c);
}
void puts (char *s)
{
while(*s)
{
putc(*s++);
}
}
unsigned char getc()
{
while(!(rUTRSTAT0&0X01));
return rURXH0;
}
unsigned char gets(char *str)
{
char c;
char *s2=str;
while((c=getc())!='\r')
{
putc(c);
*s2++=c+1;
}
putc('\n');
}
void testts()
{
int prepare;
prepare=50000000/ADCFEQ-1;
rADCCON=(1<<14)|(prepare<<6);
// puts("the ADC convert feq:")
rADCTSC = 0xd3;
rSRCPND = 0x80000000;
rINTPND = 0x80000000;
// pISR_ADC = (U32)AdcTsAuto;
//
rSUBSRCPND =(1<<9);
rINTMSK = 0x7fffffff;
rINTSUBMSK&=~(1<<9);
}
/*void Uart_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
puts(string);
va_end(ap);
}*/
void lcdport_init()
{
rGPCUP=0XFFFFFFFF;
rGPCCON=0xaaaa02a8;
rGPDUP=0xffffffff;
rGPDCON=0xaaaaaaaa;
rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0);
/*bit[20:0]:LCDBASEL*/
rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);
}
void lcd_init()
{
/*bit[17:8](4:CLKVAL);bit[6:5](11:TFT LCD panel);bit[4:1](1100:16 bpp for TFT)*/
rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1);
/*bit[31:24](1:VBPD);bit[23:14](320-1:行数);bit[13:6](5:VFPD);bit[5:0](1:VSPW)*/
rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (1<< 6) | (LCD_VSYNC_LEN << 0);
/*bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)*/
rLCDCON3 = (2 << 19) | ((LCD_WIDTH - 1) << 8) | (2 << 0);
/*bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)*/
rLCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0);
rLCDCON5 = (1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0);
//=====off the interrupt===//
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);
rTCONSEL &= (~7);
rTPAL = 0x0;
rTCONSEL &= ~((1<<4) | 1);
}
void lcd_onoff(int onoff)
{
if(onoff==1)
rLCDCON1|=1;
else
rLCDCON1&=0x3fffe;
}
void clearsrc(U16 c)
{
unsigned int x,y;
for(y=0;y<SCR_YSIZE;y++)
{
for(x=0;x<SCR_XSIZE;x++)
LCD_BUFFER[y][x]=c;
}
}
static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char bmp[])
{
int x,y;
U32 c;
int p = 0;
for( y = 0 ; y < l ; y++ )
{
for( x = 0 ; x < h ; x++ )
{
c = bmp[p+1] | (bmp[p]<<8) ;
if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )
LCD_BUFFER[y0+y][x0+x] = c ;
p = p + 2 ;
}
}
}
void testlcd()
{
lcdport_init();
lcd_init();
lcd_onoff(1);
puts("clear the screen with black\n");
dely(10);
clearsrc((0x00<<11) | (0x00<<5) | (0x00));
dely(111);
clearsrc((0x1f<<11) | (0x00<<5) | (0x00));
puts("red \n");
dely(11111);
clearsrc((0x00<<11)|(0x3f<<5)|(0x00));
puts("green\n");
dely(11111);
clearsrc((0x00<<11)|(0x00<<5)|(0x1f));
puts("blue\n");
dely(11111);
Pait_Bmp(0,0,320,240,sunflower_320x240);
dely(11111);
}
int Main(int argc, char **argv)
{
int i;
U8 key;
U32 mpll_val=0;
int data;
unsigned char c;
mpll_val = (92<<12)|(1<<4)|(1);
ChangeMPllValue(127,2,1); //405MHZ
rCLKDIVN = 0x05;// 1:4:8 PCLK=50MHZ;
MMU_DisableICache();
MMU_DisableDCache();
rGPBCON = 0x155555;
puts("now is the lcd test");
init_uart();
MMU_Init();
testlcd();
}
sunflower_320x240的文件是复制test里面的。。。。。
版主以及高手出手啊。。。