📄 ir.c
字号:
//-------------------------------
//IR receive program for MXIC demo board:
//2 interrupt were occupy for IR receive
//1: timmer 1 interrupt
//2: external interrupt 1
//
//-------------------------------
//typedef unsigned char BYTE;
typedef unsigned int UINT;
typedef unsigned long ULONG;
//typedef unsigned char BYTE;
//#include "reg52.h"
//#include "public2.h"
//#include <stdio.h> /* define I/O functions */
#include "mxREG52.H"
//#include "Define.H"
#include "Mxic_IR.h"
//#include ".\inc\ir_var.h"
void InitialTimer1(void); //for IR period count
void InitialEx1Int(void); //check edge
bit CheckIrRepeatCode1(void);
extern BYTE GetIrCodeData(void);
extern BYTE GetIrIDData(void);
extern int T0_0Interval;
bit CheckIrCommand(void);
bit CheckIrRepeatCode(void);
bit CheckIrRepeatCode1(void);
//------------------------------------
//------------------------------------
//sbit testpin=P2^0;
//sbit testpin_1=P2^1;
//------------------------------------
union FLAME{
struct IR_ID{
//UINT ID;
BYTE ID0;
BYTE ID1;
BYTE Code0;
BYTE Code1;
}Mcode;
ULONG Code;
}Ir;
BYTE IrCount;//count1;
//UINT RemoteControllerID=0x0099; //for Mintek
union RM_ID{
struct REMOTE_ID{
BYTE MfgId;
BYTE DeviceId;
}Idx;
UINT Code;
}RmId;
//------------------------------------
//------------------------------------
bit FirstEdge;
bit LeadCode; //9ms_______-----4.2ms
//------------------------------------
//------------------------------------
bit EnableIr(void)
{
DisableIr(); //disable first
if ( MxicIr.Bits.b1IrOn == 0 )
{
InitialTimer1(); //for time cnt
InitialEx1Int(); //
//IrOn=1;
MxicIr.Bits.b1IrOn=1;
MxicIr.Bits.b1GetIrFlame=0;
MxicIr.Bits.b1GetIrRepeatCode=0;
MxicIr.Bits.b1GetIrCommand=0;
//initial IR parameters
LeadCode=0;
FirstEdge=0; //start wait IR cycle
}
return( MxicIr.Bits.b1IrOn );
}
//------------------------------------
bit DisableIr(void)
{
if ( MxicIr.Bits.b1IrOn == 1 )
{
MxicIr.Bits.b1IrOn=0;
//for ext_int_1:
EX1=0; //disable Ext_INT_1;
//for timer_int_1
ET1=0; //disable Timer_INT_1;
TR1=0; //stop counting
TH1=0;TL1=0; //clear timer cnt;
// //clear Ir parameters
}
return(MxicIr.Bits.b1IrOn);
}
/*
//------------------------------------
bit CheckIrRepeatCode(void)
{
if ( MxicIr.Bits.b1GetIrRepeatCode )
{
// MxicIr.Bits.b1GetIrRepeatCode=0;
return(1);
}
else
return(0);
// return( MxicIr.Bits.b1GetIrRepeatCode );
}
bit CheckIrRepeatCode1(void)
{
if ( MxicIr.Bits.b1GetIrRepeatCode )
{
MxicIr.Bits.b1GetIrRepeatCode=0;
return(1);
}
else
return(0);
// return( MxicIr.Bits.b1GetIrRepeatCode );
}
*/
//------------------------------------
BYTE GetIrCodeData(void)
{
if ( MxicIr.Bits.b1GetIrFlame == 1 )
{
return(Ir.Mcode.Code0);
}
return(0xff);
}
BYTE GetIrIDData(void)
{
if ( MxicIr.Bits.b1GetIrFlame == 1 )
{
return(Ir.Mcode.ID1);
}
return(0xff);
}
//------------------------------------
//------------------------------------
//timer 1 interrupt rate:
//T=12/14.318M=0.838us
//interrupt rate=0.838us * 65536 = 55ms
//-----------------------------
void InitialTimer1(void) //for IR sampling
{
TF1=1;
TR1=0; //not start counting
ET1=1; //enable Timer_int_1
TMOD= 0x11; //timer1 mod=1 -> 16bits time count
TH1=0;
TL1=0;
//PT1=0; //low priority
}
//------------------------------------
//------------------------------------
void InitialEx1Int(void)
{
EX1=1; //enable external int 1
IT1=1; //negative trigger interrupt
EA=1; //enable all int
}
//------------------------------------
//
//------------------------------------
void timer1_int( void ) interrupt 3 //about 55ms interrupt
{
if ( LeadCode == 1 )
{
MxicIr.Bits.b1GetIrRepeatCode=1;
MxicIr.Bits.b1GetIrFlame = 1;
LeadCode=0;
}
else
{
if(MxicIr.Bits.b1GetIrFlame==1)
MxicIr.Bits.b1GetIrFlame = 0;
MxicIr.Bits.b1GetIrRepeatCode=0;
MxicIr.Bits.b1GetIrCommand=0;
TR1=0;
}
FirstEdge=0; //start wait next cycle
// TR1=0; //stop counting
TH1=0;TL1=0;
}
//------------------------------------
// check timer_1 counter in EX_1 interrupt
//------------------------------------
void Ex1_int( void ) interrupt 2
{
union Counter
{
struct Int1Cnt
{
BYTE HiCnt;
BYTE LoCnt;
}Cnt;
UINT Timer;
}T1;
if ( FirstEdge == 0 )
{
FirstEdge=1;
TH1=0;TL1=0;
TR1=1; //start counting
}
else
{
T1.Cnt.HiCnt=TH1;
T1.Cnt.LoCnt=TL1;
if ( LeadCode == 0)
{
if ( (MxicIr.Bits.b1GetIrFlame == 0)&&(T1.Timer < _LEAD_UPPER) && (T1.Timer > _LEAD_LOWER))
// ((MxicIr.Bits.b1GetIrFlame == 1)&&(T1.Timer > _REPEAT_LOWER)&&( T1.Timer < _REPEAT_UPPER)) )
{
LeadCode=1;
IrCount=0;
}
}
else //LeadCode ==1
{
if(( T1.Timer > _IR_0_LOWER ) && ( T1.Timer < _IR_0_UPPER ))
{
Ir.Code=(Ir.Code << 1)|0x01;
IrCount++;
}
else
if(( T1.Timer > _IR_1_LOWER ) && ( T1.Timer < _IR_1_UPPER ))
{ //got IR logical "1" signal
Ir.Code = Ir.Code << 1;
IrCount++;
}
else
{ //Ir Receive fail condition
IrCount=IrCount; //for debug only
}
if ( IrCount >=32 )
{
MxicIr.Bits.b1GetIrFlame=1;
MxicIr.Bits.b1GetIrCommand=1;
FirstEdge=0; //start wait next cycle
TR1=1; //starting counting
LeadCode=0;
}
}
}
TH1=0;TL1=0;
}
/*BYTE IrFunction(void)
{
BYTE i;
bit IrRepeat;
BYTE GetIr,backupir;//,BakIr
//BYTE val_str[3];
// IrVaild=CheckIrFlame();
// Value_ASCII(GetIrCodeData(), val_str, 0);
// OSD_ShowTitle(val_str, 3);
switch(GetIrCodeData())
{
case 0x5f:
// SHDN_L5V=1;
GetIr=MENU;
break;
case 0xb7:
GetIr=MODE_DEC;
// SHDN_L5V=1;
break;
case 0x9F:
GetIr=UP;
break;
case 0xDF:
GetIr=DOWN;
break;
case 0xef:
GetIr=MODE_DEC;
break;
case 0x8f:
GetIr=ENTER;
break;
case 0x87:
GetIr=POWER;
break;
case 0xA7:
GetIr=IRMUTE;
break;
case 0xBF:
GetIr=IRUP;
break;
case 0x1F:
GetIr=VOLUMADD;
break;
case 0xAF:
GetIr=VOLUMSUB;
break;
case 0x6F:
GetIr=UPDOWN;
break;
case 0x07:
GetIr=LEFTRIGHT;
break;
case 0xCF:
GetIr=CALL;
break;
case 0x4F:
GetIr=DISPLAYSIZE;
break;
default:
GetIr=0x00;
break;
}
if(GetIr!=0x00)
for (i=0; i!=0x0f; i++)
{
T0_0Interval = 500; //reset the Timer interval 10sec.
}
IrRepeat=CheckIrRepeatCode();
if(IrRepeat)
{
GetIr=backupir;
}
backupir=GetIr;
// MxicIr.Bits.b1GetIrFlame = 0;
for(i=0;i<125;i++)
DELAY(20);
return(GetIr);
}
*/
//------------------------------------
//------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -