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

📄 lcd_driver.c

📁 NXP ARM处理器240*320液晶驱动程序(IAR开发环境)
💻 C
📖 第 1 页 / 共 2 页
字号:
                 INT32S arg)
{
    CLCDC_REGS_T *lcd;
    INT32U i;
    CLCDC_CFG_T *lcdcfgptr = (CLCDC_CFG_T *) devid;
    INT32S status = _ERROR;
    

    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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -