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

📄 keypad.c

📁 t102 驱动AU 7 屏的OSD原代码,我找了好久才找到的,有一定的参考价值.
💻 C
字号:
//---------------------------------------------------------------------------
// Terawins Inc. Company Confidential Strictly Private
//
// $Archive: Keypad.c $
// $Revision: 0.01 $
// $Author: jwang $
// $Date: 2002/06/19 23:49:23 $
//
// --------------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------------
// Copyright 2002 (c) Terawins Inc.
// This is an unpublished work.
// --------------------------------------------------------------------------
#include "reg51.h"
#include "common.h"
#include "System.h"
#include "Struct.h"
#include "Keypad.h"
#include "TW10xReg.h"
#include "OSDDraw.h"
#include "OSDCtrl.h"
#include "TwoWire.h"
#include "Display.h"
#include "T101_Util.h"

extern void CVBS_S1(void);
extern void CVBS_S2(void);
extern void CVBS_S3(void);
extern void CVBS_S4(void);
extern void SVideo_S(void);


#ifdef T515
void  switch_T515(uCHAR);
#endif


#ifdef TIMER0
extern void Timer0Reset(void);
extern void Timer0Stop(void);
extern void Timer0Start(void);
#endif


extern bit m_bKyPowerOn;
extern uWORD code ucaZoomDataP0_NTSC[];
extern uCHAR   SignalDefine;    // add by Sherman 06'02'23

typedef struct tag_sKEYPAD_FLD
{
    uCHAR cAddress;     // Address of field
    uCHAR cMask;        // Mask for field after shifted right
    uCHAR cFlagsShift;  // Flags & Shift byte:
                        // [7] Type: 1=external, 0=internal
                        // [6] Polarity: 1=high true, 0=low true
                        // [4] Shift direction: 1=left, 0=right
                        // [2:0] Shift to Right Justify
} sKEYPADFLD;

#define nKEYFLDS	1

sKEYPADFLD code sKeyFlds={
    //PORT  MASK  FLAGS/SHIFT
    KEYPORT2, 0x3f, 0x00
};

uCHAR idata m_cCurreKey;
uCHAR idata m_cPreKey;
uWORD idata m_wAccelPollCnt;
uCHAR idata m_cItem;

extern uCHAR idata m_cTV_Num;
extern bit m_bTV_Num_Bits;

extern bit m_bFactryReady;
extern bit m_bFactryMode;
extern uCHAR m_cFactryCnt;

extern bit m_bRelease;
extern bit m_bChipPowerOn;
extern bit m_bKyBlocked;
extern uCHAR idata m_cOSDEvent;
extern uCHAR idata m_cOSDFunc;
extern uCHAR idata m_cOSDMenu;
extern uCHAR idata m_cSource;

extern uWORD idata m_wBuff[3];
extern uCHAR idata m_cBuff[5];
extern uDWORD m_dwBuff[2];
extern uCHAR idata m_cScaleratio;
extern uWORD m_wHRes;
extern uWORD m_wVRes;
extern uWORD idata m_wVTotal;
extern uCHAR idata m_cStandard;
extern uCHAR idata m_cChroma;
void kyKeypadInit(void)
{
	m_wAccelPollCnt=0;
	m_cCurreKey=m_cPreKey=0xFF;
	m_cOSDEvent=0;
	m_cOSDFunc=0;
	m_cOSDMenu=idNULLMENU;
	m_cItem=1;
}

void kyKeypad(void)
{
	if(kyKeypadScan())
	{
		Timer0Reset();
		kyFindFunc();
  	}
	else
		m_cPreKey=m_cCurreKey;
}

bit kyKeypadScan(void)
{
	uCHAR cTemp;
 	while(1)
	{
		cTemp=ReadPort();
		m_cCurreKey=sKeyFlds.cMask&(0xFF-cTemp);
#if 1
		if(m_cCurreKey==kySOURCE || m_cCurreKey==kyMENU || m_cCurreKey==kyPOWER)
		{
			if(!m_bRelease)
			{
				m_bRelease=1;
 				return 1;
			}
		}
		else
		{
			m_bRelease=0;
			if(m_cCurreKey)
				return 1;
			if(!m_cCurreKey) //no key pressed
				return 0;
		}
#else
	if(m_cCurreKey==m_cPreKey)
		return 0;
	else
		return 1;
#endif
	}
}

void kyFindFunc(void)
{
#if 1
	if(m_cCurreKey==m_cPreKey)
	{
		if(!kyIncPollCount())
		{
       		if(kyFindEvent())
				OSDEventMgr();
		}
	}
  	else
  	{
		if(kyFindEvent())
		{
			if(m_cOSDEvent!=FUNCOUNT)
				OSDEventMgr();
			m_cPreKey=m_cCurreKey;
			m_wAccelPollCnt=0;
			kyIncPollCount();
		}
  	}
#else
	kyFindEvent();
#endif
}

