📄 lcd_driver.c
字号:
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 + -