主题 : 万恶的lcd。。。 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 63269
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
综合积分: 76 分
注册时间: 2012-02-16
最后登录: 2013-04-17
楼主  发表于: 2012-02-26 20:38

 万恶的lcd。。。

纠结。。。最近在看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里面的。。。。。
版主以及高手出手啊。。。