⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsp_lcd.c

📁 lpc2478+ucosII+ucgui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
*
*                        LCD_DualPanelEn      DEF_ENABLED
*                                             DEF_DISABLED
*
*                        LCD_EndianByteType   BSP_LCD_ENDIAN_BYTE_TYPE_BIG  
*                                             BSP_LCD_ENDIAN_BYTE_TYPE_LITTLE
*                                        
*                        LCD_EndianPixelType  BSP_LCD_ENDIAN_PIXEL_TYPE_BIG
*                                             BSP_LCD_ENDIAN_PIXEL_TYPE_LITTLE
*    
*                        LCD_HBP              Any positive integer value
*                        LCD_HFP              "    "         "      "
*                        LCD_HSW              "    "         "      "
*                        LCD_PPL              "    "         "      "
*                        LCD_LinEndDly        "    "         "      "
*                        LCD_VBP              "    "         "      "
*                        LCD_VFP              "    "         "      "
*                        LCD_VSW              "    "         "      "
*                        LCD_LPP              "    "         "      "
*                        LCD_PixelClkFreq     "    "         "      "
*
*                        LCD_PolFlags         OR value with the folowing Masks
*                                             BSP_LCD_FLAG_IOE_EN
*                                             BSP_LCD_FLAG_IPC_EN
*                                             BSP_LCD_FLAG_IHS_EN
*                                             BSP_LCD_FLAG_IVS_EN
*
*                        LCD_UpperPanelAddr   Any positive integer value that represents a valid position in memory
*
*                        LCD_LowerPanelAddr   Any positive integer value that represents a valid position in memory
*        
*                        LCD_SwapRB_En        DEF_ENABLED
*                                             DEF_DISABLED
*
* Return(s)   : none.
*
* Caller(s)   : BSP_LCD_Init()
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  BSP_LCD_CtrlInit  (BSP_LCD_PARAM  *LCDInit)
{
    CPU_INT32U   reg_val;    
    CPU_INT32U   lcd_clk;
    CPU_INT16U   lcd_clk_div;    

    
    PCONP      |=  (1 << BSP_PCLK_PCLCD);                       /* Enable LCD controller in the Power Control register       */

    reg_val     =  0;
                                                                /* Configure the I/O based on the display mode and type      */
    switch (LCDInit->LCD_DispMode) {       
        case BSP_LCD_DISP_MODE_TFT_SINGLE_16_565:
        case BSP_LCD_DISP_MODE_STN_SINGLE_8_MONO:
        case BSP_LCD_DISP_MODE_STN_SINGLE_COLOR:

             PINSEL2  &= 0xFFFFFFCF;
             PINSEL2  |= 0x00000010;
             PINMODE2 &= 0xFFFFFFCF;
             PINMODE2 |= 0x00000020;
        
             PINSEL3  &= 0xFFC000FF;
             PINSEL3  |= 0x00155500;
             PINMODE3 &= 0xFFC000FF;
             PINMODE3 |= 0x002AAA00;
        
             PINSEL4  &= 0xF0F00000;
             PINSEL4  |= 0x050FFFFF;
             PINMODE4 &= 0xF0F00000;
             PINMODE4 |= 0x0A0AAAAA;

             PINSEL11 &= 0xFFFFFFF0;
             PINSEL11 |= 0x0000000B;         
             break;

        case BSP_LCD_DISP_MODE_TFT_SINGLE_16_1555:        
        case BSP_LCD_DISP_MODE_STN_DUAL_4_MONO:
             /* $$$$ Insert code for I/O initialization in this mode */
             break;

        case BSP_LCD_DISP_MODE_TFT_SINGLE_24:
        case BSP_LCD_DISP_MODE_STN_DUAL_8_MONO:
        case BSP_LCD_DISP_MODE_STN_DUAL_COLOR:   
/*
             PINSEL0  &= 0xFFF000FF;
             PINSEL0  |= 0x00005500;

             PINMODE0 &= 0xFFFC00FF;
             PINMODE0 |= 0x0002AA00;
 
             PINSEL3  &= 0xF00000FF;
             PINSEL3  |= 0x05555500;
             PINMODE3 &= 0xF00000FF;
             PINMODE3 |= 0x0AAAAA00;

             PINSEL4  &= 0xF0300000;
             PINSEL4  |= 0x054FFFFF;
             PINMODE4 &= 0xF0300000;
             PINMODE4 |= 0x0A8AAAAA;
             
             PINSEL9  &= 0xF0FFFFFF;
             PINSEL9  |= 0x0A000000;
             PINMODE9 &= 0xF0FFFFFF;
             PINMODE9 |= 0x0A000000;

             PINSEL11 &= 0xFFFFFFF0;
             PINSEL11 |= 0x0000000F;
*/
             break;
       
        default:             
        case BSP_LCD_DISP_MODE_TFT_SINGLE_12_444:
        case BSP_LCD_DISP_MODE_STN_SINGLE_4_MONO:
        /* $$$$ Insert code for I/O initialization in this mode */
             break;
    }
    
                                                                /* Set the Horizoantal Timing values                         */
    LCD_TIMH     = (((((LCDInit->LCD_PPL / 16) - 1) & 0x3F) << 2 )
                 |  ((((LCDInit->LCD_HSW     ) - 1) & 0xFF) << 8 )
                 |  ((((LCDInit->LCD_HFP     ) - 1) & 0xFF) << 16) 
                 |  ((((LCDInit->LCD_HBP     ) - 1) & 0xFF) << 24)); 
    
                                                                /* Set the Vertical Timing values                            */
    LCD_TIMV     = ((((LCDInit->LCD_LPP  - 1) & 0x3FF) << 0)
                 |  (((LCDInit->LCD_VSW  - 1) & 0x03F) << 10)
                 |  (((LCDInit->LCD_VFP  - 1) & 0x0FF) << 16) 
                 |  (((LCDInit->LCD_VBP  - 1) & 0x0FF) << 24)); 

                                                                /* Configure the Clock and siganl polarity register with ... */
                                                                /* ... following formula LCDCLK = LCDCLKIN / (clk_div + 2)   */
    reg_val      = 0;    
    lcd_clk      = BSP_LCD_GetClkFreq();  
    lcd_clk_div  = (lcd_clk / (LCDInit->LCD_PixelClkFreq));
    lcd_clk_div &= 0x3FF;                                       /* LCD Clk divisor is only 10 bits                           */
    
    if (lcd_clk_div >= 2) {                                     /* If the divisor is >= 2                                    */ 
        lcd_clk_div -= 2;                                       
        reg_val     |= ((lcd_clk_div >>    5) << 27);           /* LCDPOL[31:27] = Upper five bits of clk_div                */
        reg_val     |= ((lcd_clk_div  & 0x1F) <<  0);           /* LCDPOL[4:0]   = Lower five bits of clk_div                */        
    } else {                                                    /* If the divisor is < 2                                     */
        reg_val |=  BSP_LCD_POL_BCD_EN;                         /* Bypass clk divider                                        */
    }

    if (LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_TFT) {        /* Set the clocks per line value                            */
         reg_val   |= (((LCDInit->LCD_PPL - 1) & 0x3FF) << 16);
    } else {
         switch (LCDInit->LCD_DispType) {
             case BSP_LCD_DISP_MODE_STN_SINGLE_4_MONO:
             case BSP_LCD_DISP_MODE_STN_DUAL_4_MONO:             
                  reg_val   |= ((((LCDInit->LCD_PPL / 4) - 1) & 0x3FF) << 16);
                  break;
     
             case BSP_LCD_DISP_MODE_STN_DUAL_8_MONO:     
             case BSP_LCD_DISP_MODE_STN_SINGLE_8_MONO:
                  reg_val   |= ((((LCDInit->LCD_PPL / 8) - 1) & 0x3FF) << 16);
                  break;
             
             case BSP_LCD_DISP_MODE_STN_SINGLE_COLOR:
             case BSP_LCD_DISP_MODE_STN_DUAL_COLOR:
                  reg_val   |= (((((LCDInit->LCD_PPL * 3) / 8) - 1) & 0x3FF) << 16);                  
                  default:             
                  break;   
         }
    }
    
    if (LCDInit->LCD_ACB != 0) {                                  /* Set the AC bias pin frequency                            */
        reg_val |= (((LCDInit->LCD_ACB - 1) & 0x1F) << 6);
    }
    
    if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IOE_EN)) {
        reg_val |= BSP_LCD_POL_IOE; 
    }
    
    if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IPC_EN)) {
        reg_val |= BSP_LCD_POL_IPC; 
    }

    if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IHS_EN)) {        
        reg_val |= BSP_LCD_POL_IHS; 
    }

    if (DEF_BIT_IS_SET(LCDInit->LCD_PolFlags, BSP_LCD_FLAG_IVS_EN)) {        
        reg_val |= BSP_LCD_POL_IVS; 
    }
       
    LCD_POL  = reg_val;
    
    if (LCDInit->LCD_LinEndDly != 0) {                          /* Configure the Line End Control Register                   */
        LCD_LE =  BSP_LCD_LE_LEE_EN
               | (LCDInit->LCD_LinEndDly & 0x7F);
    } 
                                                                /* Configure LCD Panel Address                               */
    if(LCDInit->LCD_DualPanelEn == DEF_ENABLED) { 
        LCD_LPBASE = (CPU_INT64U)(LCDInit->LCD_LowerPanelAddr & 0xFFFFFFFC);
    }
    
    LCD_UPBASE = (CPU_INT64U)(LCDInit->LCD_UpperPanelAddr & 0xFFFFFFFC);
    
    reg_val = 0; 
                                                                /* Configure the LCD Control Register                        */
    if (LCDInit->LCD_EndianByteType == BSP_LCD_ENDIAN_BYTE_TYPE_BIG) {
        reg_val |= BSP_LCD_CTRL_BEBO_EN;                        /* Big Endian byte order                                     */
    }
 
    if (LCDInit->LCD_EndianPixelType == BSP_LCD_ENDIAN_PIXEL_TYPE_BIG) {
       reg_val  |= BSP_LCD_CTRL_BEPO_EN;                        /* Big endian Pixel order                                    */
    }

    if(LCDInit->LCD_SwapRB_En == DEF_ENABLED) {                    
        reg_val |= BSP_LCD_CTRL_BGR;                            /* Swap Read and Blue values = BGR                           */
    }
    
    if(LCDInit->LCD_DualPanelEn == DEF_ENABLED) { 
       reg_val |= BSP_LCD_CTRL_DUAL_PANEL_EN;                   /* Enable Dual panel feature                                 */
    }
    
    if ((LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_STN             ) &&
        (LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_SINGLE_COLOR) &&
        (LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_DUAL_COLOR  )) {
        if ((LCDInit->LCD_DispMode == BSP_LCD_DISP_MODE_STN_DUAL_8_MONO)  ||
            (LCDInit->LCD_DispMode == BSP_LCD_DISP_MODE_STN_SINGLE_8_MONO)) {
            reg_val |= BSP_LCD_CTRL_MONO_8_EN;
        }
    }
             
    if (LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_TFT) {
        reg_val |= BSP_LCD_CTRL_LCD_TFT_EN;                     /* Enable TFT display type                                   */
    }
                                                               
    if ((LCDInit->LCD_DispType == BSP_LCD_DISP_TYPE_STN             ) &&
        (LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_SINGLE_COLOR) &&
        (LCDInit->LCD_DispMode != BSP_LCD_DISP_MODE_STN_DUAL_COLOR  )) {
        reg_val |= BSP_LCD_CTRL_BW_EN;                          /* Enable Black and White support for monochome STN disp     */
    }
   
    switch (LCDInit->LCD_BPP) {                                 /* Set the bits per pixel value                              */
        case BSP_LCD_BPP_1:
             reg_val |= BSP_LCD_CTRL_BPP1;
             break;
             
        case BSP_LCD_BPP_2:
             reg_val |= BSP_LCD_CTRL_BPP2;
             break;

        case BSP_LCD_BPP_4:
             reg_val |= BSP_LCD_CTRL_BPP8;
             break;

        case BSP_LCD_BPP_24:
             reg_val |= BSP_LCD_CTRL_BPP24;
             break;
             
        case BSP_LCD_BPP_16_565:
             reg_val |= BSP_LCD_CTRL_BPP16_565;
             break;

        case BSP_LCD_BPP_12_444:             
             reg_val |= BSP_LCD_CTRL_BPP12_444;
             
        default:    
             break;        
    }
         
    LCD_CTRL   = reg_val;
}

/*
*********************************************************************************************************
*                                             BSP_LCD_GetClkFreq()
*
* Description : Returns the Frequency of the LCD Controller Clk
*
* Argument(s) : none
*
* Return(s)   : The frequency in Hertz of the  LCD Controller Clk
*
* Caller(s)   : BSP_LCD_CtrlInit().
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  CPU_INT32U  BSP_LCD_GetClkFreq (void)
{
    CPU_INT08U  lcd_clk_div;
    CPU_INT32U  lcd_clk_src_freq;
    
    
    lcd_clk_div = (LCD_CFG & 0x1F) + 1;
    
    if (DEF_BIT_IS_CLR(LCD_POL, DEF_BIT_05)) {
        lcd_clk_src_freq = BSP_CPU_ClkFreq();
    } else {
        lcd_clk_src_freq = BSP_LCD_CLK_IN_FREQ;
    }
    
    return (lcd_clk_src_freq / lcd_clk_div);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -