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

📄 rposdfunc.c

📁 LCD TV,uVision2 Project, (C) Keil Software
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////
//
//				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 + -