📄 lcddriver.c
字号:
pu16CharMap++;
*pu16Shadow = (*pu16CharMap) ^ 0xff;
pu16Shadow++;
u16Columns--;
} while (u16Columns > 0);
/* Add a column spacing */
*pu16Shadow = 0xff;
pu16Shadow++;
pcString++;
}
}
/****************************************************************************
*
* NAME: vLcdClearLine
*
* DESCRIPTION:
* Clears a specified line on the LCD Display
*
* PARAMETERS: Name RW Usage
* u16Row R Character row (0-7)
*
* NOTES:
* To see text, perform a refresh
*
****************************************************************************/
void vLcdClearLine(unsigned int u16Row)
{
unsigned int i;
unsigned int *pu16Shadow = &au16Shadow[u16Row * 240];
for(i=0; i<240;i++)
{
*pu16Shadow = 0;
pu16Shadow++;
}
}
/****************************************************************************
*
* NAME: vLcdWriteTextToClearLine
*
* DESCRIPTION:
* Puts text into shadow buffer. Text is aligned to a character row but can
* be at any column. Characters are variable width but 8 pixels high.
*
* PARAMETERS: Name RW Usage
* pcString R Pointer to zero-terminated string
* u16Row R Character row (0-7)
* u16Column R Start column (0-127)
*
* NOTES:
* To see text, perform a refresh
*
****************************************************************************/
void vLcdWriteTextToClearLine(char *pcString, unsigned int u16Row, unsigned int u16Column)
{
vLcdClearLine(u16Row);
vLcdWriteText(pcString, u16Row, u16Column);
}
/****************************************************************************
*
* NAME: vLcdWriteBitmap
*
* DESCRIPTION:
* Copies a bitmap to shadow memory
*
* PARAMETERS: Name RW Usage
* ps8Bitmap R Bitmap image: see .h file for details
****************************************************************************/
void vLcdWriteMenu(unsigned int *pu16Bitmap)
{
unsigned int i;
unsigned int *pu16Shadow;
pu16Shadow = &au16Shadow[0];
pu16Bitmap = &pu16Bitmap[0];
/* Copy bitmap */
for (i = 0; i < 3840; i++)
{
*pu16Shadow = *pu16Bitmap;
pu16Shadow++;
pu16Bitmap++;
}
}
void vLcdSwithMenu(unsigned int u16MenuItem)
{
unsigned int i;
unsigned int u16P;
unsigned int *pu16Shadow;
/* Copy bitmap */
for (i = 0; i < 27; i++)
{
pu16Shadow = &au16Shadow[i + u16MenuItem * 30];
u16P = *pu16Shadow ^ 0x00FE;
*pu16Shadow = u16P;
}
for (i = 128; i < 155; i++)
{
pu16Shadow = &au16Shadow[i + u16MenuItem * 30];
u16P = *pu16Shadow ^ 0x003F;
*pu16Shadow = u16P;
}
}
/****************************************************************************/
/*** Local Functions ***/
/****************************************************************************/
/**********************************
//= 函数原型: uchar check_cmd_st()
//= 功 能: 查询是否可读写命令和数据的状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
unsigned int check_cmd_st(void) // 状态位STA1,STA0 判断(读写指令和读写数据)
{
unsigned int i;
vSetCDline(1);
for(i=100;i>0;i--)
{
lcdsta=port8000;
if((lcdsta & 0x03) == 0x03)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar check_aw_st
//= 功 能: 查询是否可数据自动写状态
//= 参 数:
//= 返 回 值: 非0不忙,否则忙
//= 函数性质:私有函数
**********************************/
unsigned int check_aw_st(void) // 状态位ST3 判断(数据自动写状态)
{
unsigned int i;
vSetCDline(1);
for(i=100;i>0;i--)
{
lcdsta=port8000;
if((lcdsta & 0x08) == 0x08)
break;
}
return i; // 若返回零,说明错误
}
/**********************************
//= 函数原型: uchar wr_cmd_2(uchar uCmd,uint uPar)
//= 功 能: 给T6963C写带双参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
unsigned int wr_cmd_2(unsigned int uCmd,unsigned int uPar) // 写双参数的指令
{
if(check_cmd_st() == 0) return 1;
port8000 = uPar & 0xFF; //先写低字节,再写高字节
if(check_cmd_st() == 0) return 2;
port8000 = uPar >> 8;
if(check_cmd_st() == 0) return 3;
port8000 = uCmd;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_cmd_1(uchar uCmd,uchar uPar1)
//= 功 能: 给T6963C写带单参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
unsigned int wr_cmd_1(unsigned int uCmd,unsigned int uPar) // 写单参数的指令
{
if(check_cmd_st() == 0) return 1;
port8000 = uPar;
if(check_cmd_st() == 0) return 2;
port8000 = uCmd;
return 0; // 返回0 成功
}
/**********************************
//= 函数原型: uchar wr_cmd_0(uchar uCmd)
//= 功 能: 给T6963C写无参数的指令
//= 参 数:
//= 返 回 值: 返回0 成功,否则忙
//= 函数性质:私有函数
**********************************/
unsigned int wr_cmd_0(unsigned int uCmd) // 写无参数的指令
{
if(check_cmd_st() == 0) return 1;
port8000 = uCmd;
return 0; // 返回0 成功
}
/****************************************************************************
*
* NAME: vSetCDline
*
* DESCRIPTION:
* Sets the CD line to either high or low, as desired. This is used by the
* LCD controller to distinguish between commands and pixel data.
*
* PARAMETERS: Name RW Usage
* u16OnOff R Whether line should be high or low
*
****************************************************************************/
void vSetCDline(unsigned int u16OnOff)
{
if (u16OnOff)
{
PEDATDIR=0x0020; //IOPE5=1指令
}
else
{
PEDATDIR=0xFFDF; //IOPE5=0数据
}
}
void vValToDec(char *pcOutString, unsigned int u8Value, char *pcLabel)
{
static const unsigned int au8Digits[5] = {10000, 1000, 100, 10, 1};
unsigned int u8Digit;
unsigned int u8DigitIndex;
unsigned int u8Count;
unsigned int boPreviousDigitPrinted = 0;
for (u8DigitIndex = 0; u8DigitIndex < 5; u8DigitIndex++)
{
u8Count = 0;
u8Digit = au8Digits[u8DigitIndex];
while (u8Value >= u8Digit)
{
u8Value -= u8Digit;
u8Count++;
}
if ( (u8Count != 0) ||(boPreviousDigitPrinted == 1)
|| (u8DigitIndex == 4))
{
*pcOutString = '0' + u8Count;
boPreviousDigitPrinted = 1;
pcOutString++;
}
}
vStringCopy(pcLabel, pcOutString);
}
void vStringCopy(char *pcFrom, char *pcTo)
{
while (*pcFrom != '\0')
{
*pcTo = *pcFrom;
pcTo++;
pcFrom++;
}
*pcTo = '\0';
}
/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -