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

📄 keypad.c

📁 TFT LCD驱动芯片T100A+AU7" Source code
💻 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"

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;

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_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;
void kyKeypadInit(void)
{
	m_wAccelPollCnt=0;
	m_cCurreKey=m_cPreKey=0xFF;
	m_cOSDEvent=0;
	m_cOSDFunc=0;
	m_cItem=1;
}

void kyKeypad(void)
{
    if(kyKeypadScan())
	  {
		    Timer0Reset();
		    kyFindFunc ();
				twdDelay   (8);
  	}
	  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;

#define OPEN      1
#define CLOSE     2
#define MENU_SEL  3
#define SEL_OUT   4


#define SEL_ON    1
#define SEL_OFF   0

unsigned char  Menu_Flag   = CLOSE;



bit kyFindEvent(void)
{
	  if(m_cCurreKey==kySOURCE)
  	{
   	    return IRSourceSelKeyCtrl();//kyEXITEvent();
	  }
	  else if(m_cCurreKey==kyMENU)
 	  {
 	      if(m_cOSDEvent == CLOSEMENU)
 	      {
            return kyMENUEvent();
 	      }
				else
				{
            if(m_cItem == 6)
            {
                Menu_Flag = CLOSE;
								return kyMENUEvent();
            }
            return IRDownKeyCtrl(); //kyDECREASEEvent();
				}

	  }
	  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();
		    }//Kuo
//kyEXITEvent();//IRSourceSelKeyCtrl();
//		return rmP_STDEvent();
	  }
	  else if(m_cCurreKey==kyPOWER)
	  {
 		    return kyPOWEREvent();
	  }
}

//Ruby add 2004-06-07
bit kySCALEREvent(void)
{
   m_cScaleratio++;
   if(m_cScaleratio>=ScaleEnd)
     m_cScaleratio=ScaleFULL;
   IRScaleratioCtrl();
   OSDShowRatio();
   return 1;
}

bit kyMENUEvent(void)
{
	  if(m_bKyBlocked)  return 0;
#ifdef TV
    if((m_cOSDFunc&0xF0)==idTVMENU_VIDEO)
	  {
        m_cOSDEvent = CLOSEMENU;
		    m_cItem     = 1;
		    return 1;
	  }
#endif
		switch(m_cOSDFunc)
		{
		    case	0:
				    m_cOSDFunc  = idBRIGHTMENU;
						m_cOSDEvent = FUNCENTER;
						m_cItem     = 1;
						break;
#ifdef TV
			  case	idBRIGHTMENU:
			  case	idCONTRASTMENU:
			  case	idSHARP_VIDEO:
			  case	idSATMENU_VIDEO:
			  case	idHUEMENU_VIDEO:
          if((m_cSource&0x0F)==(isrcTV))
					{
              m_cOSDFunc  = idTVMENU_VIDEO;
							m_cOSDEvent = FUNCENTER;
							m_cItem     = 1;break;//Kuo
					}
					else
          {
              m_cOSDEvent = CLOSEMENU;
              m_cItem     = 1;
               break;
          }
#endif
			default:
          m_cOSDEvent = CLOSEMENU;
          m_cItem     = 1;
          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;
			  }
#else
        IRVolUpKeyCtrl();
#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;
			  }
#else
IRVolDownKeyCtrl();
#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)
{
	if(m_bFactryReady)
	{
  	m_cOSDEvent=OPENMENU;
		m_cOSDFunc=idFCTRYMENU;
		m_cFactryCnt=0;
		m_bFactryMode = 1;
		m_bFactryReady=0;
	}
	else
	{
		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 = 9; //KEY_SEL_POLL_COUNT;
			      }
			      else if((m_cOSDEvent == FUNCADJ_IN)||(m_cOSDEvent == FUNCADJ_DN)) //FUNCADJ_DN
			      {
		   	        m_wAccelPollCnt = 9; //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

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


/*
#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;
#endif
    switch(m_cOSDFunc)
	  {
#ifdef TV
        case 0:
            OSDExit();
            AdjTVChannel(1, 0);
            return 0;
#endif
        case idLANGUAGE_MENU:
					  m_cOSDFunc  = idHUEMENU_VIDEO;
						m_cOSDEvent = FUNCSEL_UP;
						m_cItem     = 5;
            break;
	      case idBRIGHTMENU:
				    m_cOSDFunc  = idLANGUAGE_MENU;  //idHUEMENU_VIDEO;
						m_cOSDEvent = FUNCSEL_UP;
						m_cItem     = 6;
						break;
	      case idCONTRASTMENU:
						m_cOSDFunc  = idBRIGHTMENU;
						m_cOSDEvent = FUNCSEL_UP;
						m_cItem     = 1;//

⌨️ 快捷键说明

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