📄 osd.c
字号:
{
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 + -