📄 rposdfunc.c
字号:
//////////////////////////////////////////////////////////////////
//
// RPOSDFunc.c v0.01
//
//
//
//////////////////////////////////////////////////////////////////
#define __OSD_FUNC__
#include "Header\Include.h"
#if(NEW_OSD_FUNC)
WORD xdata CheckSumHex = 0;
//WORD xdata CheckSumHex_tmp = 0;
//---------------------------------------------------------------------------
void SetOSDRamAddress(unsigned char Row_Count,unsigned char Col_Count,unsigned int iFntBaseAddr)
{
unsigned int iFontSelectAddress;
ucRow_Count = Row_Count;
ucCol_Count = Col_Count;
iFontSelectAddress = FONT_SELECT_ADDRESS;
iFontBaseAddress = iFntBaseAddr;
CScalerSendAddr(_OSD_ADDR_MSB_90, _WRITE, _AUTOINC);
CScalerSendByte(0xc0);
CScalerSendByte(0x04);
CScalerSendWriteStop();
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
CScalerSendByte(iFontSelectAddress & 0xff);
CScalerSendByte(((iFontSelectAddress >> 4) & 0xf0) | (iFontBaseAddress & 0x0f));
CScalerSendByte(((iFontBaseAddress >> 4) & 0xff));
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void DirectWOSDRam(unsigned int iAddress,unsigned int iLen,unsigned char TheByte,unsigned char Value)
{
CScalerSendAddr(_OSD_ADDR_MSB_90, _WRITE, _AUTOINC);
CScalerSendByte(TheByte | ((iAddress >> 8) & 0x0f));
CScalerSendByte((unsigned char)(iAddress & 0xff));
CScalerSendWriteStop();
if(TheByte == ALL_BYTE) iLen *= 3;
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
while(iLen)
{
CScalerSendByte(Value);
iLen--;
}
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void SetRowCmds(unsigned char ucRowCnt,unsigned char ucRowLenght)
{
// Row Command Byte 0
// 0x80
// Character border/shadow 000: None
// Double character width 0: 0x01
// Double character height 0: 0x01
DirectWOSDRam(0x00,ucRowCnt,THE_BYTE0,0x80);
//Row End Command
OutputChar(0x00);
// Row Command Byte 1
// 0x90
// Row height (1~32) : 18
// Column space : 0
DirectWOSDRam(0x00,ucRowCnt,THE_BYTE1,0x88);
// Row Command Byte 2
DirectWOSDRam(0x00,ucRowCnt,THE_BYTE2,ucRowLenght);
}
//---------------------------------------------------------------------------
void Gotoxy(unsigned char x,unsigned char y,unsigned char TheByte)
{
unsigned int iAddress = FONT_SELECT_ADDRESS + (y * ucCol_Count) + x;
CScalerSendAddr(_OSD_ADDR_MSB_90, _WRITE, _AUTOINC);
CScalerSendByte((unsigned char)(((iAddress >> 8 ) & 0x0f) | TheByte));
CScalerSendByte((unsigned char)(iAddress & 0xff));
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void OutputChar(unsigned char C)
{
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
CScalerSendByte(C);
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void Textout(unsigned char code *Text)
{
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
while(*Text != 0)
{
CScalerSendByte(*Text);
Text++;
}
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void CenterTextout(unsigned char code *Text,unsigned char x,unsigned char y)
{
unsigned char Len = StrLen(Text);
if(Len / 2 >= x) x = 0;
else x = x - Len / 2;
Gotoxy(x,y,THE_BYTE1);
Textout(Text);
}
//-----------------------------------------------------------
void RightAlignTextOut(unsigned char code *Text,unsigned char x,unsigned char y)
{
unsigned char Len = StrLen(Text);
if(Len / 2 >= x) x = 0;
else x = x - Len;
Gotoxy(x,y,THE_BYTE1);
Textout(Text);
}
//-----------------------------------------------------------
void PrintfInt(unsigned int Value)
{
unsigned char a[5];
a[0] = (Value / 10000) + '0';
a[1] = ((Value / 1000) % 10) + '0';
a[2] = ((Value / 100) % 10) + '0';
a[3] = ((Value / 10) % 10) + '0';
a[4] = (Value % 10) + '0';
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
CScalerSendByte(a[0]);
CScalerSendByte(a[1]);
CScalerSendByte(a[2]);
CScalerSendByte(a[3]);
CScalerSendByte(a[4]);
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void PrintfDec(unsigned char Value)
{
unsigned char a[3];
if(Value / 100 > 0)
{
a[0] = (Value / 100) + '0';
a[1] = ((Value / 10) % 10) + '0';
a[2] = (Value % 10) + '0';
}
else if(Value / 10 > 0)
{
a[0] = 0;
a[1] = (Value / 10) + '0';
a[2] = (Value % 10) + '0';
}
else
{
a[0] = 0;
a[1] = 0;
a[2] = Value + '0';
}
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
CScalerSendByte(a[0]);
CScalerSendByte(a[1]);
CScalerSendByte(a[2]);
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void PrintfHex(unsigned char Value)
{
unsigned char h,l,t;
t = (Value & 0x0f);//fenix
if(t < 10) l = t +'0';//48;
else l = t - 10 +'A';// -10+ 65;
t = (Value >> 4) & 0x0f;
if(t < 10) h = t +'0';//48;
else h = t -10+'A';// 65;
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
CScalerSendByte(h);
CScalerSendByte(l);
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void COsdFxCloseWindow(unsigned char ucWinID)
{
pData[0] = 0x81;
pData[1] = ucWinID * 4 + 3;
pData[2] = 0x00;
CScalerWrite(_OSD_ADDR_MSB_90, 3, pData, _AUTOINC);
}
//-------------------------------------------------------------------------------------------------------
// OSD_Position : Restore OSD position according to global settings
// para : OSD font parameter
// OSD_GLOBAL_BLINK : 0x10
// OSD_DISP_ZONE_LEFT : 0x04
// OSD_DISP_ZONE_RIGHT : 0x08
// OSD_ROTATE : 0x02
// OSD_ENABLE : 0x01
//---------------------------------------------------------------------------
void OSDPosition(WORD usOsdActWidth, WORD usOsdActHeight, BYTE ucHPos, BYTE ucVPos, BYTE ucPar)
{
if(ucHPos > 100)
ucHPos = 50;
if(ucVPos > 100)
ucVPos = 50;
usOsdActWidth = _OSD_HPOSITION_OFFSET + (DWORD)((ucHPos)*((Panel.DHEndPos - Panel.DHStartPos)/4 -usOsdActWidth/4 - 4)) / 100;
usOsdActHeight = _OSD_VPOSITION_OFFSET + (DWORD)((ucVPos)*((Panel.DVEndPos - Panel.DVStartPos)/4 - usOsdActHeight/4 - 6)) / 100;
CScalerSetBit(_OSD_SCRAMBLE_93, 0xf8, 0x02);
pData[0] = CScalerGetBit(_OVERLAY_CTRL_6C, _BIT0);
pData[0] = (pData[0] == 0x00) ? 0xc0 : 0xe0;
pData[1] = 0x00;
CScalerWrite(_OSD_ADDR_MSB_90, 2, pData, _AUTOINC);
pData[0] = usOsdActHeight >> 1;
pData[1] = (BYTE)(usOsdActWidth >> 2);
pData[2] = ((BYTE)(usOsdActWidth & 0x0003) << 6) | ((usOsdActHeight & 0x01) << 5) | ucPar;
CScalerWrite(_OSD_DATA_PORT_92, 3, pData, _NON_AUTOINC);
CTimerWaitForEvent(_EVENT_DEN_STOP);
CTimerWaitForEvent(_EVENT_DEN_STOP);
CScalerSetBit(_OSD_SCRAMBLE_93, 0xf8, 0x05);
}
//---------------------------------------------------------------------------
void OSDLine(unsigned char row, unsigned char col, unsigned char length,
unsigned char value, unsigned char TheByte)
{
Gotoxy(col,row,TheByte);
if(TheByte == ALL_BYTE) length *= 3;
CScalerSendAddr(_OSD_DATA_PORT_92, _WRITE, _NON_AUTOINC);
while(length)
{
CScalerSendByte(value);
length--;
}
CScalerSendWriteStop();
}
//---------------------------------------------------------------------------
void OSDClear(unsigned char row_start, unsigned char height,
unsigned char col_start, unsigned char width,
unsigned char Value, unsigned char indicate)
{
if (height)
{
do
{
OSDLine(row_start, col_start, width, Value, indicate);
row_start++;
}
while (--height);
}
}
//---------------------------------------------------------------------------
void OutputDisplaySize()
{
//unsigned int usHwid;
//Data[0] 长度不定所以在后面才能得到
//pData[1] = N_INC;
//pData[2] = _OSD_DATA_PORT_92;
if(stModeInfo.IHWidth / 1000) pData[3] = '1';
else pData[3] = 0;
pData[4] = (unsigned char)((stModeInfo.IHWidth / 100) % 10) + '0';
pData[5] = (unsigned char)((stModeInfo.IHWidth / 10) % 10) + '0';
pData[6] = (unsigned char)(stModeInfo.IHWidth % 10) + '0';
pData[7] = ' ';
pData[8] = 0x5b; // x
pData[9] = ' ';
if(stModeInfo.IVHeight / 1000)
{
pData[10] = '1';
pData[11] = (unsigned char)((stModeInfo.IVHeight / 100) % 10) + '0';
pData[12] = (unsigned char)((stModeInfo.IVHeight / 10) % 10) + '0';
pData[13] = (unsigned char)(stModeInfo.IVHeight % 10) + '0';
pData[14] = 0;
pData[0] = 14;
}
else
{
pData[10] = (unsigned char)((stModeInfo.IVHeight / 100) % 10) + '0';
pData[11] = (unsigned char)((stModeInfo.IVHeight / 10) % 10) + '0';
pData[12] = (unsigned char)(stModeInfo.IVHeight % 10) + '0';
pData[13] = 0;
pData[0] = 13;
}
CScalerWrite(_OSD_DATA_PORT_92,pData[0] - 3,&pData[3],_NON_AUTOINC);
}
//---------------------------------------------------------------------------------------------------------------------
void OutputRefrushRate()
{
unsigned char ucTmp;
ucTmp = stModeInfo.IVFreq/10;
//pData[13] = (ucTmp/100)%10; // x 100
pData[12] = (ucTmp/10)%10; // x 10
pData[11] = ucTmp%10; // x 1
pData[0] = 7;
//pData[1] = N_INC;
//pData[2] = _OSD_DATA_PORT_92;
pData[3] = pData[12] + '0';
pData[4] = pData[11] + '0';
pData[5] = 'H';
pData[6] = 'Z';
pData[7] = 0;
//CScalerCodeW(pData);
CScalerWrite(_OSD_DATA_PORT_92,pData[0] - 3,&pData[3],_NON_AUTOINC);
}
//---------------------------------------------------------------------------------------------------------------------
void OutputHSync()
{
/* unsigned long ulTmp = 245760/usHsync;
Data[13]= (ulTmp / 100) % 10; // x 100
Data[12]= (ulTmp / 10) % 10; // x 10
Data[11]= ulTmp % 10; // x 1
if(Data[13] >= 10)
{
Data[14] = (Data[13] / 10) + 1;
Data[13] = Data[13] - 10;
}
else Data[14] = 0;
Data[0] = 11;
Data[1] = N_INC;
Data[2] = OSD_DATA_92;
Data[3] = Data[14] ;
Data[4] = Data[13] + '0';
Data[5] = Data[12] + '0';
Data[6] = '.';
Data[7] = Data[11] + '0';
Data[8] = 'K';
Data[9] = 'H';
Data[10] = 'Z';
Data[11] = 0;
RTDWrite(Data);
*/
}
//---------------------------------------------------------------------------------------------------------------------
void COsdFxCodeWrite(BYTE code *pArray)
{
BYTE cnt, temp;
CScalerWrite(_OSD_ADDR_MSB_90, 2, pArray, _AUTOINC);
pArray += 2;
cnt = 0;
while(_TRUE)
{
if(*pArray == _EXT_)
{
CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -