📄 main.c
字号:
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include "I2C.h"
#include "common.h"
#include "define.h"
#include "delay.h"
#include "ir.h"
#include "KeyMap.h"
void VideoSet(uchar x);
void MpegReset(void);
void CpuInit(void);
void Mute(bool _onoff);
void ScanPanelKey(void);
void HandleKey(void);
void KeyWait(uint Tcnt,uchar keyval);
void WaitDvdPwrDown(void);
uchar TwoSecondCnt=0;
enum system_Status
{
DVD,
AVIN,
AVIN1,
AVIN2,
AVIN3
}SystemInputStatus;
enum video
{
VIDEO1,
VIDEO2,
VIDEO3,
VIDEO4
}VideoStatus;
bit SimulateIRStatus;
bit MuteStatus;
bit PLScanStatus;
bit StandbyStatus;
uchar RmtRevStatus;
uchar _bIRKey;
uchar RptKeyTimer;
uchar idata RmtData[4];
#ifdef USE_STCMCU_EEPROM
uchar accLastMemoryFlag=0;
uchar accLastMemoryFlag1=0;
#endif
main( )
{
Mute(MUTEON);
RstMpegIo=0;
PowerIo=PowerOff;
PowerOutIo=PWROUTOFF;
SystemInputStatus=DVD;
StandbyStatus=IsStandby;
CpuInit();
#ifdef POWER_LAST_MEMORY
accLastMemoryFlag=Stc89x_byte_read(ACCADDRESS);
Delay100us();
accLastMemoryFlag1=Stc89x_byte_read(ACCADDRESS1);
#endif
while(1)
{
ScanPanelKey( );
HandleKey();
}
}
void VideoSet(uchar x)
{
switch(x)
{
case DVD:
AVCtrlAIo=0;
AVCtrlBIo=0;
break;
case AVIN:
AVCtrlAIo=0;
AVCtrlBIo=1;
break;
case AVIN1:
AVCtrlAIo=0;
AVCtrlBIo=1;
break;
case AVIN2:
AVCtrlAIo=1;
AVCtrlBIo=0;
break;
}
}
#define ANDKEY 0x03
#define PORTX P1
void ScanPanelKey(void)
{
uchar Temp1,Temp2;
if((_bIRKey!=IR_NONE)||((PLScanStatus==NotAllowScan)))return;
PLScanStatus=NotAllowScan;
#ifdef POWER_LAST_MEMORY
if((accLastMemoryFlag||accLastMemoryFlag1)&&MasterPwrChkIo==MasterPwrOn&&StandbyStatus==IsStandby)
{
_bIRKey=IR_ACC_POWER;
return;
}
#endif
if(MasterPwrChkIo==MasterPwrOff&&StandbyStatus==IsNotStandby)
{
_bIRKey=IR_ACC_POWER;
return;
}
Temp1=PORTX&ANDKEY;
if((MasterPwrChkIo==MasterPwrOn)&&(Temp1==ANDKEY))return;
Delay25ms(1);
Temp2=PORTX&ANDKEY;
if((MasterPwrChkIo==MasterPwrOn)&&(Temp1!=Temp2))return;
switch(Temp2)
{
case 0x01://power
_bIRKey=IR_PNL_POWER;
KeyWait(250,Temp2);//250ms
break;
case 0x02://eject
_bIRKey=IR_PNL_EJECT;
KeyWait(250,Temp2);//250ms
break;
#ifndef OnlyPanelKey
case 0x6F://next
_bIRKey=IR_PNL_NEXT;
KeyWait(250,Temp2);//250ms
break;
case 0x77://pre
_bIRKey=IR_PNL_PREV;
KeyWait(250,Temp2);//250ms
break;
case 0x7B://src
_bIRKey=IR_PNL_AV_IN;
break;
case 0x7D://stop
_bIRKey=IR_PNL_STOP;
KeyWait(250,Temp2);//250ms
break;
case 0x7E://play
_bIRKey=IR_PNL_PLAY_PAUSE;
KeyWait(1000,Temp2);//1000ms
break;
#endif
default:
_bIRKey=IR_NONE;
}
}
void KeyWait(uint Tcnt,uchar keyval)
{
uchar Tmp1;
#ifdef STC12C2052
Tcnt*=10*10;
#endif
#ifdef STC89C52
Tcnt*=10;
#endif
while(Tcnt--)
{
Tmp1=PORTX&ANDKEY;
if(Tmp1!=keyval)break;
Delay100us();
}
}
void HandleKey(void)
{
#if (defined(VEBAIRKEY)||defined(VEBAIRKEY48)||defined(BOAIRKEY)||defined(MD10IRKEY))
if(_bIRKey>MAXKEY)return;
_bIRKey=KeyMap[_bIRKey];
#endif
if(_bIRKey==IR_NONE)return;
EX0=0;
TR0=0;
switch(_bIRKey)
{
case IR_AV_IN://av_in key
Mute(MUTEON);
Delay25ms(4);
switch(SystemInputStatus)
{
case DVD:
SimulateIRSendKey(IR_POWER);
VideoSet(AVIN);
Delay25ms(40);
Mute(MUTEOFF);
WaitDvdPwrDown();
SystemInputStatus=AVIN1;
RstMpegIo=0;
break;
case AVIN:
SystemInputStatus=DVD;
MpegReset();//reset mpeg
StandbyStatus=IsNotStandby;
VideoSet(DVD);
Delay25ms(40);
Mute(MUTEOFF);
Delay25ms(20);
break;
default:
SystemInputStatus=DVD; // anti disturb
}
break;
case IR_MUTE:
if(SystemInputStatus==DVD)
{
SimulateIRSendKey(IR_MUTE);
break;
}
if(MuteStatus==IsMute)
{
Mute(MUTEOFF);
}
else
{
Mute(MUTEON);
}
break;
case IR_POWER://power down
if(StandbyStatus==IsStandby)
{
MasterPwrChkIo=1;
if(MasterPwrChkIo==MasterPwrOn)//check master power
{
Mute(MUTEON);
Delay25ms(2);///50ms
PowerIo=PowerOn;
PowerOutIo=PWROUTON;
Delay25ms(2);///50ms
VideoSet(DVD);
MpegReset();
Delay25ms(80);///1s
#ifdef POWER_LAST_MEMORY
accLastMemoryFlag=0;
Stc89x_sector_erase(ACCADDRESS);
Delay25ms(1);
Stc89x_byte_write(ACCADDRESS,accLastMemoryFlag);
accLastMemoryFlag1=0;
Stc89x_sector_erase(ACCADDRESS1);
Delay25ms(1);
Stc89x_byte_write(ACCADDRESS1,accLastMemoryFlag1);
#endif
StandbyStatus=IsNotStandby;
SystemInputStatus=DVD;
Mute(MUTEOFF);
}
}
else
{
Mute(MUTEON);
#ifdef POWER_LAST_MEMORY
accLastMemoryFlag=0;
accLastMemoryFlag1=0;
if(MasterPwrChkIo==MasterPwrOff)
{
accLastMemoryFlag=1;
accLastMemoryFlag1=1;
}
Stc89x_sector_erase(ACCADDRESS);
Delay25ms(1);
Stc89x_byte_write(ACCADDRESS,accLastMemoryFlag);
Stc89x_sector_erase(ACCADDRESS1);
Delay25ms(1);
Stc89x_byte_write(ACCADDRESS1,accLastMemoryFlag1);
#endif
if(SystemInputStatus==DVD)
{
SimulateIRSendKey(IR_POWER);
WaitDvdPwrDown();//about x seconds
}
else
{
VideoSet(DVD);
}
Delay25ms(40);//about x seconds
StandbyStatus=IsStandby;
RstMpegIo=0;
PowerIo=PowerOff;
PowerOutIo=PWROUTOFF;
Delay25ms(40);//about x seconds
}
break;
case IR_USB:
SimulateIRSendKey(IR_USB);
Delay25ms(120);
break;
case IR_VOLADD:
case IR_VOLDEC:
Mute(MUTEOFF);
default:
SimulateIRSendKey(_bIRKey);
Delay25ms(4);
break;
}
_bIRKey=IR_NONE;
EX0=1;
TR0=1;
}
void CpuInit(void)
{
#if 1
PX0=1;
PX1=1;
PT0=0;
PT1=0;
//PT2=0;
//TMOD=0x21;
TMOD=0x11;
//EXEN2 =0;
//C_T2 =0;
//CP_RL2=1;
//TH2 =TIMER2TH;
//TL2 =TIMER2TL;
TH0 = TIMER0TH;
TL0 = TIMER0TL;
IT0=1;//Trigged by up to down --------|_____
IT1=1;
EX0=1;
EX1=0;
ET0=1;
ET1=1;
//ET2=1;
//ES=1; /*开串口中断*/
//SCON=0x50;/* 串行口工作在方式3 */
//PCON=0x80; //PCON = PCON & 0x7f;/* SMOD=0 */
TH1 =TIMER1TH; /*计数常数0xff,波特率:115200 晶振:12MHz */
TL1 =TIMER1TL;
TR0=1;
TR1=1;
//TR2=1;
IE1=0;
EA=1;
#endif
}
void MpegReset(void)
{
RstMpegIo=0;
Delay25ms(2);
RstMpegIo=1;
}
void Mute(bool _onoff)
{
if(_onoff)
{
MuteStatus=IsMute;
MuteIo=MUTEON;
}
else
{
MuteStatus=IsNotMute;
MuteIo=MUTEOFF;
}
}
void WaitDvdPwrDown(void)
{
TwoSecondCnt=0;
while(TwoSecondCnt<=XSECOND)
{
if(DVDPDownIo==HIGH)
{
Delay25ms(2);
if(DVDPDownIo==HIGH)break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -