📄 osd.c
字号:
/*
********************************************************************************
*
* LCD控制程序
*
* 这是SCALAR当中与OSD相关的部分
*
* 文件名 : OSD.C
* 设计者 : Terry
********************************************************************************
* 功 能 描 述
*
* 1. 这一模块存放了OSD操作的接口函数,至于和SCALAR打交道的底层则在I2CIO.C中
* 2. OSD.H是必须被包含进来的,这个文件定义了OSD接口的常数以及函数
********************************************************************************
*/
#include "osd.h"
#include "scalar.h"
uint8 xdata OsdFrameWidth;
#if PanelWidth > 640
#define EN_DOUBLE_FONT 1 // (0)表示禁止,(1)表示允许,提示信息采用放大处理
#else
#define EN_DOUBLE_FONT 0 // (0)表示禁止,(1)表示允许,提示信息采用放大处理
#endif
uint8 code Icon_MuteOn[2] = {0x1B, 0x1C};
uint8 code Icon_MuteOff[2] = {0x19, 0x1A};
uint8 code Icon_Exit[2] = {0x17, 0x18};
uint8 code Icon_Return[2] = {0x25, 0x00};
uint8 code Icon_6500[2] = {0x11, 0x14};
uint8 code Icon_9300[2] = {0x13, 0x14};
uint8 code Icon_User[2] = {0x15, 0x16};
uint8 code Icon_State_9300[2] = {0x21, 0x24};
uint8 code Icon_State_6500[2] = {0x23, 0x24};
uint8 code Icon_State_User[2] = {0x1F, 0x20};
uint8 code Icon_State_Analog[2] = {0x1D, 0x1D};
uint8 code Icon_State_Digital[2] = {0x1E, 0x1E};
uint8 code Icon_Move[2] = {0x28, 0x29};
uint8 code Icon_MoveR[2] = {0x29, 0x00};
uint8 code Icon_Auto[3] = {0x2A, 0x2B, 0x2C}; //,0x32};
uint8 code Icon_Menu[3] = {0x2D, 0x2E, 0x2F};//,0x35};
/*
********************************************************************************
* 关于NT68521调色板的说明
* 1. NT68521中的调色板共有256项,根据其显示属性的描述可以在同一时间里选择256种
* 前景颜色和16种背景颜色
* 2. 调色板的每一项由16位构成,R,G,B各占5/6/6位,
* 15 15:11 10:5 4:0
* Reserved R G B
* 3. 调色板每一项16位的存放格式是,低8位在前,高8位在后
* 4. 我们在使用时要视情况而定,不一定要使用到全部的调色板
********************************************************************************
*/
uint8 code Palette1BitTable[] = { // 系统默认的调色板数据
LOWBYTE(R00+G00+B00), HIGHBYTE(R00+G00+B00), // 0 BLACK
LOWBYTE(R00+G00+B18), HIGHBYTE(R00+G00+B18), // 1 BLUE
LOWBYTE(R00+G36+B00), HIGHBYTE(R00+G36+B00), // 2 GREEN
LOWBYTE(R00+G50+B25), HIGHBYTE(R00+G50+B25), // 3 CYAN
LOWBYTE(R18+G00+B00), HIGHBYTE(R18+G00+B00), // 4 RED
LOWBYTE(R18+G00+B18), HIGHBYTE(R18+G00+B18), // 5 MAGENTA
LOWBYTE(R22+G44+B10), HIGHBYTE(R22+G44+B10), // 6 BROWN
LOWBYTE(R20+G40+B20), HIGHBYTE(R20+G40+B20), // 7 LIGHTGRAY
LOWBYTE(R10+G20+B10), HIGHBYTE(R10+G20+B10), // 8 DARKGRAY
LOWBYTE(R00+G00+B26), HIGHBYTE(R00+G00+B26), // 9 LIGHTBLUE
LOWBYTE(R00+G56+B00), HIGHBYTE(R00+G56+B00), // A LIGHTGREEN
LOWBYTE(R00+G63+B31), HIGHBYTE(R00+G63+B31), // B LIGHTCYAN
LOWBYTE(R31+G00+B00), HIGHBYTE(R31+G00+B00), // C LIGHTRED
LOWBYTE(R31+G00+B31), HIGHBYTE(R31+G00+B31), // D LIGHTMAGENTA
LOWBYTE(R27+G55+B00), HIGHBYTE(R27+G55+B00), // E YELLOW
LOWBYTE(R31+G63+B31), HIGHBYTE(R31+G63+B31), // F WHITE
};
#if EN_ACEROSD //chen 08-04-14
uint8 code Palette2BitTable[]=
{
//调色板备份
// 图象图标的调色板 0x09CE,0x4455,0x2455,0xFFFF
//0x10-0x13
0xCE,0x09, 0x55,0x44, 0x55,0x24, 0xFF,0xFF,
// 图象选中、OSD选中的调色板 0x4455,0xFFFF,0xD708,0xFFFF
//0x14-0x17
0x55,0x44, 0xFF,0xFF, 0x08,0xD7, 0xFF,0xFF,
// OSD图标、音频图标的调色板 0x120F,0x4455,0x2455,0xFFFF
//0x18-0x1B
0xCE,0x09, 0x55,0x44, 0xFF,0xFF, 0x55,0x24,
// 音频图标的调色板 0x5544,0xD708,0xFFFF,0xFFFF //选择
//0x1C-0x1F
0x55,0x44, 0xFF,0xFF, 0xFF,0xFF, 0x08,0xD7,
// 设置图标的调色板 0x120F,0x4455,0x2455,0xFFFF
//0x20-0x23
0xCE,0x09, 0x0F,0x12, 0xFF,0xFF, 0x55,0x24,
// 设置图标的调色板 0x5544,0xD708,0xFFFF,0xFFFF //选择
//0x24-0x27
0x55,0x44, 0x55,0x44, 0xFF,0xFF, 0x08,0xD7,
// 退出图标的调色板 0x120F,0x4455,0x2455,0xFFFF
//0x28-0x2B
0xCE,0x09, 0x0F,0x12, 0x55,0x24, 0xFF,0xFF,
// 退出图标的调色板 0x5544,0xD708,0xFFFF,0xFFFF //选择
//0x2C-0x2F
0x55,0x44, 0x55,0x44, 0x08,0xD7, 0xFF,0xFF,
// 边框图标的调色板 0xFFFF,0x09CE,0x4455,0x120F
// 0xFF,0xFF, 0xCE,0x09, 0x55,0x44, 0x0F,0x12,
//0x30-0x33
0xFF,0xFF, 0xCE,0x09, 0xCE,0x09, 0x0F,0x12,
// 边框图标的调色板 0xFFFF,0x09CE, 0xD708,0x4455, //选择
//0x34-0x37
0xFF,0xFF, 0xCE,0x09, 0x08,0xD7, 0x55,0x44,
// 主窗口圆倒角图标的调色板0x09CE,0xB5B6,0xB5D6,0xFFFF
//0x38-0x3B
0xCE,0x09, 0xB6,0xB5, 0xB6,0xB5, 0xFF,0xFF,
// 辅助窗口滚动条图标的调色板0x09CE,0xB5B6,0xB5D6,0xFFFF
//0x3C-0x3F
0x55,0x44, 0x08,0xD7, 0x55,0x44, 0xFF,0xFF,
// 辅助窗口滚动条图标的调色板0x09CE,0xB5B6,0xB5D6,0xFFFF //选择
//0x40-0x43
0x55,0x44, 0x08,0xD7, 0x08,0xD7, 0xFF,0xFF,
//辅助窗口不显示
//0x44-0x47
0x55,0x44, 0x55,0x44, 0x55,0x44, 0x55,0x44,
//变量滚动条的调色板 0x5AEB, 0x020C, 0xBEFF, 0x75DF
//0x48-0x4B
0xEB,0x5A, 0x0C,0x02, 0xFF,0xBE, 0xDF,0x75,
//变量滚动条左右图标的调色板 0x5C55, 0x020C, 0xD708, 0x020C,
//0x4C-0x4F
0x55,0x5C, 0x0C,0x02, 0x08,0xD7, 0x0C,0x02,
//变量滚动条填充图标的调色板0x09CE, 0x001F, 0xD708, 0x07E0,
//0x50-0x53
0xCE,0x09, 0x55,0x44, 0x08,0xD7, 0x55,0x44,
//变量滚动条填充图标的调色板0x09CE, 0x001F, 0xD708, 0x07E0,
//0x54-0x57
0xCE,0x09, 0x55,0x44, 0x08,0xD7, 0x08,0xD7,
};
uint8 code Palette2BitTable_Extra[] =
{
//Logo E图标的调色板0x09CE, 0x0308, 0xFFFF, 0x5C55,
0xCE,0X09, 0x08,0x03, 0xFF,0xFF, 0x55,0x5C,
//Text等图标的调色板0x5C55, 0xBEFF, 0x09CE, 0x0000,
0x55,0x5C, 0xFF,0xBE, 0xCE,0x09, 0x00,0x00,
//Text等图标的调色板0x5C55, 0xD708, 0x09CE, 0x0000, //选择
0x55,0x5C, 0x08,0xD7, 0xCE,0x09, 0x00,0x00,
};
#else
uint8 code Palette2BitTable[]=
{
// 亮度图标的调色板
LOWBYTE(R10+G20+B10), HIGHBYTE(R10+G20+B10),
LOWBYTE(R31+G63+B00), HIGHBYTE(R31+G63+B00),
LOWBYTE(R10+G20+B10), HIGHBYTE(R10+G20+B10),
LOWBYTE(R00+G00+B00), HIGHBYTE(R00+G00+B00),
// 图像图标的调色板
LOWBYTE(R00+G00+B18), HIGHBYTE(R00+G00+B18),
LOWBYTE(R31+G63+B31), HIGHBYTE(R31+G63+B31),
LOWBYTE(R00+G40+B00), HIGHBYTE(R00+G40+B00),
LOWBYTE(R31+G00+B00), HIGHBYTE(R31+G00+B00),
// 颜色图标的调色板
LOWBYTE(R20+G40+B20), HIGHBYTE(R20+G40+B20),
LOWBYTE(R31+G00+B00), HIGHBYTE(R31+G00+B00),
LOWBYTE(R00+G00+B18), HIGHBYTE(R00+G00+B18),
LOWBYTE(R31+G63+B00), HIGHBYTE(R31+G63+B00),
// 音频图标的调色板 0x0010,0xEFFF,0xEFE0,0xEC00, //PALETTE0
0x10,0x00, 0xFF,0xEF, 0xE0,0xEF, 0x00,0xEC,
// 工具图标的调色板 x0014,0xEFFF,0xC618,0xE800, //PALETTE0
0x14,0x00, 0xFF,0xEF, 0x18,0xC6, 0x00,0xE8,
// 退出图标的调色板 0xC618,0x07FF,0x001F,0x0000, //PALETTE0
0x18,0xC6, 0xFF,0x07, 0x1F,0x00, 0x00,0x00,
};
#endif
uint8 code OsdInitTbl[] =
{
0x15, RegAddr(rP080),
0x00, // rP080 OSD and Window enable Control
0x00, // rP081 OSD Frame Horizontal Start - Low byte
0x00, // rP082 OSD Frame Horizontal Start - High byte
OSD_FRAME_WIDTH - 1, // rP083 OSD Frame Horizontal Width
0x00, // rP084 OSD Frame Vertical Start - Low byte
0x00, // rP085 OSD Frame Vertical Start - High byte
OSD_FRAME_HEIGHT - 1, // rP086 OSD Frame Vertical Height
0x00, // rP087 OSD Shift Row Offset 不是很清楚这个寄存器的作用
(Osd1bitFontAddr&0xFF), // rP088 OSD one bit font address - Low byte
(Osd1bitFontAddr>>8), // rP089 OSD one bit font address - Hight byte
(Osd2bitFontAddr&0xFF), // rP08A OSD two bit font address - Low byte
(Osd2bitFontAddr>>8), // rP08B OSD two bit font address - Hight byte
(Osd4bitFontAddr&0xFF), // rP08C OSD OSD four bit font address - Low byte
(Osd4bitFontAddr>>8), // rP08D OSD four bit font address - High byte
0xFF, // rP08E OSD Fade-in/Fade-out Step
0x00, // rP08F OSD Fade-in/Fade-out Frequency & Function Enable
0x0F, // rP090 OSD Zoom Control
0xFF, // rP091 OSD Font Horizontal Global Zoom Pattern - Low
0x3F, // OSD Font H/V Global Zoom Pattern - High
0xFF, // OSD Font Vertical Global Zoom Pattern - Low
0xFF, // OSD Font Vertical Global Zoom Pattern - Mid
0x03, RegAddr(rP0A0),
0x11, // rP0A0 OSD Blink Control
0x33, // rP0A1 OSD Character Translucent Level
0x00, // rP0A2 OSD Space & Font Size
0x08, RegAddr(rP0B0),
0x00, 0x00, 0x00, 0x00, // rP0B0-rP0B3 OSD Shadow Control
0x00, 0x00, 0x00, 0x00, // rP0B4-rP0B7 OSD Border Control
0, // 如果记录长度为0, 那么表示数据表结束
};
#if EN_LOGO
void OsdInitFontIndex(void)
{
WrScalarWord(rP088, Osd1bitFontAddr);
WrScalarWord(rP08A, Osd2bitFontAddr);
WrScalarWord(rP08C, Osd4bitFontAddr);
}
#endif
/*
********************************************************************************
* 函 数 名: OsdInit
* 功能描述: SCALAR中和OSD相关部分的初始化
* 输 入: 无
* 返 回: 无
* 注 意: OSD的初始化要放在SCALAR电源开启来之后,如果在这之前,那么调色板会
* 不正常
********************************************************************************
*/
void OsdInit(void)
{
RegDataTableOut(OsdInitTbl);
OsdSetFrame(OSD_FRAME_WIDTH, OSD_FRAME_HEIGHT);
AdjOsdHpos(HIDE, 0);
AdjOsdVpos(HIDE, 0);
OsdLoadPallete();
OsdLoadBlankFont();
WrScalarPort(PORT_OSD_1BF, 0x00, Osd1bitFont_Common, Osd1bFC_Common * 27);
#if EN_ACEROSD //chen 08-04-14
WrScalarPort(PORT_OSD_2BF, 0x00, Osd2bitFont, (ICON_END+1)* 54);
// WrScalarPort(PORT_OSD_2BF, ICON_LOGOTEST, Osd2bitFont_Extra, 7 * 54);
#else
WrScalarPort(PORT_OSD_2BF, 0x00, Osd2bitFont, 6 * 6 * 54);
#endif
OsdClear();
OsdFontIndexReset();
//FontArrayPtr = Osd1bitFont_Chs;
}
/*
********************************************************************************
* 函 数 名: OsdLoadPallete
* 功能描述: 初始化调色板
* 输 入: 无
* 返 回: 无
* 注 意: 对索引表的操作,地址一项是指索引值,而不是地址偏移量,每一个调色板
* 项目由两个字节构成
********************************************************************************
*/
void OsdLoadPallete(void)
{
// 初始化单色字符的调色板
WrScalarPort(PORT_OSD_PALLETE, 0x00, Palette1BitTable, sizeof(Palette1BitTable));
// 初始化四色字符的调色板
WrScalarPort(PORT_OSD_PALLETE, sizeof(Palette1BitTable)/2, Palette2BitTable, sizeof(Palette2BitTable));
}
/*
********************************************************************************
* 函 数 名: OsdSetFrame
* 功能描述: 设置OSD帧
* 输 入: Width : OSD帧的宽度
* Height : OSD帧的高度
* 返 回: 无
********************************************************************************
*/
void OsdSetFrame(uint8 Width, uint8 Height)
{
WrScalarReg(rP083, Width - 1);
WrScalarReg(rP086, Height);
OsdFrameWidth = Width;
}
/*
********************************************************************************
* 函 数 名: OsdClear
* 功能描述: 清除OSD RAM的内容, 仅仅是清除OSD窗口的显示部分.其作用的原理是应用
* 寄存器CC,CD和CE中定义的显示属性,字符代码去填OSD窗口
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void OsdClear(void)
{
// 清除OSD显示RAM的内容
OsdDisable();
Delay(20);
WrScalarWord(rP0CC, 0x0000); // 用于清除的颜色和属性
WrScalarReg(rP0CE, 0x00); // 用于清除的字符
WrScalarReg(rP0CF, 0x01); // 启动快速清除的操作
SysTmr = 500/SYSTMR_PRIO; // 500ms
while ((RdScalarReg(rP0CF) & BIT_0) && SysTmr) {};
WrScalarReg(rP080, 0x00); // 清除窗口的允许标志
WrScalarReg(rP0A5, 0x00);
OsdZoom(0, 0);
OsdRowZoom(0xFF, 0);
OsdBorder(0xFF, 0x00);
OsdShadow(0xFF, 0x00);
}
/*
********************************************************************************
* 函 数 名: OsdEnable
* 功能描述: 允许OSD显示,四个OSD窗口是否被显示,则不由这个程序来执行
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void OsdEnable(void)
{
WrScalarRegBit(rP080, 0x01, 0x01);
}
/*
********************************************************************************
* 函 数 名: OsdDisable
* 功能描述: 禁止OSD显示,包括四个OSD窗口也被清除显示
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void OsdDisable(void)
{
WrScalarRegBit(rP080, 0x00, 0x01);
}
/*
********************************************************************************
* 函 数 名: OsdHpos
* 功能描述: 设置OSD的水平位置
* 输 入: hpos : OSD水平位置的值,单位为像素
* 返 回: 无
********************************************************************************
*/
void OsdHpos(uint16 hpos)
{
WrScalarWord(rP081, hpos);
}
/*
********************************************************************************
* 函 数 名: OsdVpos
* 功能描述: 设置OSD的垂直位置
* 输 入: hpos : OSD垂直位置的值,单位为像素
* 返 回: 无
********************************************************************************
*/
void OsdVpos(uint16 vpos)
{
WrScalarWord(rP084, vpos);
}
/*
********************************************************************************
* 函 数 名: OsdSetWin
* 功能描述: 设置和显示OSD窗口,窗口的特征数据保存在一个结构当中,当然该设置的窗
* 口能否被显示还要看寄存器rP080的第0位
* 输 入: Win : 保存窗口特征参数的指针
* 返 回: 无
********************************************************************************
*/
void OsdSetWin(OSDWIN * Win)
{
WrScalarRegBit(rP0A5, Win->No, 0x07);
WrScalarBytes(rP0A6, 0x0A, &(Win->Hs));
OsdEnWindow(Win->No);
}
/*
********************************************************************************
* 函 数 名: OsdEnWindow
* 功能描述: 让指定的窗口显示,如果指定的窗口为WINALL那么将显示所有的窗口
* 输 入: win : 窗口号,最多为8个窗口
* 返 回: 无
********************************************************************************
*/
void OsdEnWindow(uint8 win)
{
if (win > WIN8) { // WINALL
WrScalarRegBit(rP080, B0001_1110, B0001_1110);
WrScalarRegBit(rP0A5, B1111_0000, B1111_0000);
}
else if (win > WIN4) { // WIN5-WIN8
win = 1<<(win);
WrScalarRegBit(rP0A5, win, win);
}
else { // WIN1-WIN4
win = 1<<(win + 1);
WrScalarRegBit(rP080, win, win);
}
}
/*
********************************************************************************
* 函 数 名: OsdDisWindow
* 功能描述: 禁止指定的窗口显示,如果指定的窗口为WINALL那么将禁止所有的窗口显示
* 输 入: win : 窗口号,最多为8个窗口
* 返 回: 无
********************************************************************************
*/
void OsdDisWindow(uint8 win)
{
if (win > WIN8) { // WINALL
WrScalarRegBit(rP080, B0000_0000, B0001_1110);
WrScalarRegBit(rP0A5, B0000_0000, B1111_0000);
}
else if (win > WIN4) { // WIN5-WIN8
win = 1<<(win);
WrScalarRegBit(rP0A5, 0x00, win);
}
else { // WIN1-WIN4
win = 1<<(win + 1);
WrScalarRegBit(rP080, 0x00, win);
}
}
#if EN_ACEROSD
#else
/*
********************************************************************************
* 函 数 名: OsdWinGradient
* 功能描述: 设置窗口背景过渡色的效果
* 输 入: win : 窗口号,最多为8个窗口
* : Ctrl1, 设定变化的颜色和方向
* : Ctrl2, 设定颜色变化的密度
* 返 回: 无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -