📄 disp.c
字号:
void DisplayRecoveryMessage(_BYTE cPage,_BYTE cRecovery)
{
_BYTE i,j;
for (i=0;i<2;i++)
for (j=0;j<VIDEOCOL;j++)
if (cRecovery)
gcpVideoBuf[cPage+i][j] = gcpTmpVideoBuf[i][j];
else
gcpTmpVideoBuf[i][j] = gcpVideoBuf[cPage+i][j];
DispRefresh(cPage,0,2,VIDEOCOL,1);
}
//=================================================================
// 清显示缓冲区指定的区域,将指定的区域全部清为0(不显示),其中:
// cPage:要求清除的页(0-7)
// cCol:要求清除的列(0-127)
// cWidth:为清除区域的宽度(列数);
// cHeight:为清除的长度(行数或页数);
//=================================================================
void DispClearVideoBuf(_BYTE cPage,_BYTE cCol,_BYTE cHeight,_BYTE cWidth)
{
_BYTE i,j;
for (i=cPage;i<cPage+cHeight;i++)
for (j=cCol;j<cCol+cWidth;j++)
gcpVideoBuf[i][j]=0;
}
//=================================================================
// 将cpText中指定的字符串写入到显示缓冲区中,其中:
// cPage:为显示的起始页(行);
// cCol:为显示的起始列;
// cLen:为显示内容的长度(字符数);
// cpText:为显示的内容(采用内部的字符编码);
// 函数的返回值:C_OK表示成功,C_NOTOK表示失败,如内容越界等。
// cWidth:返回显示内容实际占有的显示缓冲区的长度(列数),供刷新使用;
//=================================================================
_BYTE DispOutText(_BYTE cPage,_BYTE cCol,_BYTE cLen,_BYTE *cpText)
{
_BYTE i,j,cTmpPage,cTmpCol;
_BYTE cCurPage,cCurCol,cChar;
_WORD wFontOffset,wHZCode;
_BYTE bCharType;
cCurPage = cPage;
cCurCol = cCol;
i=0;
j=0;
while(i<cLen) {
bCharType=0;
cChar = *(cpText+j);
wHZCode = cChar;
if (cChar>=0x80) {
j++;
wHZCode = wHZCode << 8;
wHZCode += *(cpText+j);
bCharType=1;
}
wFontOffset = GetHZOffset(wHZCode); // 取汉字在字模中的偏移
if (bCharType==0) { // 英文字模
for (cTmpPage=0;cTmpPage<2;cTmpPage++) {
for (cTmpCol=0;cTmpCol<8;cTmpCol++) {
if ((cCurPage+cTmpPage>=VIDEOPAGE)||(cCurCol+cTmpCol>=VIDEOCOL))
return(C_NOTOK);
gcpVideoBuf[cCurPage+cTmpPage][cCurCol+cTmpCol]=gFontBuf[wFontOffset++];
}
}
cCurCol += 8;
}
else { // 中文字模
for (cTmpPage=0;cTmpPage<2;cTmpPage++) {
for (cTmpCol=0;cTmpCol<16;cTmpCol++) {
if ((cCurPage+cTmpPage>=VIDEOPAGE)||(cCurCol+cTmpCol>=VIDEOCOL))
return(C_NOTOK);
gcpVideoBuf[cCurPage+cTmpPage][cCurCol+cTmpCol]=gFontBuf[wFontOffset++];
}
}
cCurCol += 16;
}
i++;
j++;
}
return(C_OK);
}
//=================================================================
// 将cpImage中指定的图像写入到显示缓冲区中,其中:
// cPage:为显示的起始页(行);
// cCol:为显示的起始列;
// cWidth:为显示内容的长度(列数);
// cHeight:为显示内容的长度(行数或页数);
// cpImage:为实际要显示的内容;
// 函数的返回值:C_OK表示成功,C_NOTOK表示失败,如内容越界等。
//=================================================================
_BYTE DispOutImage(_BYTE cPage,_BYTE cCol,_BYTE cHeight,_BYTE cWidth,_BYTE *cpImage)
{
_BYTE i,j,k;
k=0;
for (i=cPage;i<cPage+cHeight;i++)
for (j=cCol;j<cCol+cWidth;j++) {
if ((i>=VIDEOPAGE)||(j>=VIDEOCOL)) return(C_NOTOK);
gcpVideoBuf[i][j] = cpImage[k++];
}
return(C_OK);
}
//=================================================================
// 将cpImage中指定的图像写入到显示缓冲区中,其中:
// cRow:为显示的起始行;
// cCol:为显示的起始列;
// cWidth:为显示内容的长度(列数);
// cHeight:为显示内容的长度(行数或页数);
// cpImage:为实际要显示的内容;
// 函数的返回值:C_OK表示成功,C_NOTOK表示失败,如内容越界等。
//=================================================================
_BYTE DispOutImageInRow(_BYTE cRow,_BYTE cCol,_BYTE cHeight,_BYTE cWidth,_BYTE *cpImage,_BYTE cReverse)
{
_WORD i,j,k;
_BYTE cMask,cByte1,cByte2;
_BYTE cStartPage,cPages,cPrefix,cPostfix;
k=0;
cPrefix = (8 - (cRow%8))%8; // 前缀的行数
cPostfix = (cHeight - cPrefix)%8; // 后缀的行数
// 填充前置内容(跨字节)
if ((cRow%8)!=0) {
cMask = 0x00;
//for (i=cPrefix;i<8;i++) cMask |= 0x80>>i ;
for (i=0;i<cPrefix;i++) cMask |= 0x01<<i ;
cStartPage = (cRow/8);
for (j=cCol;j<cCol+cWidth;j++) {
cByte1 = gcpVideoBuf[cStartPage][j]&(~cMask); // 保持原前面的内容
if (cReverse)
cByte2 = ((~cpImage[k++])>>(8-cPrefix))&cMask; // 保存刷新字节后面的内容
else
cByte2 = ((cpImage[k++])>>(8-cPrefix))&cMask; // 保存刷新字节后面的内容
gcpVideoBuf[cStartPage][j] = cByte1 | cByte2;
}
}
// 处理中间内容(不跨字节)
k=0;
cPages = (cHeight - cPrefix - cPostfix)/8; // 不跨字节部分的页数
cStartPage = (cRow + cPrefix)/8; // 不跨字节部分的起始页
for (i=cStartPage;i<cStartPage+cPages;i++) {
for (j=cCol;j<cCol+cWidth;j++) {
cByte1 = (cpImage[k]<<cPrefix);
cByte2 = (cpImage[k+cWidth]>>(8-cPrefix));
k++;
if (cReverse)
gcpVideoBuf[i][j] = ~(cByte1 | cByte2);
else
gcpVideoBuf[i][j] = (cByte1 | cByte2);
}
}
// 处理后置内容(跨字节)
if (cPostfix!=0) {
cStartPage += cPages;
cMask = 0;
for (i=0;i<cPostfix;i++) cMask |= 0x80>>i;
for (j=cCol;j<cCol+cWidth;j++) {
cByte1 = gcpVideoBuf[cStartPage][j]&(~cMask); // 保持原前面的内容
if (cReverse)
cByte2 = (~(cpImage[k++])<<cPrefix)&cMask; // 保存刷新字节后面的内容
else
cByte2 = ((cpImage[k++])<<cPrefix)&cMask; // 保存刷新字节后面的内容
gcpVideoBuf[cStartPage][j] = cByte1 | cByte2;
}
}
return(C_OK);
}
_BYTE DispRefreshInRow(_BYTE cRow,_BYTE cCol,_BYTE cHeight,_BYTE cWidth)
{
_BYTE cStartPage,cPages,cPrefix,cPostfix;
cPrefix = (8 - (cRow%8))%8; // 前缀的行数
cPostfix = (cHeight - cPrefix)%8; // 后缀的行数
cStartPage = (cRow/8);
cPages = (cHeight - cPrefix - cPostfix)/8; // 不跨字节部分的页数
if (cPrefix!=0) cPages++;
if (cPostfix!=0) cPages++;
DispRefresh(cStartPage,cCol,cPages,cWidth,1);
return(C_OK);
}
//=================================================================
// 将显示缓冲区指定区域的内容变反,其中:
// cPage:为显示的起始页(行);
// cCol:为显示的起始列;
// cWidth:为变反内容的长度(列数);
// cHeight:为变反内容的长度(行数或页数);
// 函数的返回值:C_OK表示成功,C_NOTOK表示失败,如内容越界等。
//=================================================================
_BYTE DispReverse(_BYTE cPage,_BYTE cCol,_BYTE cHeight,_BYTE cWidth)
{
_BYTE i,j;
for (i=cPage;i<cPage+cHeight;i++) {
for (j=cCol;j<cCol+cWidth;j++) {
if ((i>=VIDEOPAGE)||(j>=VIDEOCOL)) return(C_NOTOK);
gcpVideoBuf[i][j] = ~gcpVideoBuf[i][j];
}
}
DispRefresh(cPage,cCol,cHeight,cWidth,1);
return(C_OK);
}
//=================================================================
// 打开或关闭液晶显示,其中
// cMode=0(OFF),关闭
// cMode=1(ON),打开
//=================================================================
void DispOpen(_BYTE cMode)
{
if(cMode==OFF){
DispLCDWriteCommand(0xae);
}
else{
DispLCDWriteCommand(0xaf);
}
}
//=================================================================
// 打开或关闭液晶的背光,其中
// cMode=0(OFF),关闭
// cMode=1(ON),打开
// cTime:在点亮背光时有效,为背光持续的时间
//=================================================================
void DispBackLigth(_BYTE cMode,_BYTE cTime)
{
if(cMode==OFF){
gcpCPLDReg[3] &= ~1; pCPLD[6] = gcpCPLDReg[3];
}
else{
gcpCPLDReg[3] |= 1; pCPLD[6] = gcpCPLDReg[3];
gcBackLightTime = cTime;
}
}
//=================================================================
// 将显示缓冲区指定区域的内容写入液晶显示模块的缓冲区进行显示,其中:
// cPage:为显示的起始页(行);
// cCol:为显示的起始列;
// cWidth:为显示内容的长度(列数);
// cHeight:为显示内容的长度(行数或页数);
// cMode 0:反显;1:正常显示
//=================================================================
void DispRefresh(_BYTE cPage,_BYTE cCol,_BYTE cHeight,_BYTE cWidth,_BYTE cMode)
{
_BYTE i,j,x,y;
_BYTE cLine;
DispLCDWriteCommand(0x40);
y= cPage;
for(j=0;j<cHeight;j++) {
cLine=cCol&0xf0;
cLine=cLine>>4;
DispLCDWriteCommand(cLine+0x10);
DispLCDWriteCommand((cCol)&0x0f);
DispLCDWriteCommand(0xb0+cPage);
x= cCol;
for(i=0;i<cWidth;i++){
if(cMode==0)
DispLCDWriteData(DispReverseByte(~gcpVideoBuf[y][x]));
else
DispLCDWriteData(DispReverseByte(gcpVideoBuf[y][x]));
x++;
}
cPage++;
y++;
}
DispLCDWriteCommand(0xaf);
}
_BYTE DispReverseByte(_BYTE cByte)
{
_BYTE i;
_BYTE cByte1,cByte2,cMode1,cMode2;
cByte1 = cByte;
cMode1 = 0x01;
cByte2 = 0x00;
cMode2 = 0x80;
for (i=0;i<8;i++) {
if (cByte1&cMode1) {
cByte2 |= cMode2;
}
cMode1 <<= 1;
cMode2 >>= 1;
}
return(cByte2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -