百问网

首页 » Linux技术区 » Linux系统开发 » LCD 裸奔程序显示不完全,求高手指点
laoshizhuce - 2010-4-26 14:28:00
自己仿东山大哥的LCD程序,做了一个LCD显示图片的程序
主要显示程序如下
void Test_Lcd_Tft_16Bit_240320(void)
{
    printf("[TFT 64K COLOR(16bpp) LCD TEST]\n");
    Paint_Bmp(flower);
    getc();
    Paint_Bmp(Bliss);
    getc();
    Paint_Bmp(paint);
    getc();
}
其他初始化之类在别的文件
我的问题是程序启动后,第一幅图片没有显示,LCD为白色,第二幅图片只有一部分显示,LCD下边为白色,第三幅图片显示完全
之后我把第一个Paint_Bmp的图片换成第三幅,结果程序显示为第一三幅图片显示完全正确,第二幅症状和上次一样
三幅图片的数据放在同一个.h文件中,顺序如下
unsigned char flower[] = {...};
unsigned char Bliss[]  = {...};
unsigned char paint[]  = {...};
这三个图片的数据本身没有问题,另外我通过反汇编发现三个图片数组在data段中存放位置与上面的定义顺序相反
请问高手这个现象具体症状在哪,在下不甚感激
laoshizhuce - 2010-4-26 16:30:00
有人吗
laoshizhuce - 2010-4-28 10:13:00
thisway.diy在吗
laoshizhuce - 2010-4-29 19:25:00
这么久都没人回复我
laoshizhuce - 2010-5-1 9:20:00
有人吗
laoshizhuce - 2010-5-9 10:51:00
有人没有
laoshizhuce - 2010-5-12 14:46:00
自己顶下
thisway.diy - 2010-5-24 20:30:00
最好贴出你的所有代码
laoshizhuce - 2010-5-28 19:11:00
版主终于来了
我这就贴
laoshizhuce - 2010-5-28 19:13:00
main.c
#include <stdio.h>
#include "serial.h"
#include "lcdlib.h"
#include "s3c24xx.h"

int main()
{
    uart0_init();  // 波特率115200,8N1(8个数据位,无校验位,1个停止位)
    while (1)
    {
        printf("\r\n##### Test TFT LCD #####\r\n");
        Test_Lcd_Tft_16Bit_240320();
    }
   
    return 0;
}
laoshizhuce - 2010-5-28 19:14:00
Test_Lcd_Tft_16Bit_240320代码
#include <stdio.h>
#include "lcddrv.h"
#include "framebuffer.h"
#include "picture.h"

extern void Paint_Bmp(unsigned char bmp[]);

/* 以240x320,16bpp的显示模式测试TFT LCD */
void Test_Lcd_Tft_16Bit_240320(void)
{
    Lcd_Port_Init();                    // 设置LCD引脚
    Tft_Lcd_Init(MODE_TFT_16BIT_240320); // 初始化LCD控制器
    Lcd_PowerEnable(0, 1);              // 设置LCD_PWREN有效,它用于打开LCD的电源
    Lcd_EnvidOnOff(1);                  // 使能LCD控制器输出信号

    ClearScr(0x0);  // 清屏,黑色
    Paint_Bmp(flower1_320_240);
    printf("[TFT 64K COLOR(16bpp) LCD TEST]\n");

    printf("1. Press any key to draw line\n");
    getc();
    DrawLine(0  , 0  , 239, 0  , 0xff0000);    // 红色
    DrawLine(0  , 0  , 0  , 319, 0x00ff00);    // 绿色
    DrawLine(239, 0  , 239, 319, 0x0000ff);    // 蓝色
    DrawLine(0  , 319, 239, 319, 0xffffff);    // 白色
    DrawLine(0  , 0  , 239, 319, 0xffff00);    // 黄色
    DrawLine(239, 0  , 0  , 319, 0x8000ff);    // 紫色
    DrawLine(120, 0  , 120, 319, 0xe6e8fa);    // 银色
    DrawLine(0  , 160, 239, 160, 0xcd7f32);    // 金色

    printf("2. Press any key to draw circles\n");
    getc();
    Mire();
    printf("3. Press any key to fill the screem with one color\n");
    getc();
    ClearScr(0xff0000);            // 红色

    printf("4. Press any key to fill the screem by temporary palette\n");
    getc();
    ClearScrWithTmpPlt(0x0000ff);  // 蓝色
    printf("5. Press any key stop the testing\n");
    getc();
    Lcd_EnvidOnOff(0);
}
laoshizhuce - 2010-5-28 19:16:00
void Lcd_Port_Init(void)
{
    GPCUP  = 0x00000000;
    GPCCON = 0xaaaa02a9;
    GPDUP  = 0x00000000;
    GPDCON=0xaaaaaaaa; //Initialize VD[15:8]
    printf("Initializing GPIO ports..........\n");
}

/*初始化LCD控制器
*输入参数:type: 显示模式
*MODE_TFT_16BIT_240320 : 240*320 16bpp的TFT LCD */
void Tft_Lcd_Init(int type)
{
    switch(type)
    {
    case MODE_TFT_16BIT_240320:
        /*
        * 设置LCD控制器的控制寄存器LCDCON1~5
        * 1. LCDCON1:
        *    设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]
        *    选择LCD类型: TFT LCD 
        *    设置显示模式: 16BPP
        *    先禁止LCD信号输出
        * 2. LCDCON2/3/4:
        *    设置控制信号的时间参数
        *    设置分辨率,即行数及列数
        * 现在,可以根据公式计算出显示器的频率:
        * 当HCLK=100MHz时,
        * Frame Rate = 1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x
        *              {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x
        *              {2x(CLKVAL+1)/(HCLK)}]
        *            = 60Hz
        * 3. LCDCON5:
        *    设置显示模式为16BPP时的数据格式: 5:6:5
        *    设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转
        *    半字(2字节)交换使能
        */
        /*LCDCON1 = (CLKVAL_TFT_240320<<8) | (LCDTYPE_TFT<<5) | \
                  (BPPMODE_16BPP<<1) | (ENVID_DISABLE<<0);
        LCDCON2 = (VBPD_240320<<24) | (LINEVAL_TFT_240320<<14) | \
                  (VFPD_240320<<6) | (VSPW_240320);
        LCDCON3 = (HBPD_240320<<19) | (HOZVAL_TFT_240320<<8) | (HFPD_240320);
        LCDCON4 = HSPW_240320;
        LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \
                  (HWSWP<<1);*/
        LCDCON1=(6<<8)|(0<<7)|(3<<5)|(12<<1)|0;
         LCDCON2=(12<<24)|(239<<14)|(4<<6)|(5);
         LCDCON3=(22<<19)|(319<<8)|(33);
         LCDCON4=(13<<8)|(44);
         LCDCON5 =(1<<11)|(1<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(1<<3)|(0<<1)|(1);

        /*
        * 设置LCD控制器的地址寄存器LCDSADDR1~3
        * 帧内存与视口(view point)完全吻合,
        * 图像数据格式如下:
        *        |----PAGEWIDTH----|
        *    y/x  0  1  2      239
        *    0  rgb rgb rgb ... rgb
        *    1  rgb rgb rgb ... rgb
        * 1. LCDSADDR1:
        *    设置LCDBANK、LCDBASEU
        * 2. LCDSADDR2:
        *    设置LCDBASEL: 帧缓冲区的结束地址A[21:1]
        * 3. LCDSADDR3:
        *    OFFSIZE等于0,PAGEWIDTH等于(240*2/2)
        */
        LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21)|LOWER21BITS(LCDFRAMEBUFFER>>1);
        LCDSADDR2 = LOWER21BITS(((unsigned int)LCDFRAMEBUFFER+320*240*2)>>1);
        LCDSADDR3 = (0<<11)|(320/1);

        /* 禁止临时调色板寄存器 */
        TPAL = 0;

        fb_base_addr = LCDFRAMEBUFFER;
        bpp = 16;
        xsize = 320;
        ysize = 240;

        break;
    default:
        break;
    } 
}
laoshizhuce - 2010-5-28 19:17:00
void Paint_Bmp(unsigned char bmp[])
{
    unsigned short c;
    int x,y;
    int p = 0;
    unsigned short * addr;
    addr=(unsigned short *)LCDFRAMEBUFFER;
   
    for( y = 0 ; y < 240 ; y++ )
    {
        for( x = 0 ; x < 320 ; x++ )
        {
             c = (unsigned short)(bmp[p+1] |(( (short)bmp[p]) <<8)) ;
             if ( ( x < 320) && ( y < 240) )
                     *(addr+x+y*320) = c ;
             p = p + 2 ;
        }
    }
}
laoshizhuce - 2010-6-9 18:41:00
版主在吗
thisway.diy - 2010-6-9 22:52:00
你在 LCDCON5 里的 把 HWSWP 设为1,
与下面的语句是否予盾?
c = (unsigned short)(bmp[p+1] |(( (short)bmp[p]) <<8)) ;
laoshizhuce - 2010-6-15 13:40:00
版主啊不明白你的意思
c = (unsigned short)(bmp[p+1] |(( (short)bmp[p]) <<8)) ;这句是获得图片数据然后送往地址
和在 LCDCON5 里的 把 HWSWP 设为1没关系吧
麻烦版主详细说下
谢谢
laoshizhuce - 2010-6-17 12:29:00
自己顶
thisway.diy - 2010-6-23 17:32:00
不太好说明,你看一下HWSWP 的含义,
再看看这个图:
laoshizhuce - 2010-6-26 12:22:00
感谢版主
您还是没有理解我的意思
HWSWP我只设置了一次,以后再也没有设置了,和这个应该没有关系吧
谢谢
1
查看完整版本: LCD 裸奔程序显示不完全,求高手指点