|  | 
 
| 本帖最后由 zyp568 于 2012-7-22 09:46 编辑 
 实验板:TQ2440
 环境:ubuntu12.04 + arm-linux-gcc-3.4.5-glibc-2.3.6
 我的板子上配的LCD,根据数据手册上是24bpp,从原理图上看,VD[23:0]对应的都接至了2440的VD引脚上。
 写了一段代码,想要用单一颜色填充全屏,结果发现,只能显示出绿色,刚复位那一下,绿色较亮,接着就变得很暗,而且屏幕还抖动。代码贴在下面了,请各位帮忙看看是咋回事吧。
 
 复制代码//初始化部分
#define TFT_X_SIZE (480)
#define TFT_Y_SIZE (272)
 
extern volatile unsigned int TFTBuffer[TFT_X_SIZE][TFT_Y_SIZE]; 
#define CLKVAL (5)
#define MMODE  (0)
#define PNRMODE (3)
#define BPPMODE (13)
#define ENVID (0)
#define VBPD  (1)
#define LINEVAL ( TFT_Y_SIZE - 1 )
#define VFPD (1)
#define VSPW (9)
#define HBPD (1)
#define HOZVAL ( TFT_X_SIZE - 1 )
#define HFPD (1)
#define MVAL (13)    //?
#define HSPW (40)
#define BPP24BL  (0)
#define FRM565  (1)
#define INVVCLK  (0)
#define INVVLINE (1)
#define INVVFRAME (1)
#define INVVD  (0)
#define INVPWREN (0)
#define INVLEND  (0)
#define PWREN  (1)
#define ENLEND  (0)
#define BSWP  (0)
#define HWSWP  (0)
#define LCDBANK  ( (unsigned long)TFTBuffer>>22 ) 
#define LCDBASEU ( ((unsigned long)TFTBuffer>>1)&0x1FFFFF )
#define LCDBASEL ( (((unsigned long)TFTBuffer + (TFT_X_SIZE*TFT_Y_SIZE*4))>>1)&0x1FFFFF )
#define OFFSIZE  (0)
#define PAGEWIDTH (TFT_X_SIZE*2)
 
#define LCDCON1_VAL ( CLKVAL<<8 | MMODE<<7 | PNRMODE<<5 | BPPMODE<<1 | ENVID )
#define LCDCON2_VAL ( VBPD<<24 | LINEVAL<<14 | VFPD<<6 | VSPW )
#define LCDCON3_VAL ( HBPD<<19 | HOZVAL<<8 | HFPD )
#define LCDCON4_VAL ( MVAL<<8 | HSPW )
#define LCDCON5_VAL ( BPP24BL<<12 | FRM565<<11 | INVVCLK<<10 | \
       INVVLINE<<9 | INVVFRAME<<8 | INVVD<<7 | INVVD<<6 | \
       INVPWREN<<5 | INVLEND<<4 | PWREN<<3 | ENLEND<<2 | \
       BSWP<<1 | HWSWP )
#define LCDSADDR1_VAL ( LCDBANK<<21 | LCDBASEU )
#define LCDSADDR2_VAL ( LCDBASEL )
#define LCDSADDR3_VAL ( OFFSIZE<<11 | PAGEWIDTH ) 
#define GPDCON_Val  0xAAAAAAAA        //IO口是在一个IO初始化函数中统一初始化的。
#define GPDDAT_Val  0xFFFF            //试过使能上拉,现象一样
#define GPCCON_Val  0xAAAAAAAA
#define GPCDAT_Val   0xFF00
void InitTFT( void )
{
    LCDCON1 = LCDCON1_VAL;
    LCDCON2 = LCDCON2_VAL;
    LCDCON3 = LCDCON3_VAL;
    LCDCON4 = LCDCON4_VAL;
    LCDCON5 = LCDCON5_VAL;
    LCDSADDR1 = LCDSADDR1_VAL;
    LCDSADDR2 = LCDSADDR2_VAL;
    LCDSADDR3 = LCDSADDR3_VAL;
    LCDINTMSK |= 0x3;   //屏蔽LCD中断
    LPCSEL = 0;         //禁止LPC3600/LCC3600模式
    TPAL = 0;           //禁止临时调色板
}
复制代码//功能函数
volatile unsigned int TFTBuffer[TFT_X_SIZE][TFT_Y_SIZE]; 
//开启或关闭TFTLCD控制器
void TFT_EnOrDis( unsigned int iState )
{
    if( iState == 0 )
        LCDCON1 &= ~1;
    else 
        LCDCON1 |= 1;
}
//在指定坐标特定颜色的点描点
int TFT_DrawPoint( unsigned int x, unsigned int y, unsigned int iColour )
{
    if( x>HOZVAL || y>LINEVAL ) return FAIL;    TFTBuffer[x][y] = iColour;
    return SUCCESS;
}
复制代码//在main()中调用功能函数填充全屏
TFT_EnOrDis(1);
iColour = TFT_RED;
for( x = 0 ; x < 480 ; x++ )
    for( y = 0 ; y < 272 ; y++ )
        TFT_DrawPoint( x, y, iColour );
 | 
 |