📄 display.c
字号:
case 0x01: maskcode = 0x40;Lrotate = 6; break;
case 0x02: maskcode = 0x20;Lrotate = 5; break;
case 0x03: maskcode = 0x10;Lrotate = 4; break;
case 0x04: maskcode = 0x08;Lrotate = 3; break;
case 0x05: maskcode = 0x04;Lrotate = 2; break;
case 0x06: maskcode = 0x02;Lrotate = 1; break;
case 0x07: maskcode = 0x01;Lrotate = 0; break;
default:
Lrotate = 0;
}
for(loop = 0; loop < width; loop++)
{
result = getData(GBASE + GCOLUMNS * (127 - x - loop) + y / 8);
switch((INT8U)(loop%8))
{
case 0x00: bit = 0x80; Rrotate = 7;break;
case 0x01: bit = 0x40; Rrotate = 6;break;
case 0x02: bit = 0x20; Rrotate = 5;break;
case 0x03: bit = 0x10; Rrotate = 4;break;
case 0x04: bit = 0x08; Rrotate = 3;break;
case 0x05: bit = 0x04; Rrotate = 2;break;
case 0x06: bit = 0x02; Rrotate = 1;break;
case 0x07: bit = 0x01; Rrotate = 0;break;
default:
bit = 0xFF;
}
if((((data&bit)>>Rrotate)<<Lrotate) == 0)
{
result = result&((~maskcode)|(((data&bit)>>Rrotate)<<Lrotate));
}
else
{
result = result|(((data&bit)>>Rrotate)<<Lrotate);
}
setAddressPointer(GBASE + GCOLUMNS * (127 - x - loop) + y / 8);
writeCommand(0xB0);
writeData(result);
writeCommand(0xB2);
}
return;
}
/*
**************************************************************************************************************
* 功能描述: 该函数用来得到字节的掩码;
* 这里的字节掩码这样定义:start(包括start)和end(包括end)之间的位
* 为0,其它位都为1;假设start为6,end为1,则字节的掩码为
* (10000001);
* 参数: start代表0的起始位,取值范围为0 -> 7;
* end代表0的终止位,取值范围为0 -> 7;
* 返回值: 返回值为字节的掩码;
**************************************************************************************************************
*/
INT8U getMaskCode(INT8U start, INT8U end)
{
switch(start) // 得到字节掩码的起始部分;
{
case 0x00: start = 0xFE; break;
case 0x01: start = 0xFC; break;
case 0x02: start = 0xF8; break;
case 0x03: start = 0xF0; break;
case 0x04: start = 0xE0; break;
case 0x05: start = 0xC0; break;
case 0x06: start = 0x80; break;
case 0x07: start = 0x00; break;
default: start = 0xFF;
}
switch(end) // 得到字节掩码的终止部分;
{
case 0x00: end = 0x00; break;
case 0x01: end = 0x01; break;
case 0x02: end = 0x03; break;
case 0x03: end = 0x07; break;
case 0x04: end = 0x0F; break;
case 0x05: end = 0x1F; break;
case 0x06: end = 0x3F; break;
case 0x07: end = 0x7F; break;
default: end = 0xFF;
}
return(start|end); // 返回字节的掩码;
}
/*
**************************************************************************************************************
* 功能描述: 该函数用来在液晶上显示高度为height的图形,内容由参数data指定,
* 显示图形的起始位置由(x bit, y bit)指定;注意图形的高度不能超过
* 8;
* 参数: x代表显示位置的横坐标,其取值范围为0 -> 127;
* y代表显示位置的纵坐标,其取值范围为0 -> 159;
* height为图形显示的高度,其取值范围为1 ->8;
* data代表要显示图形的内容;
* 返回值: 假设函数能够被成功的调用,没有返回值;
**************************************************************************************************************
*/
void print(INT8U x, INT8U y, INT8U height, INT8U data)
{
INT8U startbyte,endbyte;
INT8U startbit,endbit;
INT8U resulthigh, resultlow;
INT8U a = 0,b = 0,c = 0;
startbyte = y / 8;
endbyte = (y + height - 1) / 8;
startbit = 7 - (y % 8);
endbit = 7 - (( y + height - 1) % 8);
if(startbyte == endbyte)
{
if(startbit >= endbit)
{
// resulthigh = getData(GBASE + GCOLUMNS * ( 127 - x) + startbyte)
// &getMaskCode(startbit, endbit) // first & second |?
// |((data >>(7 - startbit + endbit)) << endbit);
a = getData(GBASE + GCOLUMNS * ( 127 - x) + startbyte);
b = getMaskCode(startbit, endbit);
c = ((data >>(7 - startbit + endbit)) << endbit);
resulthigh = a&b|c;
setAddressPointer(GBASE + GCOLUMNS * ( 127 - x) + startbyte);
writeCommand(0xB0);
writeData(resulthigh);
writeCommand(0xB2);
}
}
if(startbyte != endbyte)
{
if((9 + startbit -endbit) <= 8)
{
resulthigh = getData(GBASE + GCOLUMNS * ( 127 - x) + startbyte)
&getMaskCode(startbit,0)
|(data >> (7 - startbit));
resultlow = getData(GBASE + GCOLUMNS * ( 127 - x) + endbyte)
&getMaskCode(7, endbit)
|((data >> (endbit - startbit -1)) << endbit);
setAddressPointer(GBASE + GCOLUMNS * ( 127 - x) + startbyte);
writeCommand(0xB0);
writeData(resulthigh);
writeData(resultlow);
writeCommand(0xB2);
}
}
}
/*
**************************************************************************************************************
* 功能描述: 该函数用来在液晶上指定的位置(x bit, y bit)显示给定的字符串
* (pstring),字符的显示属性由参数charwidth, charheight,
* displaymode决定,charwidth用来决定字符所占的宽度(这里的字符以
* ASCII字符为准,尽管汉字字符是ASCII字符宽度的两倍,调用该函数时
* 仍然使用ASCII字符的宽度),charheight用来指定字符的高度,
* displaymode用来决定显示的样式,如果该值为DISPREVERSE,则字符
* 进行反色显示;
* 注意:当显示位置加上字符串显示所占宽度超过128时,字符串将自动
* 裁剪;
* 参数: x代表显示字符起始位置的横坐标,取值范围为0 -> 127;
* y代表显示字符起始位置的纵坐标,取值范围为0 -> 159;
* charwidth代表显示字符的单个字符的宽度(以点数度量);
* charheight代表显示字符的单个字符的高度(以点数度量);
* displaymode代表显示字符显示时的样式,如果取DISPREVERSE,则
* 字符进行反色显示;
* pstring指向被显示字符串的指针;
* fillbuffer指示是否将数据pstring写入缓冲区还是写入液晶,如果为
* TRUE,则写入缓冲区;如果为FALSE,则写入液晶。当写入缓冲区
* 时,需要调用flushBuffer()函数将缓冲区的内容flush到液晶里。
* 返回值: 假设函数能够被成功的调用,没有返回值;
**************************************************************************************************************
*/
void printString(INT8U x, INT8U y, INT8U charwidth, INT8U charheight, INT8U displaymode,
INT8U *pstring, BOOLEAN fillbuffer)
{
INT8U screenx;
INT8U *pchar;
INT8U loop;
INT16U charindex;
INT16U charcode;
INT16U value;
INT8U heightloop;
INT8U charmodeindex;
for(pchar = pstring, screenx = x; *pchar != '\0'; pchar++)
{
charmodeindex = 0;
if(*pchar < 0x80) // 该字符为ASCII字符;
{
charcode = *pchar;
charindex = getCharIndex(charcode);
if(charindex != 0xFFFF)
{
for(loop = 0; loop < charwidth; loop++, screenx++)
{
for(heightloop = 0; heightloop < (charheight / 8); heightloop++)
{
charmodeindex++;
if(displaymode == DISPREVERSE)
{
value = ~CharMode[charindex][charmodeindex];
}
else
{
value = CharMode[charindex][charmodeindex];
}
if(fillbuffer == TRUE)
{
PRINT(screenx, y + heightloop * 8, 8, value);
}
else
{
print(screenx, y + heightloop * 8, 8, value);
}
}
if((charheight % 8) != 0)
{
charmodeindex++;
if(displaymode == DISPREVERSE)
{
value = ~CharMode[charindex][charmodeindex];
}
else
{
value = CharMode[charindex][charmodeindex];
}
if(fillbuffer == TRUE)
{
PRINT(screenx, y + heightloop * 8, charheight % 8, value);
}
else
{
print(screenx, y + heightloop * 8, charheight % 8, value);
}
}
}
}
}
else
{
charcode = *pchar; // 该字符为汉字;
charcode = charcode << 8;
charcode += *(++pchar);
charindex = getCharIndex(charcode);
if(charindex != 0xFFFF)
{
charmodeindex++;
for(loop = 0; loop < charwidth * 2; loop++, screenx++)
{
for(heightloop = 0; heightloop < (charheight / 8); heightloop++)
{
charmodeindex++;
if(displaymode == DISPREVERSE)
{
value = ~CharMode[charindex][charmodeindex];
}
else
{
value = CharMode[charindex][charmodeindex];
}
if(fillbuffer == TRUE)
{
PRINT(screenx, y + heightloop * 8, 8, value);
}
else
{
print(screenx, y + heightloop * 8, 8, value);
}
}
if((charheight % 8) != 0)
{
charmodeindex++;
if(displaymode == DISPREVERSE)
{
value = ~CharMode[charindex][charmodeindex];
}
else
{
value = CharMode[charindex][charmodeindex];
}
if(fillbuffer ==TRUE)
{
PRINT(screenx, y + heightloop * 8, charheight % 8, value);
}
else
{
print(screenx, y + heightloop * 8, charheight % 8, value);
}
}
}
}
}
}
}
/*
**************************************************************************************************************
* 功能描述: 该函数用来将显示缓冲区DisplayBuffer的内容flush到液晶里。调用结束
* 后,显示缓冲区的内容都为0x00。
* 参数: 没有。
* 返回值: 假设函数能够被成功的调用,没有返回值;
**************************************************************************************************************
*/
void flushBuffer(void) // added on 2004/4/26;
{
INT8U x,y;
setAddressPointer(GBASE);
writeCommand(0xB0);
for( x = 0; x < 128; x++)
{
for(y = 0; y < 20; y++)
{
writeData(DisplayBuffer[x][y]);
DisplayBuffer[x][y] = 0x00;
}
}
writeCommand(0xB2);
return;
}
/*
**************************************************************************************************************
* 功能描述: 该函数用来将数据data写入到显示缓冲区DisplayBuffer里,位置由参数
* (x bit, y bit)指定,数据的有效高度由参数height指定。
* 注意,height的只值不能够大于8。
* 参数: x数据显示位置起始坐标的横坐标,取值范围0->127;
* y数据显示位置起始坐标的纵坐标,取值范围0->159;
* height数据的有效高度,取值范围1->8;
* data需要显示的数据;
* 返回值: 假设函数能够被成功的调用,没有返回值;
**************************************************************************************************************
*/
void PRINT(INT8U x, INT8U y, INT8U height, INT8U data) // added on 2004/4/26;
{
INT8U startbyte,endbyte;
INT8U startbit,endbit;
INT8U resulthigh, resultlow;
startbyte = y / 8;
endbyte = (y + height - 1) / 8;
startbit = 7 - (y % 8);
endbit = 7 - (( y + height - 1) % 8);
if(startbyte == endbyte)
{
if(startbit >= endbit)
{
resulthigh = DisplayBuffer[127 - x][startbyte]
&getMaskCode(startbit, endbit) // first & second |?
|((data >>(7 - startbit + endbit)) << endbit);
DisplayBuffer[127 - x][startbyte] = resulthigh;
}
}
if(startbyte != endbyte)
{
if((9 + startbit -endbit) <= 8)
{
resulthigh = DisplayBuffer[127 - x][startbyte]
&getMaskCode(startbit,0)
|(data >> (7 - startbit));
resultlow = DisplayBuffer[127 - x][endbyte]
&getMaskCode(7, endbit)
|((data >> (endbit - startbit -1)) << endbit);
DisplayBuffer[127 - x][startbyte] = resulthigh;
DisplayBuffer[127 - x][endbyte] = resultlow;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -