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

📄 keypad.c

📁 宏芯T102芯片驱动(51单片机作主控)
💻 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 "TW101Reg.h"
#include "OSDDraw.h"
#include "OSDCtrl.h"
#include "TwoWire.h"
#include "Display.h"
#include "T101_Util.h"
#include "video.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);
extern bit ChangeLang;
extern bit Key;
extern bit AdjustSig;
#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;

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, 0x1f, 0x00
};

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

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_cOSDFactoryMenu;
extern uCHAR idata m_cSource;
extern uCHAR idata m_cMode;

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_cLang;
uCHAR idata ChangeTime;
extern EEPVIDEO idata EepVideo;
void kyKeypadInit(void)
{
	m_wAccelPollCnt=0;
	m_cCurreKey=m_cPreKey=0xFF;
	m_cOSDEvent=0;
	m_cOSDFunc= 0;
	m_cOSDMenu=idNULLMENU;
	m_cOSDFactoryMenu=ifaNULLMENU;
}

void kyKeypad(void)
{
	if(kyKeypadScan())
	{
		Timer0Reset();
		kyFindFunc();
		//kyFindEvent();//add by cwyong 
  	}
	else
		m_cPreKey=m_cCurreKey;

//	if((m_cCurreKey == kySOURCE)&&((m_cSource == isrc_T515_CVIDEO1)||(m_cSource == isrc_T515_CVIDEO2)))
//		kyPOWEREvent();
}

bit kyKeypadScan(void)
{
	uCHAR cTemp;
	while(1)
	{
		
			cTemp=ReadPort();
			//if(cTemp)
			//	Tpoint=~Tpoint;
			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;
			else if(!m_cCurreKey) //no key pressed
				return 0;
		}
		
#else
	if(m_cCurreKey==m_cPreKey)
		return 0;
	else
		return 1;
#endif
	}
	/*
	cTemp=ReadPort();
	m_cCurreKey=sKeyFlds.cMask&(0xFF-cTemp);
	return 1;
	*/
}

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

	
/*	if(!kyIncPollCount())
	{
       	//Tpoint = ~ Tpoint;
		if(kyFindEvent())
			OSDEventMgr();
	} */

}

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)
 	{
		if(AdjustSig==1)
		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)
{
   m_cOSDMenu=idNULLMENU;
	m_cOSDFunc=0;
	m_cOSDEvent=CLOSEMENU;
	OSDClearPage();
	OSDEnable();
   if(AdjustSig==0)
   	OSDInit();	
   m_cScaleratio++;
   if(m_cScaleratio>=ScaleEnd)
     m_cScaleratio=ScaleFULL;
   IRScaleratioCtrl();
   OSDShowRatio();
   return 1;
}

bit kyMENUEvent(void)
{
	if(AdjustSig == 0)
		Key = 1;
	else if(AdjustSig == 1)
		Key = 0;
	if(m_bKyBlocked)
		return 0;
		//if(FactoryModeEn==0)
		//{
			switch(m_cOSDMenu)
			{
				case	idNULLMENU:
				    m_cOSDMenu=idVIDEOMENU;m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=OPENMENU;ChangeTime=0;
					if(AdjustSig == 0)	OSDInit();
					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; */
			 	case	idVIDEOMENU:
					if((m_cOSDFunc==idLANGUAGEMENU)&&(ChangeTime%2==0))
					{
								m_cOSDMenu=idNULLMENU;
								m_cOSDFunc=0;
								m_cOSDEvent=CLOSEMENU;
								OSDClearPage();
								OSDEnable();	
					}
					else if((m_cOSDFunc==idLANGUAGEMENU)&&(ChangeTime%2==1))
					{
							m_cOSDEvent = FUNCADJ_IN;
							m_cLang++;
							if(m_cLang>=L_END)  m_cLang=L_ENGLISH;
							if(m_cLang<L_ENGLISH) m_cLang=L_CHINESE;
							I2CWriteByte(EEPVIDEOBLOCK,idVIDEO_LANGUAGE_INDEX,m_cLang);
							OSDInit();
							SourceSelect();	
							m_cOSDMenu=idVIDEOMENU;m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=OPENMENU;ChangeTime=0;		
					}
					else
						IRDownKeyCtrl();
					break;
			   }
		//	}
		/*
		else if(FactoryModeEn==1)
		{ 
			if(m_cOSDFunc ==ifaHUEMENU)
			{
				m_cOSDMenu=ifaNULLMENU;
				m_cOSDFunc=0;
				m_cOSDEvent=CLOSEMENU;
				m_cItem=0;
				FactoryModeEn=0;
				OSDClearPage();
				OSDEnable();
			}
			else 
				IRDownKeyCtrl();
			
		}	 					
   	    */
	return 1;
		
}


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

		switch(m_cOSDFunc)
		{
			case	idNULLMENU:
					//m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=FUNCENTER;m_cItem=1;break;
					m_cOSDMenu=idVIDEOMENU;m_cOSDFunc=idBRIGHTMENU;m_cOSDEvent=OPENMENU;m_cItem=1;break;
			case	idBRIGHTMENU:
					m_cOSDFunc=idCONTRASTMENU;m_cOSDEvent=FUNCENTER;m_cItem=2;break;
			case	idCONTRASTMENU:
					m_cOSDFunc=idSHARPMENU;m_cOSDEvent=FUNCENTER;m_cItem=3;break;
			case	idSHARPMENU:
					{
						m_cOSDFunc=idSATMENU;
						m_cOSDEvent=FUNCENTER;
						m_cItem=4;
					}
					break;
			case	idSATMENU:
					m_cOSDFunc=idHUEMENU;m_cOSDEvent=FUNCENTER;m_cItem=5;break;
			case	idHUEMENU:
					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
/*			
			//add by zjl
			OSDPosition(CENTER);
			OSDEnable();					   
			m_cOSDEvent=FUNCADJ_IN;
			AdjVolume(1);
			OSDDrawGauge(EepVideo.cVolume,0xff,0,7,COL_GAUGE);
				OSDDrawNum  (EepVideo.cVolume,0xff,NUM_STAT,7,0x09,DRAW_BLANK|0x03); 
			// end of by zjl
*/			
		}
  		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
/*			
			//add by zjl
			OSDPosition(CENTER);
			OSDEnable();						
			m_cOSDEvent=FUNCADJ_DN;
			AdjVolume(-1);
			OSDDrawGauge(EepVideo.cVolume,0xff,0,7,COL_GAUGE);
			OSDDrawNum  (EepVideo.cVolume,0xff,NUM_STAT,7,0x09,DRAW_BLANK|0x03); 
			//end of by zjl
*/			
		}
  		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;
		Audio0 = 1;	//add by cwyong for audio
		Audio1 = 1;
		twdDelay(100);
	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 KVGA
  if((Dis_Mode++)>=VALID_DIR)
     Dis_Mode=TOP_LEFT;

	SET_Dismod();
#endif

#ifdef WVGA
  if((Dis_Mode++)>=VALID_DIR)
     Dis_Mode=TOP_LEFT;

	SET_Dismod();
#endif

    return 1;
}

#endif

 bit kyRotate()
{
#ifdef KVGA
  	if(kBLACK == 0 )
     	Dis_Mode=TOP_LEFT;
	else if(kBLACK == 1)
		Dis_Mode = BOTTOM_RIGHT	;
	SET_Dismod();
	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 + -