uCHAR ReadPort(void)
{
    uCHAR cKey;
    switch(sKeyFlds.cAddress){
    case 0:	cKey=P0; break;
    case 1:	cKey=P1; break;
    case 2: cKey=P2; break;
    case 3: cKey=P3; break;
    }
    return cKey;
}


extern bit m_bAdjRGBColor;
bit kyFindEvent(void)
{
	if(m_cCurreKey==kySOURCE)
  	{
   	    return IRSourceSelKeyCtrl();//kyEXITEvent();
	}
	else if(m_cCurreKey==kyMENU)
 	{
		return kyMENUEvent();
	}
	else if(m_cCurreKey==kyINCREASE)
  	{
		return kyINCREASEEvent();
	}
 	else if(m_cCurreKey==kyDECREASE)
  	{
		return kyDECREASEEvent();
	}
	else if(m_cCurreKey==kyEXIT)
	{
        if(m_cOSDFunc == 0)
		{
		    return IRNTSC_PALCtrl();
		}
		else
		{
            return IRDownKeyCtrl();
		}  

	}
	else if(m_cCurreKey==kyPOWER)
	{
 		return kyPOWEREvent();
	}
}

//Ruby add 2004-06-07
bit kySCALEREvent(void)
{
	uCHAR SlaveAddr,RegAddrShift; 
	m_cScaleratio++;
	if(m_cScaleratio>=ScaleEnd)
	 	m_cScaleratio=ScaleFULL;
#ifdef T515
	if(m_cSource >= isrc_T515_CVIDEO1){
		 SlaveAddr=0xb8;
		 RegAddrShift=0x20;
	}else{
		 SlaveAddr=0x54;
		 RegAddrShift=0x00;
	}	
#else
	SlaveAddr=0x54;
	RegAddrShift=0x00;	
#endif			

	if(I2CReadByte(SlaveAddr, 0x3A+RegAddrShift)&0x06){
		SetOPTiming();	// Add by Sherman 05'11'18
		OSDShowRatio();
   	}
   	return 1;
}

bit kyMENUEvent(void)
{
	if(m_bKyBlocked)
		return 0;

		switch(m_cOSDMenu)
		{
			case	idNULLMENU:
				    m_cOSDMenu=idVIDEOMENU;m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=OPENMENU;m_cItem=1;break;
   
#ifdef TV
			case	idVIDEOMENU:
			        if((m_cSource&0x0F)==(isrcTV))
					{
				        m_cOSDMenu=idTVMENU;m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=OPENMENU;m_cItem=1;break;} 
					else
					    {m_cOSDMenu=idNULLMENU;m_cOSDFunc=0;m_cOSDEvent=CLOSEMENU;m_cItem=0;break;} 

#endif

			default:
				    m_cOSDMenu=idNULLMENU;m_cOSDFunc=0;m_cOSDEvent=CLOSEMENU;m_cItem=0;break;
         
   	    }
		return 1;

}

/*bit kyMENUEvent(void)
{
	if(m_bKyBlocked)
		return 0;

		switch(m_cOSDFunc)
		{
			case	0:
					m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=FUNCENTER;m_cItem=1;break;
			case	idBRIGHTMENU:
					m_cOSDFunc=idCONTRASTMENU;m_cOSDEvent=FUNCENTER;m_cItem=2;break;
			case	idCONTRASTMENU:
					m_cOSDFunc=idSHARP_VIDEO;m_cOSDEvent=FUNCENTER;m_cItem=3;break;
			case	idSHARP_VIDEO:
					{
						m_cOSDFunc=idSATMENU_VIDEO;
						m_cOSDEvent=FUNCENTER;
						m_cItem=4;
					}
					break;
			case	idSATMENU_VIDEO:
					m_cOSDFunc=idHUEMENU_VIDEO;m_cOSDEvent=FUNCENTER;m_cItem=5;break;
			case	idHUEMENU_VIDEO:
					m_cOSDEvent=CLOSEMENU;m_cItem=1;break;
		}
		return 1;

}*/

bit kyINCREASEEvent(void)
{
	if(m_bKyBlocked) return 0;
	if(!m_cOSDFunc&&m_bFactryMode) return 0;

	if(m_cOSDFunc==0)
		{
#ifdef TV
			if((m_cSource&0x0F)==(isrcTV))
			{
				return IRUpKeyCtrl();//0;
			}
#endif
		}
  		else
			m_cOSDEvent=FUNCADJ_IN;
	return 1;
}

