📄 lcddriver.c
字号:
sLcdWriteData(bitno);
}
/************************************************************************************
*Function name: sLcdHLine *
*Parameters: x,y left pixel of the line *
* len:the length of line *
*Description: this function is used only for horizontal line *
* the colour of line is based on bLcdReverse *
*************************************************************************************/
void sLcdHLine(INT8U x,INT8U y,INT16U len)
{
INT8U bLowBitNo;
INT8U bHighBitNo;
INT8U bByteNo;
INT8U bBitMask;
INT16U temp;
temp=x+y*bMaxPixelX;
bLowBitNo=(temp-(temp>>3)*8);
if(bLowBitNo!=0)
{
bLowBitNo=8-bLowBitNo;
}
temp=x+y*bMaxPixelX+len-1;
bHighBitNo=(temp-(temp>>3)*8);
if(bHighBitNo!=7)
{
bHighBitNo+=1;
}
else
{
bHighBitNo=0;
}
bByteNo=(len-bHighBitNo-bLowBitNo)>>3;
bMetricsMode=cMetricsPixel;
if(bLowBitNo!=0)
{
bBitMask=((1<<(8-bLowBitNo))-1);
sLcdMoveTo(x,y);
sLcdWriteCommand(LCD_REG_READ);
temp=sbLcdReadData();
sLcdWriteCommand(LCD_REG_READ);
temp=sbLcdReadData();
if(bLcdReverse==cLcdNormal)
{
temp|=~bBitMask;
}
else
{
temp&=bBitMask;
}
sLcdMoveTo(x,y);
sLcdWriteCommand(LCD_REG_DATA);
sLcdWriteData(temp);
}
if(bByteNo!=0)
{
sLcdMoveTo(x+bLowBitNo,y);
sLcdWriteCommand(LCD_REG_DATA);
for(temp=0;temp<bByteNo;temp++)
{
if(bLcdReverse==cLcdNormal)
{
sLcdWriteData(0x00FF);
}
else
{
sLcdWriteData(0x0000);
}
}
}
if(bHighBitNo!=0)
{
bBitMask=(1<<(bHighBitNo))-1;
sLcdMoveTo(x+len-1,y);
sLcdWriteCommand(LCD_REG_READ);
temp=sbLcdReadData();
sLcdWriteCommand(LCD_REG_READ);
temp=sbLcdReadData();
if(bLcdReverse==cLcdNormal)
{
temp|=bBitMask;
}
else
{
temp&=~bBitMask;
}
sLcdMoveTo(x+len-1,y);
sLcdWriteCommand(LCD_REG_DATA);
sLcdWriteData(temp);
}
}
/************************************************************************************
*Function name: sLcdVLine *
*Parameters: x,y up pixel of the line *
* len:the length of line *
*Description: this function is used only for vertical line *
* the colour of line is based on bLcdReverse *
*************************************************************************************/
void sLcdVLine(INT8U x,INT8U y,INT16U len)
{
INT8U i;
for(i=0;i<len;i++)
{
if(bLcdReverse==cLcdNormal)
{
sLcdPixelSet(x,y+i);
}
else
{
sLcdPixelClr(x,y+i);
}
}
}
/************************************************************************************
*Function name: sLcdFillRect *
*Parameters: x0,y0:top left pixel *
* xLen,yLen:size of the rectangle *
*Description: this function is used only in pixel mode *
* draw a rectangle in the region *
*************************************************************************************/
void sLcdFillRect(INT8U x0,INT8U y0,INT8U xLen,INT8U yLen)
{
INT8U i;
// INT8U j;
for(i=0;i<yLen;i++)
{
sLcdHLine(x0,i+y0,xLen);
}
}
void sLcdShowBmp(INT8U x,INT8U y,INT8U bWidth,INT8U bHeight,INT16U bDataAddr,INT8U bByteOrData)
{
INT16U addr;
INT8U i,j;
bMetricsMode=cMetricsChar;
sLcdMoveTo(x,y);
addr=wLcdAddress;
sLcdWriteCommand(LCD_REG_DATA);
if(bByteOrData == 1)
{
for(i=0;i<bHeight;i++)
{
for(j=0;j<(bWidth/16);j++)
{
wBankedDataAddress=bDataAddr+(i*(bWidth/16)+j)*2;
sReadBankedData();
sLcdDisplayByte(addr+j*2,wBankedData/256,cNotInv);
sLcdDisplayByte(addr+j*2+1,wBankedData%256,cNotInv);
}
addr+=bMaxCharX;
}
}
else if(bByteOrData == 0)
{
for(i=0;i<bHeight;i++)
{
for(j=0;j<(bWidth/8);j++)
{
wBankedDataAddress=bDataAddr+(i*(bWidth/8)+j)*2;
sReadBankedData();
sLcdDisplayByte(addr+j,wBankedData/256,cNotInv);
addr+=bMaxCharX;
sLcdDisplayByte(addr+j,wBankedData%256,cNotInv);
}
}
}
}
/************************************************************************************
*Following functions are used only in character mode *
*************************************************************************************/
void sLcdClearScreen(void)
{
INT8U i;
INT8U j;
bMetricsMode=cMetricsChar;
sLcdMoveTo(0,0);
sLcdWriteCommand(LCD_REG_DATA);
for(i=0;i<bMaxCharX;i++)
{
for(j=0;j<bMaxPixelY;j++)
{
sLcdWriteData(0x0000);
}
}
}
/************************************************************************************
*Function name: LcdInvData *
*Parameters: data:the data to be displayed *
*This function inverter the data from database *
*************************************************************************************/
INT8U LcdInvData(INT8U data)
{
INT8U temp;
temp=0;
temp+=((data&0x0001)<<7);
temp+=(((data>>1)&0x0001)<<6);
temp+=(((data>>2)&0x0001)<<5);
temp+=(((data>>3)&0x0001)<<4);
temp+=(((data>>4)&0x0001)<<3);
temp+=(((data>>5)&0x0001)<<2);
temp+=(((data>>6)&0x0001)<<1);
temp+=((data>>7)&0x0001);
if(bLcdReverse==cLcdReverse)
{
temp=~temp;
}
return(temp);
}
/************************************************************************************
*Function name: LcdDisplayByte *
*Parameters: address:the phisical address in display ram *
* data:one byte data to be displayed *
*This function inverter the data from database *
*************************************************************************************/
void sLcdDisplayByte(INT16U addr,INT8U data,INT8U bInv)
{
INT16U temp;
if(bInv==cInv)
{
temp=LcdInvData(data);
}
else
{
temp=data;
}
sLcdWriteCommand(LCD_REG_CUR_LADD);
sLcdWriteData(addr&0x00FF);
sLcdWriteCommand(LCD_REG_CUR_HADD);
sLcdWriteData(addr>>8);
sLcdWriteCommand(LCD_REG_DATA);
sLcdWriteData(temp);
}
/****************************************************************************************
*Function name: sLcdShowHalfWord *
*Parameters: pdata: the pointer to the database to be displayed *
*Description: show a half word in the screen,the position must be set by *
* sLcdMoveTo,after the function,the position turns to the next *
* position automaticly *
*****************************************************************************************/
void sLcdShowHalfWord(INT16U *pdata)
{
INT16U addr;
INT8U i;
addr=wLcdAddress;
sLcdDisplayByte(addr,0,cInv);
addr+=bMaxCharX;
wBankedDataAddress=(INT16U)(pdata);
for(i=0;i<7;i++)
{
sReadBankedData();
sLcdDisplayByte(addr,(wBankedData)>>8,cInv);
addr+=bMaxCharX;
sLcdDisplayByte(addr,(wBankedData)&0x00FF,cInv);
addr+=bMaxCharX;
wBankedDataAddress+=2;
}
sLcdDisplayByte(addr,0,cInv);
bLcdCharX++;
if(bLcdCharX>=bMaxCharX)
{
bLcdCharX=0;
bLcdCharY++;
}
sLcdMoveTo(bLcdCharX,bLcdCharY);
}
/****************************************************************************************
*Function name: sLcdShowWord *
*Parameters: pdata: the pointer to the database to be displayed *
*Description: show a word in the screen,the position must be set by *
* sLcdMoveTo,after the function,the position turns to the next *
* position automaticly *
*****************************************************************************************/
void sLcdShowWord(INT16U *pdata)
{
INT16U addr;
INT8U i;
addr=wLcdAddress;
sLcdDisplayByte(addr,0,cInv);
sLcdDisplayByte(addr+1,0,cInv);
addr+=bMaxCharX;
wBankedDataAddress=(INT16U)(pdata);
for(i=0;i<14;i++)
{
sReadBankedData();
sLcdDisplayByte(addr,(wBankedData)>>8,cInv);
sLcdDisplayByte(addr+1,(wBankedData)&0x00FF,cInv);
addr+=bMaxCharX;
wBankedDataAddress+=2;
}
sLcdDisplayByte(addr,0,cInv);
sLcdDisplayByte(addr+1,0,cInv);
bLcdCharX+=2;
if(bLcdCharX>=bMaxCharX)
{
bLcdCharX=0;
bLcdCharY++;
}
sLcdMoveTo(bLcdCharX,bLcdCharY);
}
/************************************************************************************
*Functuon name: sLcdShowSingleChar *
*Parameter: code: the data to be displayed *
*************************************************************************************/
void sLcdShowSingleChar(INT16U code)
{
INT16U *pdata;
pdata=sbDBSearchCode(code);
if(pdata==NULL)
{
return;
}
if(code<0x0080)
{
sLcdShowHalfWord(pdata);
}
else
{
sLcdShowWord(pdata);
}
}
/************************************************************************************
*Functuon name: sLcdShowChar *
*Parameter: x,y *
* pString: the pointer to the string *
*************************************************************************************/
void sLcdShowString(INT8U x,INT8U y,INT8U *pString)
{
INT8U *p1;
INT16U *p2;
bMetricsMode=cMetricsChar;
sLcdMoveTo(x,y);
while(1)
{
if(*pString=='\0')
{
break;
}
if(*pString<0x0080)
{
p1=pString;
sLcdShowSingleChar(*p1);
p1++;
pString=p1;
}
else
{
p2=(INT16U*)pString;
sLcdShowSingleChar(*p2);
p2++;
pString=(INT8U*)p2;
}
}
}
/************************************************************************************
*For User defined Database *
*************************************************************************************/
/************************************************************************************
*Functuon name: sLcdShowUserHalfChar *
*Parameter: x,y *
* pdata: the pointer to the user's database *
*Description: show user's half character in (x,y) *
*************************************************************************************/
void sLcdShowUserEChar(INT8U x,INT8U y,INT16U *pdata)
{
bMetricsMode=cMetricsChar;
sLcdMoveTo(x,y);
sLcdShowHalfWord(pdata);
}
/************************************************************************************
*Functuon name: sLcdShowUserChar *
*Parameter: x,y *
* pdata: the pointer to the user's database *
*Description: show user's character in (x,y) *
*************************************************************************************/
void sLcdShowUserCChar(INT8U x,INT8U y,INT16U *pdata)
{
bMetricsMode=cMetricsChar;
sLcdMoveTo(x,y);
sLcdShowWord(pdata);
}
INT8U sGetLcdBackLight(void)
{
return M_GET_LCD_LIGHT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -