📄 osd.c
字号:
********************************************************************************
*/
void OsdWinGradient(uint8 win, uint8 Ctrl1, uint8 Ctrl2)
{
WrScalarRegBit(rP0A5, win, B0000_0111);
WrScalarReg(rP0A3, Ctrl1);
WrScalarReg(rP0A4, Ctrl2);
}
#endif
/*
********************************************************************************
* 函 数 名: OsdLoadBlankFont
* 功能描述: 载入空白字符的字库
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void OsdLoadBlankFont(void)
{
WrScalarPort(PORT_OSD_1BF, 0x00, Osd1bitFont_Common, 27);
}
/*
********************************************************************************
* 函 数 名: OsdAttrib
* 功能描述: 设置OSD显示的属性,因此在调用OSD的字符及字符串显示时,要先调用这个
* 函数设置显示的属性
* 输 入: Attrib : 属性字节,其意义如下
* : [7-4] 背景颜色
* : [3-2] 选择字形类别
* 00 单色字符,索引为:0-255
* 01 单色字符,索引为:256-511
* 10 四色字符
* 11 16色字符
* color : 字符的颜色
* 返 回: 无
********************************************************************************
*/
void OsdAttrib(uint8 Attrib, uint8 color)
{
WrScalarReg(rP0CC, Attrib);
Attrib &= 0x0C;
if (Attrib == OSD_2BITFONT || Attrib == OSD_4BITFONT)
WrScalarReg(rP0CD, color);
else
WrScalarReg(rP0CD, color - 1);
}
/*
********************************************************************************
* 函 数 名: OsdShowStr
* 功能描述: 在指定位置显示字符串
* 输 入: x : 水平位置
* y : 垂直位置
* str : 字符指针
* num : 字符串的字符数
* 返 回: 无
* 注 意: 字符显示的颜色和属性在OsdColor,OsdAttr中定义
********************************************************************************
*/
void OsdShowStr(uint8 x, uint8 y, uint8 *str, uint16 num)
{
WrScalarPort(PORT_OSD_HCRA, (uint16)y * OsdFrameWidth + x, str, num);
}
/*
********************************************************************************
* 函 数 名: OsdShowChar
* 功能描述: 在指定位置显示字符
* 输 入: x : 水平位置
* y : 垂直位置
* c : 要显示的字符
* 返 回: 无
* 注 意: 字符显示的颜色和属性在OsdColor,OsdAttr中定义,因此要预先定义字符
* 的显示属性
********************************************************************************
*/
void OsdShowChar(uint8 x, uint8 y, uint8 c)
{
WrScalarPort(PORT_OSD_HCRA, (uint16)y * OsdFrameWidth + x, &c, 1);
}
#if EN_ACEROSD
void OsdShowIconFrame(uint8 x, uint8 y, uint8 Icon)
{
uint8 i, buf[1];
buf[0] = Icon;
OsdShowStr(x, y, buf, 1); //LEFT TOP ICON
buf[0] = Icon + 1;
for(i=0; i<4; i++) OsdShowStr(x+1+i, y, buf, 1); //MID-TOP ICON * 4
buf[0] = Icon + 2;
OsdShowStr(x+5, y, buf, 1); //RIGHT-TOP ICON
buf[0] = Icon + 3;
for(i=0; i<2; i++) OsdShowStr(x, y+1+i, buf, 1); //LEFT MID ICON * 2
buf[0] = Icon + 4;
for(i=0; i<2; i++) OsdShowStr(x+5, y+1+i, buf, 1); //RIGHT MID ICON * 2
buf[0] = Icon + 5;
OsdShowStr(x, y+3, buf, 1); //LEFT BOTTOM ICON
buf[0] = Icon + 6;
for(i=0; i<4; i++) OsdShowStr(x+1+i, y+3, buf, 1); //MID BOTTOM ICON * 4
buf[0] = Icon + 7;
OsdShowStr(x+5, y+3, buf, 1); //RIGHT BOTTOM ICON
}
#endif
void OsdShowIcon(uint8 x, uint8 y, uint8 Icon)
{
#if EN_ACEROSD
uint8 buf[4];
buf[0] = Icon; buf[1] = Icon + 1; buf[2] = Icon + 2;
buf[3] = Icon + 3; //buf[4] = Icon + 4; buf[5] = Icon + 5;
OsdShowStr(x, y, buf, 3);
buf[0] = Icon + 3; //buf[4] = Icon + 4; buf[5] = Icon + 5;
OsdShowStr(x+3, y, buf, 1);
buf[0] = Icon + 4; buf[1] = Icon + 5; buf[2] = Icon + 6;
buf[3] = Icon + 7; //buf[4] = Icon + 10; buf[5] = Icon + 11;
OsdShowStr(x, y + 1, buf, 4);
#else
uint8 buf[3];
Icon = Icon * 6;
buf[0] = Icon; buf[1] = Icon + 1; buf[2] = Icon + 2;
OsdShowStr(x, y, buf, 3);
buf[0] = Icon + 3; buf[1] = Icon + 4; buf[2] = Icon + 5;
OsdShowStr(x, y + 1, buf, 3);
#endif
}
#if EN_ACEROSD
void OsdShowSubFrame(uint8 x, uint8 y, uint8 Icon)
{
uint8 i,buf[1];
for(i=0; i<3; i++)
{
buf[0] = Icon++;
OsdShowStr(x, y-1+i, buf, 1);
}
for(i=0; i<3; i++)
{
buf[0] = Icon++;
OsdShowStr(SubMenuWin.He, y-1+i, buf, 1);
}
buf[0] = Icon++;
for(i=x+1; i<VALROLL_POSX+1; i++) OsdShowStr(i, y-1, buf, 1);
for(i=VALROLL_POSX+11; i<SubMenuWin.He; i++) OsdShowStr(i, y-1, buf, 1);
// for(i=x+1; i<SubMenuWin.He; i++) OsdShowStr(i, y-1, buf, 1);
buf[0] = Icon++;
for(i=x+1; i<VALROLL_POSX+1; i++) OsdShowStr(i, y+1, buf, 1);
for(i=VALROLL_POSX+11; i<SubMenuWin.He; i++) OsdShowStr(i, y+1, buf, 1);
}
void OsdCancelSubFrame(void)
{
OsdAttrib(OSD_2BITFONT, PALETTE_SUBSCROLL_NONE);
OsdShowSubFrame(SubMenuWin.Hs, SubMenuCursor * 2 + SubMenuWin.Vs + 3, ICON_SUBFRAME);
OsdShowRollFrame(VALROLL_POSX, SubMenuCursor * 2 + SubMenuWin.Vs + 3);
}
#endif
/*
*********************************************************************************
* 函 数 名: OsdCursor
* 功能描述: 在指定位置,以指定的颜色显示光标
* 输 入: Pos : 光标位置
* color : 光标颜色
* 返 回: 无
********************************************************************************
*/
void OsdCursor(uint8 Pos, uint8 color)
{
#if EN_ACEROSD
OSDWIN xdata curwin;
// 禁止光标显示
OsdDisWindow(WIN3);
curwin.No = WIN3;
#if 0
curwin.Hs = 6;
curwin.He = OSD_FRAME_WIDTH - 1;
curwin.Vs = Pos - 1;
curwin.Ve = Pos + 1;
#else
curwin.Hs = 7;
curwin.He = OSD_FRAME_WIDTH - 2;
curwin.Vs = Pos;
curwin.Ve = Pos;
#endif
curwin.Attr = 0;//WIN_EN_BEVEL + WIN_BL_TYPE2;
curwin.BL_LCL = color;
curwin.BL_RCL = color;
curwin.BL_Width = 0x00;
curwin.Color = color;
if(Flg_ParAdj)
{
OsdSetWin(&curwin);
OsdAttrib(OSD_2BITFONT, PALETTE_SUBFRAME_SEL);
OsdShowSubFrame(curwin.Hs-1, curwin.Vs, ICON_SUBFRAME);
OsdAttrib(OSD_2BITFONT, PALETTE_VALSCL_BLANK_SEL);
OsdShowRollFrame(VALROLL_POSX, curwin.Vs);
}
else
{
OsdAttrib(OSD_2BITFONT, PALETTE_SUBFRAME);
OsdShowSubFrame(curwin.Hs-1, curwin.Vs, ICON_SUBFRAME);
OsdAttrib(OSD_2BITFONT, PALETTE_VALSCL_BLANK);
OsdShowRollFrame(VALROLL_POSX, curwin.Vs);
}
#else
OSDWIN xdata curwin;
// 禁止光标显示
OsdDisWindow(WIN1);
curwin.No = WIN1;
curwin.Hs = 2;
curwin.He = OSD_FRAME_WIDTH - 3;
curwin.Vs = Pos;
curwin.Ve = Pos;
curwin.Attr = WIN_EN_BEVEL + WIN_BL_TYPE2;
curwin.BL_LCL = WHITE;
curwin.BL_RCL = DARKGRAY;
curwin.BL_Width = 0x00;
curwin.Color = color;
OsdSetWin(&curwin);
#endif
}
/*
*********************************************************************************
* 函 数 名: OsdDisCursor
* 功能描述: 禁止光标显示
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void OsdDisCursor(void)
{
OsdDisWindow(WIN3);
}
/*
*********************************************************************************
* 函 数 名: OsdKeyCancelCursor
* 功能描述: 取消主光标显示
* 输 入: 无
* 返 回: 无 //chen 08-04-16
********************************************************************************
*/
#if EN_ACEROSD
void OsdKeyCancelCursor(void)
{
#if USE_AUDIO
OsdAttrib(OSD_2BITFONT, VgaKeyItem[KeyMenuCursor][0][0]);
OsdShowIcon(1, SubMenuWin.Vs + 1 + KeyMenuCursor * 4, VgaKeyItem[KeyMenuCursor][0][1]);
OsdAttrib(OSD_2BITFONT, VgaKeyItem[5][0][0]);
OsdShowIconFrame(0, SubMenuWin.Vs + KeyMenuCursor * 4, VgaKeyItem[5][0][1]);
#else
OsdAttrib(OSD_2BITFONT, VgaKeyItem[KeyMenuCursor][0][0]);
OsdShowIcon(1, SubMenuWin.Vs + 1 + KeyMenuCursor * 4, VgaKeyItem[KeyMenuCursor][0][1]);
OsdAttrib(OSD_2BITFONT, VgaKeyItem[4][0][0]);
OsdShowIconFrame(0, SubMenuWin.Vs + KeyMenuCursor * 4, VgaKeyItem[4][0][1]);
#endif
OsdDisWindow(WIN2); //chen 08-05-19
}
#endif
/*
*********************************************************************************
* 函 数 名: OsdKeyCursor
* 功能描述: 显示主光标,这个光标在OSD的顶部,总是会显示
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void OsdKeyCursor(void)
{
#if EN_ACEROSD
OSDWIN xdata KeyCursorWin;
OsdDisWindow(WIN2);
KeyCursorWin.No = WIN2;
KeyCursorWin.Hs = 0;
KeyCursorWin.He = 5;
KeyCursorWin.Vs = KeyMenuCursor * 4 + SubMenuWin.Vs;
KeyCursorWin.Ve = KeyCursorWin.Vs + 3;
KeyCursorWin.Attr = 0; //WIN_EN_BEVEL + WIN_BL_TYPE2;
KeyCursorWin.BL_LCL = BACKWINPALETTE;
KeyCursorWin.BL_RCL = BACKWINPALETTE;
KeyCursorWin.BL_Width = 0x00;
KeyCursorWin.Color = SUBWINPALETTE;
OsdAttrib(OSD_2BITFONT, VgaKeyItem[KeyMenuCursor][1][0]);
OsdShowIcon(KeyCursorWin.Hs + 1, KeyCursorWin.Vs + 1, VgaKeyItem[KeyMenuCursor][1][1]);
#if USE_AUDIO
OsdAttrib(OSD_2BITFONT, VgaKeyItem[5][1][0]);
OsdShowIconFrame(KeyCursorWin.Hs, KeyCursorWin.Vs, VgaKeyItem[5][1][1]);
#else
OsdAttrib(OSD_2BITFONT, VgaKeyItem[4][1][0]);
OsdShowIconFrame(KeyCursorWin.Hs, KeyCursorWin.Vs, VgaKeyItem[4][1][1]);
#endif
OsdSetWin(&KeyCursorWin);
#else
uint8 xdata buf[7];
// 禁止光标显示
OsdDisWindow(WIN2);
// 更新光标的位置
#if USE_AUDIO
buf[0] = (KeyMenuCursor << 2) + 2;
#else
buf[0] = KeyMenuCursor * 5 + 2;
#endif
buf[1] = buf[0] + 2;
buf[2] = 1;
buf[3] = 2;
buf[4] = WIN_EN_SHADOW + WIN_SDSZ_4;
buf[5] = BLUE;
buf[6] = BLACK;
WrScalarRegBit(rP0A5, WIN2, 0x07);
WrScalarBytes(rP0A6, 0x07, buf);
// 允许光标显示
OsdEnWindow(WIN2);
#endif
}
/*
*********************************************************************************
* 函 数 名: OsdClearLine
* 功能描述: 清除一行的显示, 方法是用空白字符去填,
* 输 入: line : 指定要清除的行
* 返 回: 无
********************************************************************************
*/
void OsdClearLine(uint8 line)
{
#if EN_ACEROSD
OsdShowStr(SubMenuWin.Hs, line, Osd1bitFont_Common, OSD_FRAME_WIDTH - 6);
#else
OsdShowStr(1, line, Osd1bitFont_Common, OSD_FRAME_WIDTH - 2);
#endif
}
/*
********************************************************************************
* 函 数 名: OsdShowPercent
* 功能描述: 在指定的位置显示百分比
* 输 入: x : 水平起始位置,单位字符
* y : 垂直起始位置,单位字符
* val : 要显示的百分数
* 返 回: 无
* 注 意: 显示的颜色和属性需要预先通过OsdAttrib进行定义
********************************************************************************
*/
void OsdShowPercent(uint8 x, uint8 y, uint8 val)
{
uint8 xdata buf[5];
uint8 i;
buf[0] = 0x00;
buf[1] = 0x00;
i = HexToDisp(0, val, buf + 2);
OsdShowStr(x, y, buf + i - 1, 3);
}
#if 0
/*
********************************************************************************
* 函 数 名: OsdShowInfo
* 功能描述: 在指定的位置显示百分比
* 输 入: x : 水平起始位置,单位字符
* y : 垂直起始位置,单位字符
* val : 要显示的百分数
* 返 回: 无
* 注 意: 显示的颜色和属性需要预先通过OsdAttrib进行定义
********************************************************************************
*/
void OsdShowInfo(uint8 x, uint8 y, uint16 val)
{
uint8 xdata buf[5];
uint8 i;
for (i = 0; i < 5; i++) buf[i] = __;
HexToDisp(val, buf);
OsdShowStr(x, y, buf, 5);
}
#endif
#if EN_ACEROSD
/*
********************************************************************************
* 函 数 名: OsdShowSubFrame
* 功能描述: 在指定的位置显示辅助滚动条
* 输 入: x : 水平起始位置,单位字符
* y : 垂直起始位置,单位字符
* val : 要显示的百分数
* len : 滚动条的有效长度,不含其它的修饰符,最长不能大于16
* 返 回: 无
* 注 意: 显示的颜色和属性需要预先通过OsdAttrib进行定义
********************************************************************************
*/
#define ICON_ROLL_L ICON_ROLL
#define ICON_ROLL_R ICON_ROLL_L+1
#define ICON_ROLL_EMPTY ICON_ROLL_L+2
#define ICON_ROLL_1 ICON_ROLL_L+3
#define ICON_ROLL_2 ICON_ROLL_L+4
#define ICON_ROLL_3 ICON_ROLL_L+5
#define ICON_ROLL_4 ICON_ROLL_L+6
#define ICON_ROLL_FULL ICON_ROLL_L+7
void OsdShowRollFrame(uint8 x, uint8 y)
{
uint8 i;
uint8 xdata buf[10];
if(MenuState == MENU_SUB)
{
for(i=0; i<10; i++) buf[i] = ICON_ROLL_BLANK;
OsdShowStr(x+1, y-1, buf, 10);
for(i=0; i<10; i++) buf[i] = ICON_ROLL_BLANK + 1;
OsdShowStr(x+1, y+1, buf, 10);
}
}
void OsdShowValScroll(uint8 x, uint8 y, uint8 val)
{
uint8 i,tmpData,index;
uint8 tmpColor;
uint8 xdata buf[12];
if(Flg_ParAdj) tmpColor = PALETTE_VALSCROLL_LR + 2;
else tmpColor = PALETTE_VALSCROLL_LR;
buf[0] = ICON_ROLL_L;
if(val>100) val = 100; //可以不加此句 08-04-18
index = val / 10;
for(i=1; i<index+1; i++) buf[i] = ICON_ROLL_FULL;
if(val % 10)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -