查看: 4333|回复: 3

[已解决] LPC1850单片机的官方LCD例程

[复制链接]

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
18
最后登录
2018-6-12
发表于 2016-6-17 17:13:51 | 显示全部楼层 |阅读模式
官方提供的LCD demo中,主函数里只看到了触摸和光标,那么LCD的显示是在哪里实现的?
程序片段:


int c_entry (void)                                                 /* Main Program                       */
{
        uint32_t i,j;
        int cursor_x = 380, cursor_y = 200;
        Bool Sts = FALSE;

        SystemInit();
        CGU_Init();
        CGU_SetDIV(CGU_CLKSRC_IDIVE, 1);
        CGU_EntityConnect(CGU_CLKSRC_PLL1, CGU_CLKSRC_IDIVE);
        CGU_EntityConnect(CGU_CLKSRC_IDIVE,CGU_BASE_LCD);
        SDRAM_Init();
        /*pin set up for LCD */
        scu_pinmux(0x07, 7, MD_PUP, FUNC3);         /* LCD_PWR @ P7.7 */

        scu_pinmux(0x04, 7, MD_PUP, FUNC0);                /* LCD_DCLK @ P4.7 */
        scu_pinmux(0x04, 5, MD_PUP, FUNC2);                /* LCD_FP @ P4.5 */
        scu_pinmux(0x04, 6, MD_PUP, FUNC2);         /* LCD_ENAB_M @ P4.6 */
        scu_pinmux(0x07, 6, MD_PUP, FUNC3);                /* LCD_LP @ P7.6 */
        scu_pinmux(0x04, 1, MD_PUP, FUNC2);                /* LCD_VD_0 @ P4.1 */
        scu_pinmux(0x04, 4, MD_PUP, FUNC2);                /* LCD_VD_1 @ P4.4 */
        scu_pinmux(0x04, 3, MD_PUP, FUNC2);                /* LCD_VD_2 @ P4.3 */ //Uncommented by Kevin
        scu_pinmux(0x04, 2, MD_PUP, FUNC2);                /* LCD_VD_3 @ P4.2 */
        scu_pinmux(0x08, 7, MD_PUP, FUNC3);                /* LCD_VD_4 @ P8.7 */
        scu_pinmux(0x08, 6, MD_PUP, FUNC3);                /* LCD_VD_5 @ P8.6 */
        scu_pinmux(0x08, 5, MD_PUP, FUNC3);                /* LCD_VD_6 @ P8.5 */
        scu_pinmux(0x08, 4, MD_PUP, FUNC3);                /* LCD_VD_7 @ P8.4 */
        scu_pinmux(0x07, 5, MD_PUP, FUNC3);                /* LCD_VD_8 @ P7.5 */
        scu_pinmux(0x04, 8, MD_PUP, FUNC2);                /* LCD_VD_9 @ P4.8 */
        scu_pinmux(0x04, 10, MD_PUP, FUNC2);        /* LCD_VD_10 @ P4.10 */
        scu_pinmux(0x04, 9, MD_PUP, FUNC2);         /* LCD_VD_11 @ P4.9 */
        scu_pinmux(0x08, 3, MD_PUP, FUNC3);         /* LCD_VD_12 @ P8.3 */
        scu_pinmux(0x0B, 6, MD_PUP, FUNC2);         /* LCD_VD_13 @ PB.6 */
        scu_pinmux(0x0B, 5, MD_PUP, FUNC2);         /* LCD_VD_14 @ PB.5 */
        scu_pinmux(0x0B, 4, MD_PUP, FUNC2);         /* LCD_VD_15 @ PB.4 */
        scu_pinmux(0x07, 4, MD_PUP, FUNC3);                /* LCD_VD_16 @ P7.4 */
       
        scu_pinmux(0x07, 3, MD_PUP, FUNC3);                /* LCD_VD_17 @ P7.3 */ //Added by Kevin
       
        scu_pinmux(0x07, 2, MD_PUP, FUNC3);         /* LCD_VD_18 @ P7.2 */
        scu_pinmux(0x07, 1, MD_PUP, FUNC3);         /* LCD_VD_19 @ P7.1 */
        scu_pinmux(0x0B, 3, MD_PUP, FUNC2);         /* LCD_VD_20 @ PB.3 */
        scu_pinmux(0x0B, 2, MD_PUP, FUNC2);         /* LCD_VD_21 @ PB.2 */
        scu_pinmux(0x0B, 1, MD_PUP, FUNC2);         /* LCD_VD_22 @ PB.1 */
        scu_pinmux(0x0B, 0, MD_PUP, FUNC2);         /* LCD_VD_23 @ PB.0 */

//        scu_pinmux(0x07, 0, MD_PUP, FUNC3);                /* LCD_LE @ P7.0 */ //Commented by Kevin
//        scu_pinmux(0x04, 4, MD_PUP, FUNC0);                /* LCD_VD_2 @ P4.3 */ //Commented by Kevin

//        scu_pinmux(0x04, 1, MD_PUP, FUNC0);                /* LCDVDEN */ //Commented by Kevin

        // Added by Kevin, for backlight control
        scu_pinmux(0x08, 1, MD_PUP, FUNC0);                /* P8.1 */
        GPIO_SetDir(4,1<<1, 1); /* GPIO4[1] */

        GPIO_SetDir(2,1<<4, 1);
        GPIO_SetDir(2,1<<1, 1);
        GPIO_SetDir(3,1<<8, 1);        /*LCDLE*/
        GPIO_SetDir(3,1<<11, 1);
       
       
        /* LCDVDEN */
        GPIO_ClearValue(2, 1<<1);
       
        // Added by Kevin, Disable Backlight
        GPIO_ClearValue(4,1<<1);
       
        // M3Frequency is automatically set when SetClock(BASE_M3_CLK... was called.
        SysTick_Config(CGU_GetPCLKFrequency(CGU_PERIPHERAL_M3CORE)/1000);                                  // Generate interrupt @ 1000 Hz
        msec=5;while(msec);

        LPC_RGU->RESET_CTRL0 = (1UL << 16);
        msec=5;while(msec);

        /*Fill Colorbar only*/
        for(i=0;i<LCD_WIDTH*LCD_HEIGHT/4;i++)
        {
                framebuffer[i] = 0x1F;
        }
        for(i=LCD_WIDTH*LCD_HEIGHT/4;i<LCD_WIDTH*LCD_HEIGHT*2/4;i++)
        {
                framebuffer[i] = 0x3F<<5;
        }
        for(i=LCD_WIDTH*LCD_HEIGHT*2/4;i<LCD_WIDTH*LCD_HEIGHT*3/4;i++)
        {
                framebuffer[i] = 0x1F<<11;
        }
        for (i=LCD_WIDTH*LCD_HEIGHT*3/4; i < LCD_WIDTH*LCD_HEIGHT; i++)
        {
                framebuffer[i] = 0xFFFF;
        }
       
        /* Fill NXP logo */
#if 1
        for(j=0;j<LOGO_HEIGHT;j++)
        {
                for(i=0;i<LOGO_WIDTH;i++)
                {
                        putpixel(i,j, image[(i+j*LOGO_WIDTH)]);
                }
        }
#endif
        GPIO_SetValue(3, 1<<11);
        LCD_Init(LPC_LCD, (LCD_CFG_Type*)&EA800x480);
//         InitLcdController();

        TSC2046_Init((TSC2046_Init_Type *)&TSC2046_800480_12bit);
       
        LCD_SetFrameBuffer(LPC_LCD, (void*)framebuffer);
        LCD_Power(LPC_LCD, ENABLE);
        msec=100;while(msec);
        LCD_Cursor_Enable(LPC_LCD, 0, DISABLE);
        LCD_Cursor_Config(LPC_LCD, LCD_CURSOR_32x32, TRUE);
        LCD_Cursor_WriteImage(LPC_LCD, 0, (void *)Cursor);
        LCD_Cursor_SetPos(LPC_LCD,cursor_x,cursor_y);
        LCD_Cursor_Enable(LPC_LCD, 0, ENABLE);

        msec=20;while(msec);
       
        // Added by Kevin, Enable Backlight
        GPIO_SetValue(4,1<<1);
       
        while (1)
        {
                Sts = GetTouchPos((int16_t*)&cursor_x, (int16_t*)&cursor_y);
                if (Sts)
                        LCD_Cursor_SetPos(LPC_LCD, cursor_x, cursor_y);
        }
}



最佳答案

这段只是把图像数据复制到SDRAM区。LCD_Init会完成LCD控制器的初始化,最后把SDRAM的区域作为LCD的Buffer指到LCD控制器中,这样LCD在刷屏的时候就自动通过DMA把SDRAM中的数据刷到LCD上 ...
回复

使用道具 举报

该用户从未签到

2

主题

5

帖子

0

新手上路

Rank: 1

积分
18
最后登录
2018-6-12
 楼主| 发表于 2016-6-17 17:16:11 | 显示全部楼层
如果 Fill NXP logo 这段是把图标以像素形式显示在屏幕上,那为什么后面会有 LCD_Init() ?

/* Fill NXP logo */
#if 1
        for(j=0;j<LOGO_HEIGHT;j++)
        {
                for(i=0;i<LOGO_WIDTH;i++)
                {
                        putpixel(i,j, image[(i+j*LOGO_WIDTH)]);
                }
        }
#endif
回复 支持 反对

使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-2 08:40
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    103

    主题

    868

    帖子

    7

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4336
    最后登录
    2025-6-13
    发表于 2016-6-19 23:10:48 | 显示全部楼层
    这段只是把图像数据复制到SDRAM区。LCD_Init会完成LCD控制器的初始化,最后把SDRAM的区域作为LCD的Buffer指到LCD控制器中,这样LCD在刷屏的时候就自动通过DMA把SDRAM中的数据刷到LCD上
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24882
    最后登录
    2025-7-20
    发表于 2016-6-20 09:52:00 | 显示全部楼层
    楼上说的是正确的,其实楼主可以设断点debug也能看出,具体是哪句实现了写屏的功能。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 23:51 , Processed in 0.092383 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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