bit kyDECREASEEvent(void)
{
	if(m_bKyBlocked) return 0;
	if(!m_cOSDFunc&&m_bFactryMode) return 0;

	if(m_cOSDFunc==0)
		{
#ifdef TV
			if((m_cSource&0x0F)==(isrcTV))
			{
				return IRDownKeyCtrl();//0;
			}
#endif
		}
  		else
			m_cOSDEvent=FUNCADJ_DN;
	return 1;
}
#if 0 
bit kyEXITEvent(void)
{
	if(m_bKyBlocked) return 0;

	if(m_cOSDEvent && (m_cOSDEvent!=FUNCOUNT))
		m_cOSDEvent=FUNCEXIT;
	else
	{
		if(m_bFactryReady)
		{
			m_bFactryReady=0;
			m_cFactryCnt=0;
		}
		else
		{
			m_cFactryCnt++;
       	if(m_cFactryCnt==3)
			{
          	m_bFactryReady=1;
			}
		}
		m_cOSDEvent=FUNCOUNT;
	}
	return 1;
}
#endif
bit kyPOWEREvent(void)
{

		m_bFactryMode = 0;
		if(m_bKyBlocked) m_bKyBlocked=0;
  	m_cOSDEvent=POWERMANAGE;

	return 1;
}

bit kyIncPollCount(void)
{
	if (m_wAccelPollCnt==0)
	{
    	if((m_cOSDEvent==OPENMENU)||(m_cOSDEvent==FUNCENTER)||(m_cOSDEvent==CLOSEMENU)||(m_cOSDEvent==FUNCEXIT))
			m_wAccelPollCnt=KEY_MENU_POLL_COUNT;
		else if(m_cOSDEvent==POWERMANAGE)
			m_wAccelPollCnt=KEY_POWER_SEL;
		else
		{
			if(m_cOSDEvent==FUNCSELCT_IN || m_cOSDEvent==FUNCSELCT_DN )
				m_wAccelPollCnt=KEY_SEL_POLL_COUNT;
			else if((m_cOSDEvent==FUNCADJ_IN)||(m_cOSDEvent==FUNCADJ_DN))
		   	m_wAccelPollCnt=KEY_VAL_POLL_COUNT;
		}
		return 0;
	}
	else
   		m_wAccelPollCnt--;
	return 1;
}

#ifdef ROTATE

extern uCHAR Dis_Mode;
bit kyDismodeEvent()
{
/*
sbit    LEFT_RIGHT      = P0^0; 1: LEFTtoRIGHt, 0: RIGHTtoLEFT
sbit    UP_DOWN			= P0^1; 1: Down, 0: UP 
*/
	#ifdef _480_234  //KVGA
	if((++Dis_Mode)>=VALID_DIR)
		Dis_Mode=TOP_LEFT;
	SET_Dismod();
	#endif

	#ifdef _800_480  //WVGA
	if((++Dis_Mode)>=VALID_DIR)
		Dis_Mode=TOP_LEFT;
	SET_Dismod();
	#endif
	
    	return 1;
}

#endif

/////////////////


/*
#ifdef TV

bit IRSetupKeyCtrl(void)
{
	if(m_bKyBlocked) return 0;
		if((m_cSource&0x0F)==(isrcTV))
		{
			if((m_cOSDFunc&0xF0)==idTVMENU_VIDEO)
			{
				m_cOSDEvent=FUNCEXIT;
			}
			else if((m_cOSDFunc==0))//&0xF0)==idMAINMENU)
			{
				m_cOSDFunc=idTVMENU_VIDEO;
				m_cOSDEvent=FUNCENTER;
			}
            else return 0;
		}
		else 
			return 0;
	return 1;
}

#endif
*/
/*
bit IRUpKeyCtrl(void)
{

	if(m_bKyBlocked) return 0;

#ifdef TV

    if((m_cOSDFunc&0xF0)==idTVMENU_VIDEO)
    {
	    m_cOSDEvent=FUNCSELCT_DN;
        return 1;
    }

#endif

    switch(m_cOSDFunc)
	{

#ifdef TV

        case    0:
		        {
                    OSDExit();
		            AdjTVChannel(1,0);
		            return 0;
				}

#endif
#ifdef LOAD_TIME
	    case	idBRIGHTMENU:
					m_cOSDFunc=idTIMEMENU;m_cOSDEvent=FUNCENTER;m_cItem=6;break;
#else
	    case	idBRIGHTMENU:
					m_cOSDFunc=idHUEMENU;m_cOSDEvent=FUNCENTER;m_cItem=5;break;
#endif
	    case	idCONTRASTMENU:
	            {
						m_cOSDFunc=idBRIGHTMENU;
						m_cOSDEvent=FUNCENTER;
						m_cItem=1;//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -