搜索
bottom↓
回复: 11

请教TFTLCD的问题

[复制链接]

出0入0汤圆

发表于 2012-7-22 09:44:01 | 显示全部楼层 |阅读模式
本帖最后由 zyp000 于 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引脚上。
按照24bpp写了一段代码,想要用单一颜色填充全屏,结果发现,只能显示出绿色,刚复位那一下,绿色较亮,接着就变得很暗,而且屏幕还抖动。代码贴在下面了,请各位帮忙看看是咋回事吧。
把代码改成16bpp模式,现象和24bpp差不多,只是显示的颜色不一样而已。
  1. //初始化部分
  2. #define TFT_X_SIZE (480)
  3. #define TFT_Y_SIZE (272)

  4. extern volatile unsigned int TFTBuffer[TFT_X_SIZE][TFT_Y_SIZE];

  5. #define CLKVAL (5)
  6. #define MMODE  (0)
  7. #define PNRMODE (3)
  8. #define BPPMODE (13)
  9. #define ENVID (0)
  10. #define VBPD  (1)
  11. #define LINEVAL ( TFT_Y_SIZE - 1 )
  12. #define VFPD (1)
  13. #define VSPW (9)
  14. #define HBPD (1)
  15. #define HOZVAL ( TFT_X_SIZE - 1 )
  16. #define HFPD (1)
  17. #define MVAL (13)    //?
  18. #define HSPW (40)
  19. #define BPP24BL  (0)
  20. #define FRM565  (1)
  21. #define INVVCLK  (0)
  22. #define INVVLINE (1)
  23. #define INVVFRAME (1)
  24. #define INVVD  (0)
  25. #define INVPWREN (0)
  26. #define INVLEND  (0)
  27. #define PWREN  (1)
  28. #define ENLEND  (0)
  29. #define BSWP  (0)
  30. #define HWSWP  (0)
  31. #define LCDBANK  ( (unsigned long)TFTBuffer>>22 )
  32. #define LCDBASEU ( ((unsigned long)TFTBuffer>>1)&0x1FFFFF )
  33. #define LCDBASEL ( (((unsigned long)TFTBuffer + (TFT_X_SIZE*TFT_Y_SIZE*4))>>1)&0x1FFFFF )

  34. #define OFFSIZE  (0)
  35. #define PAGEWIDTH (TFT_X_SIZE*2)

  36. #define LCDCON1_VAL ( CLKVAL<<8 | MMODE<<7 | PNRMODE<<5 | BPPMODE<<1 | ENVID )
  37. #define LCDCON2_VAL ( VBPD<<24 | LINEVAL<<14 | VFPD<<6 | VSPW )
  38. #define LCDCON3_VAL ( HBPD<<19 | HOZVAL<<8 | HFPD )
  39. #define LCDCON4_VAL ( MVAL<<8 | HSPW )
  40. #define LCDCON5_VAL ( BPP24BL<<12 | FRM565<<11 | INVVCLK<<10 | \
  41.        INVVLINE<<9 | INVVFRAME<<8 | INVVD<<7 | INVVD<<6 | \
  42.        INVPWREN<<5 | INVLEND<<4 | PWREN<<3 | ENLEND<<2 | \
  43.        BSWP<<1 | HWSWP )
  44. #define LCDSADDR1_VAL ( LCDBANK<<21 | LCDBASEU )
  45. #define LCDSADDR2_VAL ( LCDBASEL )
  46. #define LCDSADDR3_VAL ( OFFSIZE<<11 | PAGEWIDTH )

  47. #define GPDCON_Val  0xAAAAAAAA   //IO口是在一个IO初始化函数中统一初始化的。
  48. #define GPDDAT_Val  0xFFFF            //试过使能上拉,现象一样
  49. #define GPCCON_Val  0xAAAAAAAA
  50. #define GPCDAT_Val   0xFF00

  51. void InitTFT( void )
  52. {
  53.     LCDCON1 = LCDCON1_VAL;
  54.     LCDCON2 = LCDCON2_VAL;
  55.     LCDCON3 = LCDCON3_VAL;
  56.     LCDCON4 = LCDCON4_VAL;
  57.     LCDCON5 = LCDCON5_VAL;

  58.     LCDSADDR1 = LCDSADDR1_VAL;
  59.     LCDSADDR2 = LCDSADDR2_VAL;
  60.     LCDSADDR3 = LCDSADDR3_VAL;

  61.     LCDINTMSK |= 0x3;   //屏蔽LCD中断
  62.     LPCSEL = 0;         //禁止LPC3600/LCC3600模式
  63.     TPAL = 0;           //禁止临时调色板
  64. }
复制代码
  1. //功能函数

  2. volatile unsigned int TFTBuffer[TFT_X_SIZE][TFT_Y_SIZE];

  3. //开启或关闭TFTLCD控制器
  4. void TFT_EnOrDis( unsigned int iState )
  5. {
  6.     if( iState == 0 )
  7.         LCDCON1 &= ~1;
  8.     else
  9.         LCDCON1 |= 1;
  10. }

  11. //在指定坐标特定颜色的点描点
  12. int TFT_DrawPoint( unsigned int x, unsigned int y, unsigned int iColour )
  13. {
  14.     if( x>HOZVAL || y>LINEVAL ) return FAIL;   
  15.    
  16.     TFTBuffer[x][y] = iColour;
  17.     return SUCCESS;
  18. }
复制代码
  1. //在main()中调用功能函数填充全屏

  2. TFT_EnOrDis(1);
  3. iColour = TFT_RED;

  4. for( x = 0 ; x < 480 ; x++ )
  5.     for( y = 0 ; y < 272 ; y++ )
  6.         TFT_DrawPoint( x, y, iColour );
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-7-22 09:48:24 | 显示全部楼层
你是不是自己在写驱动啊?为何不直接使用官方的驱动呢?难道他们的驱动不符合你的要求?

出0入0汤圆

 楼主| 发表于 2012-7-22 10:06:12 | 显示全部楼层
gracialee 发表于 2012-7-22 09:48
你是不是自己在写驱动啊?为何不直接使用官方的驱动呢?难道他们的驱动不符合你的要求? ...

额,我是初学者,所以想自己写完成这些底层的代码,不求写成一个很正规的驱动,只是想摸清楚ARM和外围模块是怎么运作的。
再者,因为是自学,不知道系统的学习套路是什么,现在就是照着ARM920T+S3C2440的数据手册,一个一个的做硬件方面实验。
内核的书一直在看,想尽快摸熟S3C2440,好调调弄弄内核了。
求各位朋友花几分钟,帮忙给看看吧。

出0入0汤圆

发表于 2012-7-22 10:24:23 | 显示全部楼层
自己写是没错,但是学习的第一步并不是自己写,而是先看下成功的代码,把别人的底层驱动读懂就行了,读的多了,自然就会写了。

出0入4汤圆

发表于 2012-7-22 10:27:14 | 显示全部楼层

void TFT_EnOrDis( unsigned int iState )
{
    if( iState == 0 )
        LCDCON1 &= ~1;
    else
        LCDCON1 |= 1;
}
中,  将  LCDCON1 &= ~1;  改成 LCDCON1 &= 0x3fffe; 试试。

出0入0汤圆

 楼主| 发表于 2012-7-22 11:16:19 | 显示全部楼层
mcu1815 发表于 2012-7-22 10:24
自己写是没错,但是学习的第一步并不是自己写,而是先看下成功的代码,把别人的底层驱动读懂就行了,读的多 ...

额,看过一些代码后才写的,主要是参照TQ2440_Test的程序写的代码,TQ2440_Test里,用的是16bpp模式,24bpp/16bpp模式我都尝试过,出了显示的颜色不一样,其他的反应都是一样的。应该是哪里没初始化对吧?
我的代码中FCLK/HCLK/PCLK分别是300MHz/100MHz/50MHz。根据设置,LCD_CLK差不多是9MHz,数据手册上的典型值就是这个数值了。

出0入0汤圆

 楼主| 发表于 2012-7-22 11:16:51 | 显示全部楼层
sunliezhi 发表于 2012-7-22 10:27

void TFT_EnOrDis( unsigned int iState )
{

额,刚试了下,不是这个问题哦。

出0入4汤圆

发表于 2012-7-22 11:24:48 | 显示全部楼层
TFTLCD接的口线初始化正确吗?
我的是这样的:
static void s3c_init_lcdport (void)
{
        rGPCUP = 0;
        rGPCCON = 0xaaaa56a9;
        rGPDUP = 0;
        rGPDCON = 0xaaaaaaaa;
}

出0入4汤圆

发表于 2012-7-22 11:25:45 | 显示全部楼层
本帖最后由 sunliezhi 于 2012-7-22 11:28 编辑
zyp000 发表于 2012-7-22 11:16
额,刚试了下,不是这个问题哦。


TFTLCD接的口线初始化正确吗?
我的是这样的:
static void s3c_init_lcdport (void)
{
        rGPCUP = 0;
        rGPCCON = 0xaaaa56a9;
        rGPDUP = 0;
        rGPDCON = 0xaaaaaaaa;
}
GPxDAT不用设置,主要是GPxCON和GPxUP

出0入0汤圆

 楼主| 发表于 2012-7-22 12:39:02 | 显示全部楼层
sunliezhi 发表于 2012-7-22 11:25
TFTLCD接的口线初始化正确吗?
我的是这样的:
static void s3c_init_lcdport (void)

额,DAT那个,是我发帖时打字打错了,应该是UP的。
上拉我试过,开启或关闭,现象基本一样的。
GPDCON = 0xAAAAAAAA这个也没什么问题,所有GPD的IO都设置为VD。
GPCCON 这个的值,我试过0xAAAAAAAA,0xAAAA02A8。
您设置的0xAAAA56A9跟我的0xAAAA02A8应该是一样的吧?我把无用端口保持为输入,您的是设置为输出了。
如果方便的话,可以把您的TFT驱动发给我参考一下么?
我自己的测试工程如下,您要有空麻烦帮看看呗。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2012-7-22 17:26:32 | 显示全部楼层
zyp000 发表于 2012-7-22 12:39
额,DAT那个,是我发帖时打字打错了,应该是UP的。
上拉我试过,开启或关闭,现象基本一样的。
GPDCON =  ...

当然,不知道能不能入得了您的法眼
lcd480x272.c

#include "lcd480x272.h"
#include "s3c24x0.h"
#include "font.h"
#include "hzk.h"
#include "globl_def.h"


static unsigned short LCD_BUFF[LCD_480X272_YSIZE][LCD_480X272_XSIZE];

//#define LCD_BUFF ((unsigned long *)0x30008000)


extern char hzk16x16tab[];

static void s3c_init_lcdport (void)
{
        rGPCUP = 0;
        rGPCCON = 0xaaaa56a9;
        rGPDUP = 0;
        rGPDCON = 0xaaaaaaaa;
}



static void s3c_init_lcdreg (void)
{
        rLCDCON1 = (CLKVAL_480X272 << 8) | (0<<7) | (TFT << 5) | (MODE16BPP << 1) | 0;
        rLCDCON2 = (VBPD_480X272 << 24) | (LINEVAL_480X272 << 14) | (VFPD_480X272 << 6) | (VSPW_480X272);
        rLCDCON3 = (HBPD_480X272 << 19) | (HOZVAL_480X272 << 8) | (HFPD_480X272);
        rLCDCON4 = (MVAL_480X272 << 8) | (HSPW_480X272);
        rLCDCON5 = (RGB565 << 11) /*| (1<<10)*/ | (INVVLINE << 9) | (FRAME << 8) | (0<<6) | (PWREN << 3) | (0<<1) | (HWSWP_480X272);
        rLCDSADDR1 = (((U32)LCD_BUFF>>22) << 21) | M5D (  (U32)LCD_BUFF >> 1);
        rLCDSADDR2 = M5D( ( (U32)LCD_BUFF + (LCD_480X272_XSIZE*LCD_480X272_YSIZE*2) ) >> 1);
        rLCDSADDR3 = (( (LCD_480X272_XSIZE - LCD_480X272_XSIZE)/1 ) << 11) | (LCD_480X272_XSIZE/1);
        rLCDINTMSK |= 3;
        rTPAL = 0;
}



void put_pixel (U32 x, U32 y, U16 c)
{
        if ((x < LCD_480X272_XSIZE) && (y < LCD_480X272_YSIZE))
                LCD_BUFF[y][x] = c;
                //*((U16 *)LCD_BUFF + y*LCD_480X272_XSIZE+x) = c;
}



static void put_ascii (U32 x, U32 y, U16 c, char *dat)
{
        U8 i, j, temp;
        U8 *idx;

        idx = &ascii8x16_tab[dat[0]-0x20] [0];

        for (i=0; i<16; i++)
        {
                temp = *idx++;

                for (j=0; j<8; j++)
                {
                        if (temp & 0x80)
                                put_pixel (x+j, y+i, c);
                        else
                                put_pixel (x+j, y+i, 0xffff);  // white background
                        temp <<= 1;
                }
        }
}




static void put_hz (U32 x, U32 y, U32 c, char *dat)
{
        U16 i, j, tmp;
        U32 idx;

        i = dat[0] - 0xa0;
        j = dat[1] - 0xa0;
        idx = (94*(i-1)+(j-1))*32;                        // get neima of the hz

        for (i=0; i<16; i++)
        {
                tmp = hzk16x16tab[idx+2*i];
                tmp *= 0x100;
                tmp |= hzk16x16tab[idx+2*i+1];
                for (j=0; j<16; j++)
                {
                        if (tmp & 0x8000)
                                put_pixel (x+j, y+i, c);
                        else
                                put_pixel (x+j, y+i, 0);
                        tmp <= 1;
                }
        }
}




void put_asciistr_to_lcd (U32 x, U32 y, U16 c, char *str)  // *str 为字符串
{
        U8 i=0;

        while (str != 0x00)
        {
                put_ascii (x, y, c, &str);
                i += 1;
                x += 8;

                if (x >= LCD_480X272_XSIZE)
                {
                        x = 0;
                        y += 16;
                }
        }
}




void put_hzstr_to_lcd (U32 x, U32 y, U32 c, char *str)
{
        U8 i=0;

        while (str != 0x00)
        {
                put_hz (x, y, c, &str);
                i += 2;
                x += 16;

                if (x >= LCD_480X272_XSIZE)
                {
                        x = 0;
                        y += 16;
                }
        }
}


void lcd_clr (U16 c)
{
        volatile U32 x,y;
        for (y=0; y<LCD_480X272_YSIZE; y++)
        {
                for (x=0; x<LCD_480X272_XSIZE; x++)
                {
                        LCD_BUFF[y][x] = c;
                }
                        //*((U16 *)LCD_BUFF + y*LCD_480X272_XSIZE+x) = c;
        }
}



static void lcd_envid_onoff (int onoff)
{
        if (onoff == 1)
                rLCDCON1 |= 1;
        else
                rLCDCON1 &= 0x3fffe;
}



void s3c_init_lcd (void)
{
        s3c_init_lcdport();
        s3c_init_lcdreg();
        lcd_envid_onoff(1);
}


/*
U16 RGB565_Alpha(U16 FrColor,U16 BkColor ,U8 Alpha)
{

        int        R,G,B,R0,G0,B0,R1,G1,B1;
        U32        Alpha0,Alpha1;
        ////
        R0        =(FrColor>>11)&0x1f;
        G0        =(FrColor>>5)&0x3f;
        B0        =(FrColor&0x1f);
        R1        =(BkColor>>11)&0x1f;
        G1        =(BkColor>>5)&0x3f;
        B1        =(BkColor&0x1f);
        Alpha0   =256-Alpha;
        Alpha1   =Alpha;
        R        =(R0*Alpha0+R1*Alpha1)>>8;               
        G        =(G0*Alpha0+G1*Alpha1)>>8;               
        B        =(B0*Alpha0+B1*Alpha1)>>8;               

        return  rgb565(R,G,B);
}
*/


static void Glib_Line(int x1,int y1,int x2,int y2, U16 color)
{
        int dx,dy,e;
        dx=x2-x1;
        dy=y2-y1;
   
        if(dx>=0)
        {
                if(dy >= 0) // dy>=0
                {
                        if(dx>=dy) // 1/8 octant
                        {
                                e=dy-dx/2;
                                while(x1<=x2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){y1+=1;e-=dx;}       
                                        x1+=1;
                                        e+=dy;
                                }
                        }
                        else                // 2/8 octant
                        {
                                e=dx-dy/2;
                                while(y1<=y2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){x1+=1;e-=dy;}       
                                        y1+=1;
                                        e+=dx;
                                }
                        }
                }
                else                   // dy<0
                {
                        dy=-dy;   // dy=abs(dy)

                        if(dx>=dy) // 8/8 octant
                        {
                                e=dy-dx/2;
                                while(x1<=x2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){y1-=1;e-=dx;}       
                                        x1+=1;
                                        e+=dy;
                                }
                        }
                        else                // 7/8 octant
                        {
                                e=dx-dy/2;
                                while(y1>=y2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){x1+=1;e-=dy;}       
                                        y1-=1;
                                        e+=dx;
                                }
                        }
                }       
        }
        else //dx<0
        {
                dx=-dx;                //dx=abs(dx)
                if(dy >= 0) // dy>=0
                {
                        if(dx>=dy) // 4/8 octant
                        {
                                e=dy-dx/2;
                                while(x1>=x2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){y1+=1;e-=dx;}       
                                        x1-=1;
                                        e+=dy;
                                }
                        }
                        else                // 3/8 octant
                        {
                                e=dx-dy/2;
                                while(y1<=y2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){x1-=1;e-=dy;}       
                                        y1+=1;
                                        e+=dx;
                                }
                        }
                }
                else                   // dy<0
                {
                        dy=-dy;   // dy=abs(dy)

                        if(dx>=dy) // 5/8 octant
                        {
                                e=dy-dx/2;
                                while(x1>=x2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){y1-=1;e-=dx;}       
                                        x1-=1;
                                        e+=dy;
                                }
                        }
                        else                // 6/8 octant
                        {
                                e=dx-dy/2;
                                while(y1>=y2)
                                {
                                        put_pixel(x1,y1,color);
                                        if(e>0){x1-=1;e-=dy;}       
                                        y1-=1;
                                        e+=dx;
                                }
                        }
                }       
        }
}


/**************************************************************
在LCD屏幕上画一个矩形
**************************************************************/
void Glib_Rectangle(int x1,int y1,int x2,int y2, U16 color)
{
    Glib_Line(x1,y1,x2,y1,color);
    Glib_Line(x2,y1,x2,y2,color);
    Glib_Line(x1,y2,x2,y2,color);
    Glib_Line(x1,y1,x1,y2,color);
}

/**************************************************************
在LCD屏幕上用颜色填充一个矩形
**************************************************************/
void Glib_FillRectangle(int x1,int y1,int x2,int y2, U16 color)
{
    int i;

    for(i=y1;i<=y2;i++)
        Glib_Line(x1,i,x2,i,color);
}





#if 0
/**************************************************************
在LCD屏幕上指定坐标点画一个指定大小的图片
**************************************************************/
static void Paint_Bmp(int x0,int y0,int h,int l,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 TFT_LCD_Init(void)
{

    LCD_Init();
        LcdBkLtSet( 70 ) ;
        Lcd_PowerEnable(0, 1);
    Lcd_EnvidOnOff(1);                //turn on vedio

    Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );  

#if LCD_TYPE==LCD_TYPE_N35
        Paint_Bmp(0, 0, 240, 320, sunflower_240x320);
#elif LCD_TYPE==LCD_TYPE_A70
        Paint_Bmp(0, 0, 800, 480, sunflower_800x480);
#elif LCD_TYPE==LCD_TYPE_VGA1024x768
    Paint_Bmp(0, 0, 1024, 768, sunflower_1024x768);
#endif   
}

/**************************************************************
**************************************************************/
void TFT_LCD_Test(void)
{
#if LCD_TYPE==LCD_TYPE_N35
        Uart_Printf("\nTest TFT LCD 240x320!\n");
#elif LCD_TYPE==LCD_TYPE_A70
        Uart_Printf("\nTest TFT LCD 800×480!\n");
#elif LCD_TYPE==LCD_TYPE_VGA1024x768
    Uart_Printf("\nTest VGA 1024x768!\n");
#endif   


    Lcd_Port_Init();
    LCD_Init();
    Lcd_EnvidOnOff(1);                //turn on vedio

        Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00)  )  ;                //clear screen
        Uart_Printf( "\nLCD clear screen is finished! press any key to continue!\n" );
    Uart_Getch() ;                //wait uart input

        Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f)  )  ;                //clear screen
        Uart_Printf( "LCD clear screen is finished! press any key to continue!\n" );
    Uart_Getch() ;                //wait uart input

        Lcd_ClearScr(0xffff);                //fill all screen with some color
        #define LCD_BLANK                30
        #define C_UP                ( LCD_XSIZE - LCD_BLANK*2 )
        #define C_RIGHT                ( LCD_XSIZE - LCD_BLANK*2 )
        #define V_BLACK                ( ( LCD_YSIZE - LCD_BLANK*4 ) / 6 )
        Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE - LCD_BLANK ), ( LCD_YSIZE - LCD_BLANK ),0x0000);                //fill a Rectangle with some color

        Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f);                //fill a Rectangle with some color
        Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0);                //fill a Rectangle with some color
        Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800);                //fill a Rectangle with some color
        Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0);                //fill a Rectangle with some color
        Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f);                //fill a Rectangle with some color
        Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff);                //fill a Rectangle with some color
           Uart_Printf( "LCD color test, please look! press any key to continue!\n" );
    Uart_Getch() ;                //wait uart input

#if LCD_TYPE==LCD_TYPE_N35
        Paint_Bmp(0, 0, 240, 320, sunflower_240x320);
#elif LCD_TYPE==LCD_TYPE_A70
        Paint_Bmp(0, 0, 800, 480, sunflower_800x480);
#elif LCD_TYPE==LCD_TYPE_VGA1024x768
    Paint_Bmp(0, 0, 1024, 768, sunflower_1024x768);
#endif   
           Uart_Printf( "LCD paint a bmp, please look! press any key to continue! \n" );
    Uart_Getch() ;                //wait uart input

    Lcd_EnvidOnOff(0);                //turn off vedio
}
//*************************************************************

#endif



lcd480x272.h

#ifndef _lcd_h_
#define _lcd_h_

#include "globl_def.h"

#define M5D(n)   (n & 0x1fffff)
#define LCD_480X272_XSIZE    (480)
#define LCD_480X272_YSIZE    (272)
#define HOZVAL_480X272       (LCD_480X272_XSIZE - 1)
#define LINEVAL_480X272      (LCD_480X272_YSIZE - 1)
#define CLKVAL_480X272       (3)
#define MVAL_480X272         (13)
#define HWSWP_480X272        (1)

#define VBPD_480X272         (1)    // 垂直同步信号的后肩
#define VFPD_480X272         (5)    // 垂直同步信号的前肩
#define VSPW_480X272         (9)    // 垂直同步信号的脉宽

#define HBPD_480X272         (1)    // 水平同步信号
#define HFPD_480X272         (1)
#define HSPW_480X272         (40)

#define TFT                  (3)
#define MODE16BPP            (12)
#define RGB565               (1)
#define INVVLINE             (1)
#define FRAME                (1)
#define PWREN                (1)



#define rgb565(r,g,b)   (((r>>3)<<11)|((g>>2)<<5)|(b>>3))

void lcd_clr (U16 c);
void put_pixel (U32 x, U32 y, U16 c);
void put_asciistr_to_lcd (U32 x, U32 y, U16 c, char *str);
void put_hzstr_to_lcd(U32 x, U32 y, U32 c, char *str);
void Glib_Rectangle(int x1,int y1,int x2, int y2, U16 color);
void Glib_FillRectangle(int x1, int y1, int x2, int y2, U16 color);


#endif

出0入0汤圆

 楼主| 发表于 2012-8-4 13:55:54 | 显示全部楼层
sunliezhi 发表于 2012-7-22 17:26
当然,不知道能不能入得了您的法眼
lcd480x272.c

朋友,谢谢哦。
问题找到了,但是还没解决。
我写的驱动没问题,但是使用了MMU以后,显示就不正常了。地址映射都检查过了,也查不出什么问题。纠结啊。呵呵。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 10:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表