⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disp.c

📁 AT91fr40162的FLASH读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -