lcd_driver.c

来自「Keil工程例子,NXP新出的芯片lpc2478的示例代码」· C语言 代码 · 共 703 行 · 第 1/2 页

C
703
字号

    INT32U *crsr_ptr;
    
    if (lcdcfgptr->init == TRUE)
    {
        status = _NO_ERROR;
        lcd = lcdcfgptr->regptr;

        switch (cmd)
        {
            case LCD_SET_BUFFER:
                /* Set LCD display frame buffer, arg = memory pointer for
                   image to be displayed */
                lcd->lcdupbase = (INT32U)arg;
                break;

            case LCD_CRSR_SET_BUFFER:
                /* Set LCD cursor image, arg = memory pointer for
                   image to be displayed */
                crsr_ptr = (INT32U *)arg;
                for(i = 0; i < 256; i++)
                {
                    lcd->cursorimage[i] = *(INT32U *)crsr_ptr;
                    crsr_ptr++;
                }
                break;

            case LCD_PWR_ON:
                /* Turn on the LCD controller power,
                   arg = 1, turn on, arg = 0, turn off */
                if (arg == 1)
                {

                        lcd->lcdctrl |= CLCDC_LCDCTRL_PWR;

                }
                else if (arg == 0)
                {

                        lcd->lcdctrl &= ~CLCDC_LCDCTRL_PWR;

                }
                else
                {
                    status = _ERROR;
                }
                break;

            case LCD_ENABLE:
                /* Enable the LCD controller,
                   arg = 1, enable, arg = 0, disable */
                if (arg == 1)
                {
                        lcd->lcdctrl |= CLCDC_LCDCTRL_ENABLE;
                }
                else if (arg == 0)
                {
                        lcd->lcdctrl &= ~CLCDC_LCDCTRL_ENABLE;
                }
                else
                {
                    status = _ERROR;
                }
                break;
                
            case LCD_CRSR_ENABLE:
                /* Enable the LCD cursor,
                   arg = 1, enable, arg = 0, disable */
                if (arg == 1)
                {
                        lcd->clcdcrsrctrl |= 1;
                }
                else if (arg == 0)
                {
                        lcd->clcdcrsrctrl &= ~1;
                }
                else
                {
                    status = _ERROR;
                }
                break;

            case LCD_CRSR_NUM:
                /* Select the LCD cursor number,
                   arg = 0, 64x64, arg = 0, 1, 2, 3, 32x32 */
                lcd->clcdcrsrctrl &= ~30;
                lcd->clcdcrsrctrl |= (INT32U)arg << 3;
                break;
                
            case LCD_CRSR_SIZE:
                /* Set the LCD cursor size,
                   arg = 1, 64x64, arg = 0, 32x32 */
                if (arg == 1)
                {
                        lcd->clcdcrsrconfig |= 1;
                }
                else if (arg == 0)
                {
                        lcd->clcdcrsrconfig &= ~1;
                }
                else
                {
                    status = _ERROR;
                }
                break;

            case LCD_CRSR_SYNC:
                /* Set the LCD cursor frame sync,
                   arg = 1, sync, arg = 0, async */
                if (arg == 1)
                {
                        lcd->clcdcrsrconfig |= 2;
                }
                else if (arg == 0)
                {
                        lcd->clcdcrsrconfig &= ~2;
                }
                else
                {
                    status = _ERROR;
                }
                break;
                

            case LCD_SET_BPP:
                /* Set current display bits per pixel, arg = bits per pixel */
                switch (arg)
                {
                    case BPP_IS_1:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP1;
                        break;
                    case BPP_IS_2:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP2;
                        break;
                    case BPP_IS_4:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP4;
                        break;
                    case BPP_IS_8:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP8;
                        break;
                    case BPP_IS_16:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP16;
                        break;
                    case BPP_IS_24:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP24;
                        break;
                    case BPP_IS_16_565_MODE:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP16_565_MODE;
                        break;
                    case BPP_IS_12_444_MODE:
                        lcd->lcdctrl &= ~_SBF(1, _BITMASK(3));
                        lcd->lcdctrl |= CLCDC_LCDCTRL_BPP12_444_MODE;
                        break;
                    default:
                        status = _ERROR;
                        break;
                }
                break;

            case LCD_SET_BGR:
                /* LCD invert the bgr bit in the LCD controller. arg = 1, invert
                   BGR for reverse color, arg = 0, BGR for normal color */
                if (arg == 1)
                {
                    /*  
                     *   Palette and direct color storage is 
                     *   blue in bits 4-0,
                     *   green in bits 9-5,
                     *   red in bits 14-10,
                     *   intensity in bit 15.
                     */
                    lcd->lcdctrl |= CLCDC_LCDCTRL_BGR;
                }
                else if (arg == 0)
                {
                    /*
                     *   Palette and direct color storage is 
                     *   red in bits 4-0,
                     *   green in bits 9-5,
                     *   blue in bits 14-10,
                     *   intensity in bit 15.
                     */
                    lcd->lcdctrl &= ~CLCDC_LCDCTRL_BGR;
                    
                }
                else
                {
                    status = _ERROR;
                }
                break;

            case LCD_SET_INTERRUPT:
                /* Set interrupt mask set/clear register */
                if (arg == CLCDC_LCD_INTERRUPT_FUF)
                {
                    lcd->lcdimsc |= CLCDC_LCD_INTERRUPT_FUF;
                }
                else if (arg == CLCDC_LCD_INTERRUPT_LNBU)
                {
                    lcd->lcdimsc |= CLCDC_LCD_INTERRUPT_LNBU;
                }
                else if (arg == CLCDC_LCD_INTERRUPT_VCOMP)
                {
                    lcd->lcdimsc |= CLCDC_LCD_INTERRUPT_VCOMP;
                }
                else if (arg == CLCDC_LCD_INTERRUPT_MBERROR)
                {
                    lcd->lcdimsc |= CLCDC_LCD_INTERRUPT_MBERROR;
                }
                else
                {
                    status = _ERROR;
                }
                break;

            case LCD_CLR_INTERRUPT:
                /* Set interrupt clear register*/
                if (arg == CLCDC_LCD_INTERRUPT_FUF)
                {
                    lcd->lcdicr |= CLCDC_LCD_INTERRUPT_FUF;
                }
                else if (arg == CLCDC_LCD_INTERRUPT_LNBU)
                {
                    lcd->lcdicr |= CLCDC_LCD_INTERRUPT_LNBU;
                }
                else if (arg == CLCDC_LCD_INTERRUPT_VCOMP)
                {
                    lcd->lcdicr |= CLCDC_LCD_INTERRUPT_VCOMP;
                }
                else if (arg == CLCDC_LCD_INTERRUPT_MBERROR)
                {
                    lcd->lcdicr |= CLCDC_LCD_INTERRUPT_MBERROR;
                }
                else
                {
                    status = _ERROR;
                }
                break;

            case LCD_CRSR_SET_INTERRUPT:
                /* Set cursor interrupt mask set/clear register */
                lcd->lcdcrsrimsc |= 1;
                break;

            case LCD_CRSR_CLR_INTERRUPT:
                /* Set cursor interrupt clear register*/
                lcd->lcdcrsricr |= 1;
                break;

            case LCD_CRSR_XY:
                /* Set lcd cursor xy position register*/
                lcd->clcdcrsrxy = (INT32U)arg;
                break;

            case LCD_CRSR_CLIP:
                /* Set lcd cursor clip position register*/
                lcd->clcdcrsrclip = (INT32U)arg;
                break;

            case LCD_GET_STATUS:
                switch (arg)
                {
                    case LCD_GET_BUFFER:
                        /* Returns LCD fram buffer address */
                        status = (INT32S)lcd->lcdupbase;
                        break;
                        
                    case LCD_GET_BPP:
                        /* Returns current LCD panel bit per pixel */
                        i = (lcd->lcdctrl) & _SBF(1,_BITMASK(3) );
                        switch (i)
                        {
                            case CLCDC_LCDCTRL_BPP1:
                                status = BPP_IS_1;
                                break;
                            case CLCDC_LCDCTRL_BPP2:
                                status = BPP_IS_2;
                                break;
                            case CLCDC_LCDCTRL_BPP4:
                                status = BPP_IS_4;
                                break;
                            case CLCDC_LCDCTRL_BPP8:
                                status = BPP_IS_8;
                                break;
                            case CLCDC_LCDCTRL_BPP16:
                                status = BPP_IS_16;
                                break;
                            case CLCDC_LCDCTRL_BPP24:
                                status = BPP_IS_24;
                                break;
                            case CLCDC_LCDCTRL_BPP16_565_MODE:
                                status = BPP_IS_16_565_MODE;
                                break;
                            case CLCDC_LCDCTRL_BPP12_444_MODE:
                                status = BPP_IS_12_444_MODE;
                                break;
                            default:
                                status = _ERROR;
                                break;
                        }
                        break;
                        
                    case LCD_GET_PALETTE:
                        /* Returns a pointer to palette table */
                        status = (INT32S)lcd->lcdpalette;
                        break;

                    case LCD_CRSR_GET_PALETTE0:
                        /* Returns a pointer to cursor palette table */
                        status = (INT32S)lcd->clcdcrsrpalette0;
                        break;

                    case LCD_CRSR_GET_PALETTE1:
                        /* Returns a pointer to cursor palette table */
                        status = (INT32S)lcd->clcdcrsrpalette1;
                        break;

                    case LCD_GET_INTERRUPT:
                        /* Get interrupt mask sstatus register */
                        status = (INT32S)lcd->lcdmis;
                        break;

                    case LCD_CRSR_GET_INTERRUPT:
                        /* Get cursor interrupt mask sstatus register */
                        status = (INT32S)lcd->lcdcrsrmis;
                        break;

                    default:
                        /* Unsupported parameter */
                        status = _ERROR;
                        break;
                        
                }
                break;

            default:
                /* Unsupported parameter */
                status = _ERROR;
        }
    }

    return status;
}

⌨️ 快捷键说明

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