lcd驱动几天前就是这个样子了,这两天又忙着写论文,怎么就不行呢,不管了,发上来给大家看看,知道的兄弟请指点一下。lcd是支持18位(TFT),程序设置了16位,屏幕大小800*480,如需lcd 的datasheet请联系我。运行能看到图片(有时需注释掉,有时又不需,不知道为什么),但颜色不对,好象只有两种颜色。
2006-5-30
经过一笑兄的提醒,已经修改了部分代码,现在有时能看到正确的图像了,颜色也是对的,但还有个问题依然存在,就是经常屏幕没有任何显示,这时老是需要不注释掉和注释掉rLCDCON5 = (1<<11)|(1<<9)|(1<<8)|(1<<3)|(1<<0)都编译一遍才可以看到图像,还有IO口和上拉使能该怎么配置呢?现在是 rGPCCON = 0xaaaaaaaa; rGPDCON = 0xaaaaaaaa; 没有对上拉使能进行操作,一操作就又看不到图像了。还有刷新算法的问题,我也不太明白。
2006-6-1

#include "2410addr.h"
#include "Def.h"
#include "stdio.h"
#include "stdlib.h"
extern unsigned char gImage_123[];
unsigned int (*frameBuffer16)[800/2];
extern char Image$$RW$$Limit[];
void *mallocPt=Image$$RW$$Limit;
#define M5D(n) ((n) & 0x1fffff)
void * malloc(unsigned nbyte)
{
    void *returnPt=mallocPt;
    mallocPt= (int *)mallocPt+nbyte/4+((nbyte%4)>0); //to align 4byte
    if( (int)mallocPt > HEAPEND )
    {
         mallocPt=returnPt;
         return NULL;
    }
    return returnPt;
}
int Lcd_Init()
{if((U32)frameBuffer16==0)
 {
     frameBuffer16=(unsigned int (*)[800/2])malloc(800*480*2);
 }
 //rLCDCON1 = (rLCDCON1 & 0xffc0000) | (1<<8)|(3<<5)|(0xc<<1);
 rLCDCON1 = (1<<8)|(1<<7)|(3<<5)|(12<<1)|0; 
  rLCDCON2 = (32<<24)|(479<<14)|(11<<6)|(2);
  rLCDCON3 = (88<<19)|(799<<8)|(40<<0);
 rLCDCON4 = (13<<8) | (128<<0);
 //rLCDCON5 = (1<<11)|(1<<9)|(1<<8)|(1<<3)|(1<<0);
 rLCDSADDR1= ( ((U32)frameBuffer16>>22)<<21 ) | M5D((U32)frameBuffer16>>1);
 rLCDSADDR2= M5D((((U32)frameBuffer16+(800*480*2))>>1));
 rLCDSADDR3= (800) | ( 0<<11 );
 rLPCSEL &= (~7);
 rTPAL = 0;
 rLCDCON1 |= 1;
  return 0;
}
void _PutPixelG16(U32 x,U32 y,U16 c)
{
    if(x<800 && y<480)
        frameBuffer16[(y)][(x)/2]=( frameBuffer16[(y)][x/2] & ~(0xfffc0000>>((x)%2)*16) )
            | ( (c)<<((1-((x)%2))*16) );
}
void Lcd_Bmp( U16 x0, U16 y0, U16 x1, U16 y1 , unsigned char bmp[] )
{
    int x, y ;
    int m = 0;
    U16 t;
    for( y = y0; y < y1; y++ )  //画16色图片
    {
     for( x = x0; x < x1; x++ )
     {
      t = (bmp[m]<<8) | bmp[m+1];
         _PutPixelG16( x, y, t);
         m+=2;
     }
    }
}
int Test_lcd()
{
 Lcd_Init();
 Lcd_Bmp( 0, 0, 320, 240 ,gImage_123);
 return 0;
}