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

📄 osd.c

📁 NT68617源程序代码集合
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		tmpData = val % 10;
		tmpData = tmpData / 2;
		buf[i++] = ICON_ROLL_EMPTY + tmpData;
	}

	if(i <= 10)	
	{
		for(; i<11; i++)	buf[i] = ICON_ROLL_EMPTY;
	}
	buf[11] = ICON_ROLL_R;
	OsdAttrib(OSD_2BITFONT, PALETTE_VALSCROLL);
	OsdShowStr(x, y, buf, 12);

	OsdAttrib(OSD_2BITFONT, tmpColor);
	OsdShowStr(x, y, buf, 1);

	buf[0] = ICON_ROLL_R;
	OsdShowStr(x+11, y, buf, 1);

	if(Flg_ParAdj)	tmpColor = PALETTE_VALSCL_BLANK_SEL;
	else			tmpColor = PALETTE_VALSCL_BLANK;
	OsdAttrib(OSD_2BITFONT, tmpColor);
	OsdShowRollFrame(x, y);
}
#endif


/*
********************************************************************************
* 	函 数 名: OsdShowScroll
* 	功能描述: 在指定的位置显示滚动条
* 	输    入: x			: 水平起始位置,单位字符
*             y			: 垂直起始位置,单位字符
*             val		: 要显示的百分数
*             len       : 滚动条的有效长度,不含其它的修饰符,最长不能大于16
* 	返    回: 无
*   注    意: 显示的颜色和属性需要预先通过OsdAttrib进行定义
********************************************************************************
*/
#define ICON_BARD0		0x0C		// 滚动条数据0,相当于空白
#define ICON_BARD1		0x0D		// 滚动条数据1
#define ICON_BARD2		0x0E		// 滚动条数据2
#define ICON_BARD3		0x0F		// 滚动条数据3
#define ICON_BARD4		0x10		// 滚动条数据4,相当于全满
void OsdShowScroll(uint8 x, uint8 y, uint8 val, uint8 len)
{

	uint8 xdata buf[25];
	uint8 i,k;
	uint16 xdata Va,KK;

	for (i = 0; i< len; i++)  buf[i] = ICON_BARD0;

	KK = 10000 / len;
	Va = val * 100;
	
	k = Va / KK;
	for (i = 0; i< k; i++)  buf[i] = ICON_BARD4;
	
	if (k < len)  {
		k = ((uint16)(Va % KK) * 4)/KK;
		switch (k)  {
			case 1:
				buf[i] = ICON_BARD1;
				break;

			case 2:
				buf[i] = ICON_BARD2;
				break;

			case 3:
				buf[i] = ICON_BARD3;
				break;

			}
		}
	
	OsdShowStr(x, y, buf, len);
}


#if 0
#if EN_DOUBLE_FONT		// 提示信息放大处理
#if PanelWidth <= (OSD_FRAME_WIDTH * OSD_FONT_WIDTH * 2)
#define RIGHT_OSD_HPOS		0
#else
#define RIGHT_OSD_HPOS		(PanelWidth - OSD_FRAME_WIDTH * OSD_FONT_WIDTH * 2)
#endif

#else
#if PanelWidth <= (OSD_FRAME_WIDTH * OSD_FONT_WIDTH)
#define RIGHT_OSD_HPOS		0
#else
#define RIGHT_OSD_HPOS		(PanelWidth - OSD_FRAME_WIDTH * OSD_FONT_WIDTH)
#endif
#endif
/*
*********************************************************************************
* 	函 数 名: OsdSetDispRTD
* 	功能描述: 设置OSD窗口位于右上角,并打开显示
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void OsdSetDispRTD(void)
{
	OsdClear();
#if EN_DOUBLE_FONT
	OsdZoom(1, 1);
#endif
	OsdHpos(RIGHT_OSD_HPOS);
	OsdVpos(0);
	OsdEnable();
}
#endif


#if EN_DOUBLE_FONT		// 提示信息放大处理
#if PanelWidth <= (OSD_FRAME_WIDTH * OSD_FONT_WIDTH * 2)
#define SM_OSDHPOS		0
#else
#define SM_OSDHPOS		(PanelWidth - OSD_FRAME_WIDTH * OSD_FONT_WIDTH * 2)/2
#endif

#if PanelHeight <= (OSD_FRAME_HEIGHT * OSD_FONT_HEIGHT * 2)
#define SM_OSDVPOS		0
#else
#define SM_OSDVPOS		(PanelHeight - OSD_FRAME_HEIGHT * OSD_FONT_HEIGHT * 2)
#endif

#else
#if PanelWidth <= (OSD_FRAME_WIDTH * OSD_FONT_WIDTH)
#define SM_OSDHPOS		0
#else
#define SM_OSDHPOS		(PanelWidth - OSD_FRAME_WIDTH * OSD_FONT_WIDTH)/2
#endif

#if PanelHeight <= (OSD_FRAME_HEIGHT * OSD_FONT_HEIGHT)
#define SM_OSDVPOS		0
#else
#define SM_OSDVPOS		(PanelHeight - OSD_FRAME_HEIGHT * OSD_FONT_HEIGHT)
#endif

#endif
/*
*********************************************************************************
* 	函 数 名: OsdSetDispCBD
* 	功能描述: 设置OSD窗口位于底部中间的位置
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void OsdSetDispCBD(void)
{
	OsdClear();
#if EN_DOUBLE_FONT
	OsdZoom(1, 1);
#endif
	OsdHpos(SM_OSDHPOS);
	OsdVpos(SM_OSDVPOS);
	OsdEnable();
}


/*
*********************************************************************************
* 	函 数 名: OsdZoom
* 	功能描述: 设置OSD显示的放大倍数, 该函数设置之后对整个OSD帧都起作用
* 	输    入: H_Zoom	: 水平放大倍数, 0-3的值依次表示1-4倍
*             V_Zoom	: 垂直放大倍数, 0-3的值依次表示1-4倍
* 	返    回: 无
********************************************************************************
*/
void OsdZoom(uint8 H_Zoom, uint8 V_Zoom)
{
	uint8 val;

	val = (V_Zoom << 6) + (H_Zoom << 4);
	WrScalarRegBit(rP095, val, 0xF0);
}


/*
*********************************************************************************
* 	函 数 名: OsdRowZoom
* 	功能描述: 设置一个字符行的水平和垂直放大倍数
* 	输    入: row	: 0-31, 表示允许该行的放大
*                   : 128-159, 表示禁止该行的放大
*                   : 0x7F, 表示允许所有行放大
*                   : 0xFF, 表示禁止所有行放大
*             zoom	: 水平和垂直的放大倍数,0-3的数字对应1-4的放大倍数
* 	返    回: 无
********************************************************************************
*/
void OsdRowZoom(uint8 row, uint8 zoom)
{
	uint8 i, val;

	zoom = (zoom & 0x03) + ((zoom << 2) & 0x0C);
	WrScalarReg(rP09E, zoom);
	
	//	设置所有行都有放大效果
	if (row == 0x7F)  {
		for (i = 0; i< 4; i++)  {
			WrScalarReg(rP096 + i, 0xFF);
			WrScalarReg(rP09A + i, 0xFF);
			}
		}

	//	清除所用行的放大效果
	else if (row == 0xFF)  {
		for (i = 0; i< 4; i++)  {
			WrScalarReg(rP096 + i, 0x00);
			WrScalarReg(rP09A + i, 0x00);
			}
		}

	//	根据row的指定,设置或者清除对应行的放大效果
	else  {
		i = row;
		row &= 0x7F;
		val = (1<<(row%8));
		if (i & 0x80)  {		// 清楚放大效果
			WrScalarRegBit(rP096 + (row / 8), 0x00, val);
			WrScalarRegBit(rP09A + (row / 8), 0x00, val);
			}
		else  {					// 设置放大效果
			WrScalarRegBit(rP096 + (row / 8), val, val);
			WrScalarRegBit(rP09A + (row / 8), val, val);
			}
		}
}


