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

📄 display.c

📁 uCOSII在motorala单片机上的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -