📄 keypad.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 + -