/*
*********************************************************************************
* 	函 数 名: OsdBorder
* 	功能描述: 设置OSD字符的的镶边效果, 设置的单位是以一行为单位
* 	输    入: row	: 0-31, 表示设置该行为镶边效果
*                   : 128-159, 表示取消该行的镶边效果
*                   : 0x7F, 表示设置所用行为镶边效果
*                   : 0xFF, 表示取消所用行的镶边效果
*             color	: 镶边的颜色
* 	返    回: 无
********************************************************************************
*/
void OsdBorder(uint8 row, uint8 color)
{
	uint8 i, TmpColor, val;

	color &= 0x0F;

	//	设置所有行均为镶边效果
	if (row == 0x7F)  {
		for (i = 0; i< 4; i++)  WrScalarReg(rP0B4 + i, 0xFF);
		TmpColor = (color<<4) + color;
		for (i = 0; i < 16; i++) WrScalarReg(rP0B8 + i, TmpColor);
		}

	//	清除所用行的镶边效果
	else if (row == 0xFF)  {
		for (i = 0; i< 4; i++)  WrScalarReg(rP0B4 + i, 0x00);
		}

	//	根据row的指定,设置或者清除对应行的镶边效果
	else  {
		i = row;
		row &= 0x7F;
		val = (1<<(row%8));
		if (i & 0x80)  {		// 清楚镶边效果
			WrScalarRegBit(rP0B4 + (row / 8), 0x00, val);
			}
		else  {					// 设置镶边效果
			WrScalarRegBit(rP0B4 + (row / 8), val, val);
			if (row % 2)  WrScalarRegBit(rP0B8 + (row / 2), color << 4, 0xF0);
			else  WrScalarRegBit(rP0B8 + (row / 2), color, 0x0F);
			}
		}
}


/*
*********************************************************************************
* 	函 数 名: OsdShadow
* 	功能描述: 设置OSD字符的的阴影效果, 设置的单位是以一行为单位
* 	输    入: row	: 0-31, 表示设置该行为阴影效果
*                   : 128-159, 表示取消该行的阴影效果
*                   : 0x7F, 表示设置所用行为阴影效果
*                   : 0xFF, 表示取消所用行的阴影效果
*             color	: 阴影的颜色
* 	返    回: 无
********************************************************************************
*/
void OsdShadow(uint8 row, uint8 color)
{
	uint8 i, TmpColor, val;

	color &= 0x0F;

	//	设置所有行均为阴影效果
	if (row == 0x7F)  {
		for (i = 0; i< 4; i++)  WrScalarReg(rP0B0 + i, 0xFF);
		TmpColor = (color<<4) + color;
		for (i = 0; i < 16; i++) WrScalarReg(rP0B8 + i, TmpColor);
		}

	//	清除所用行的阴影效果
	else if (row == 0xFF)  {
		for (i = 0; i< 4; i++)  WrScalarReg(rP0B0 + i, 0x00);
		}

	//	根据row的指定,设置或者清除对应行的阴影效果
	else  {
		i = row;
		row &= 0x7F;
		val = (1<<(row%8));
		if (i & 0x80)  {		// 清楚阴影效果
			WrScalarRegBit(rP0B0 + (row / 8), 0x00, val);
			}
		else  {					// 设置阴影效果
			WrScalarRegBit(rP0B0 + (row / 8), val, val);
			if (row % 2)  WrScalarRegBit(rP0B8 + (row / 2), color << 4, 0xF0);
			else  WrScalarRegBit(rP0B8 + (row / 2), color, 0x0F);
			}
		}
}


uint8 Alignment;
uint8 StringWidth;
uint8 FontLength;
uint8 FontIndex;
uint16 xdata FontBuf[18];
uint16 code * xdata FontArrayPtr;

#if EN_ACEROSD
uint8 xdata FontIndexBackup[10];		//用于备份每个选项字体索引 08-04-21
#endif

void OsdFontIndexReset(void)
{
	FontIndex = Osd1bFC_Common;
}


void WriteFontChar(void)
{
	uint8 i,ch;
	uint8 xdata *Pbus;

	XFR_PAGE = 0x00;
	Pbus = 0x80E0;
	*Pbus++ = PORT_OSD_1BF;
	*Pbus++ = FontIndex;
	*Pbus++ = FontIndex >> 8;
	for(i = 0; i < 18; i++)
	{
		FontBuf[i] >>= 4;
		*Pbus = FontBuf[i];	// 1'st byte
		ch = (FontBuf[i]>>8) & 0x0F;
		i++;
		ch |= (FontBuf[i] & 0xF0);
		*Pbus = ch;			// 2'nd byte
		ch = (FontBuf[i]>>8) & 0xFF;
		*Pbus = ch;			// 3 'th byte
	}
	FontIndex++;
	FontLength++;
}


void OsdSpecPrint(uint8 x, uint8 y, uint8 *Str)
{
	uint8 i, StrLen, WD_Point, val, Row, width;
	uint16 FontsWidth;
	uint8 xdata DispStr[64];
	uint16 code *Ptr;
	
	FontLength = 0;
	StrLen = (*Str) + 1;
	FontsWidth = 0;

	//	计算输出字符串的长度,单位是像素
	for (i = 1; i < StrLen; i++)  {
		val = *(Str + i);							// 获取字库的索引值
		//if (val & 0x80) val = 16;					// 亚洲字体的宽度都默认为16
		if (val & 0x80) {
			val -= 0x80;
			val = FontArrayPtr[val * 18];	// 从字库每一项的第1个字取
			}
		else val = Osd1bitFont_ASCII[val * 18];		// 英文字符的宽度从字库每一项的第1个字取
		FontsWidth += val;
		}

	WD_Point = 0;
	if(Alignment == RIGHT) {	// Right
		FontsWidth = StringWidth * 12 - FontsWidth;
		WD_Point = FontsWidth % 12;
		}
	else if(Alignment == CENTER){	// Center
		FontsWidth = StringWidth * 12 - FontsWidth;
		val = FontsWidth / 12;
		WD_Point = FontsWidth % 12;
		if((val & BIT_0) != 0) WD_Point += 12;
		WD_Point >>= 1;
		}

	//	清除缓冲区
	for(i = 0; i < 18; i++) FontBuf[i] = 0;

	for (i = 1; i < StrLen; i++) {
		val = *(Str + i);							// 获取字库的索引值
		if (val & 0x80) {
			val -= 0x80;
			//width = 16;					// 亚洲字体的宽度都默认为16
			Ptr = FontArrayPtr + (uint16)val * 18;
			width = *Ptr;
			}
		else {
			Ptr = Osd1bitFont_ASCII + (uint16)val * 18;
			width = *Ptr;
			}
		
		if(WD_Point == 0) {
			for(Row = 1; Row < 18; Row++) {
				FontBuf[Row] = *(Ptr + Row);
				}
			}
		
		else{
			for(Row = 1; Row <18; Row++) {
				FontBuf[Row] |= ((*(Ptr + Row)) >> WD_Point);
				}
			}
		
		WD_Point += width;
		do{
			if(WD_Point == 12) {
				WriteFontChar();
				WD_Point = 0;
				}
			else if(WD_Point > 12) {
				WriteFontChar();
				WD_Point -=12;
				val = width - WD_Point;
				for(Row = 1; Row < 18; Row ++) {
					FontBuf[Row] = (*(Ptr + Row)) << val;
					}
				}
		}while(WD_Point > 11);
	}

	if(WD_Point != 0) {
		WriteFontChar();
		WD_Point = 0;
		}

	if (StringWidth < FontLength) FontLength = StringWidth;
	val = 0;
	if(Alignment == RIGHT){		//Right
		val = StringWidth - FontLength;
		}
	else if(Alignment == CENTER){		//Center
		val = ((StringWidth - FontLength) >> 1);
		}
	WD_Point = 0;
	width = FontIndex - FontLength;
	i = val;
	for (i = 0; i < val; i++) DispStr[WD_Point++] = 0x00;
	for (i = 0; i < FontLength; i++) DispStr[WD_Point++] = width + i;
	for (i = val + FontLength; i < StringWidth; i++) DispStr[WD_Point++] = 0x00;
	WrScalarPort(PORT_OSD_HCRA, (uint16)y * OsdFrameWidth + x, DispStr, StringWidth);
}
/*
********************************************************************************
*                                文 件 结 束                                   *
********************************************************************************
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -