📄 mst705Ȧ
字号:
/******************************************************************************
Copyright (c) 2004 MStar Semiconductor, Inc.
All rights reserved.
[Module Name]: Ir.c
[Date]: 04-Feb-2004
[Comment]:
Remote control subroutines.
[Reversion History]:
*******************************************************************************/
#ifdef IR_RC5
#define _IR_C_
// Common
#include "types.h"
#include "board.h"
// System
#include <intrins.h>
#include "global.h"
#include "ir.h"
//************************************************************************
#define IR_CYCLE_TIME 40// ms(total ir cycle time)
#define ISR_TIMER2_800US 800
#define ISR_TIMER2_400US 400
#define ISR_TIMER2_800US2 760
#define ISR_TIMER2_400US2 360
#define TIMER2_800US_COUNTER (65536-(MCU_XTAL_CLK_MHZ*ISR_TIMER2_800US2+6)/12) // +6 for
#define TIMER2_400US_COUNTER (65536-(MCU_XTAL_CLK_MHZ*ISR_TIMER2_400US2+6)/12) // +6 for
#if( ENABLE_MCU_USE_INTERNAL_CLOCK )
#define NEW_TIMER2_800US_COUNTER (65536-(NEW_MCU_XTAL_CLK_MHZ*ISR_TIMER2_800US+6)/12) // +6 for
#define NEW_TIMER2_400US_COUNTER (65536-(NEW_MCU_XTAL_CLK_MHZ*ISR_TIMER2_400US+6)/12) // +6 for
#endif
#define IR_ADDRESS_MASK 0x1F
#define IR_ADDRESS_CODE 0x00
#define IR_PIN_LEVEL P3_3
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void irDetectTimer0( void )
{
if(--g_wIrTimer == 0)
{
if(g_bIrRepeatStatus)
g_bIrCommand = 1;
}
if(--g_wIrCycleTimer == 0)
{
IrReceiveEnd();
}
/*
//--- IR press 0-9 key ending timer for TUNER Channel---
if ( g_bIrNumKeyStart || g_ucIr100Key ) // IR key start
{
g_wIrNumKeyTimer--;
if ( g_wIrNumKeyTimer == 0 ) // time out
{
//if ( _testbit_( g_bIr100Key ) )
if (g_ucIr100Key)
g_ucIrNumKey = ( g_ucIrNumKey * 10 ) + 100;
g_bIrNumKeyStart = 0;
g_bIrKeyNumEnd = 1;
}
}*///remark off by hyy
}
void irDecodeRepaeat(WORD wRepeatTime)
{
g_wIrTimer = wRepeatTime;
g_bIrCommand = 0;
g_bIrRepeatStatus = 1;
}
void irDecodeEnd( void )
{
g_wIrTimer = IR_REPEAT_START_TIME;
g_bIrCommand = 0;
g_bIrRepeatStatus = 0;
g_ucIrStatus=IR_IDLE;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
void irInterruptProcess(void)
{
if(g_ucIrStatus == IR_IDLE&&g_bIrDetect == 0)
{
g_ucCode = 1;
g_ucIrBitsCnt = 0;
g_ucIrStatus = IR_LEADER;
g_wIrCycleTimer = IR_CYCLE_TIME;
Timer2InitForIr();
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ReformatIRdata(void)
{
BYTE i = 6;
g_ucDataCode = 0;
g_ucSYSCode = 0;
while(i--) //get command code
{
g_ucDataCode>>=1;
if((BYTE)(g_ucCode&0x03)==2)
g_ucDataCode|=0x80;
else if((BYTE)(g_ucCode&0x03)==3||(BYTE)(g_ucCode&0x03)==00)
return FALSE;
g_ucCode>>=2;
}
i = 6;
while(i--) //get address code
{
g_ucSYSCode>>=1;
if((BYTE)(g_ucCode&0x03)==2)
g_ucSYSCode|=0x80;
else if((BYTE)(g_ucCode&0x03)==3||(BYTE)(g_ucCode&0x03)==00)
return FALSE;
g_ucCode>>=2;
}
g_ucDataCode>>=2;
g_ucSYSCode>>=2;
return TRUE;
}
void CheckIrdetected(void)
{
BYTE PreDataCode;
if(!ReformatIRdata())
return;
//IR_PUTSTR("\r\nReformatIRdata");
if((g_ucSYSCode&IR_ADDRESS_MASK) == IR_ADDRESS_CODE)
{
if(g_ucSYSCode == g_ucPreSYSCode)
g_bIrRepeat = 1;
else
g_bIrRepeat = 0;
g_ucPreSYSCode = g_ucSYSCode;
PreDataCode = g_ucIrCode;
//if code change, ir repeat flag must be changed, otherwise it is incorrect code
if((!g_bIrRepeat)||(PreDataCode == g_ucDataCode))
{
g_bIrDetect = 1;
g_ucIrCode = g_ucDataCode;
}
}
else
return;
if(g_bIrDetect&&!g_bIrRepeat&&!g_bIrRepeatStatus)
g_bIrCommand = 1;
}
void IrReceiveEnd(void)
{
ET2 = 0; // disable timer2 interrupt
TR2 = 0; // stop timer2
if(g_ucIrBitsCnt == 27)
CheckIrdetected();
g_ucIrStatus = IR_IDLE;
}
void Timer2InitForIr(void)
{
#if( ENABLE_MCU_USE_INTERNAL_CLOCK )
if( g_bMcuUseNewClock )
{
TH2 = HIBYTE(NEW_TIMER2_400US_COUNTER);
TL2 = LOBYTE(NEW_TIMER2_400US_COUNTER);
}
else
#endif
{
TH2 = HIBYTE(TIMER2_400US_COUNTER);
TL2 = LOBYTE(TIMER2_400US_COUNTER);
}
PT2 = 1;
TR2 = 1; // timer1 run
ET2 = 1; // enable TIMER0 interrupt
}
void irDetectTimer1(void)
{
TF2 = 0;
#if( ENABLE_MCU_USE_INTERNAL_CLOCK )
if( g_bMcuUseNewClock )
{
TH2 = HIBYTE(NEW_TIMER2_800US_COUNTER);
TL2 = LOBYTE(NEW_TIMER2_800US_COUNTER);
}
else
#endif
{
TH2 = HIBYTE(TIMER2_800US_COUNTER);
TL2 = LOBYTE(TIMER2_800US_COUNTER);
}
if(g_ucIrBitsCnt < 27)
{
if(IR_PIN_LEVEL)
{
g_ucCode <<= 1;
g_ucCode |= _BIT0;
}
else
{
g_ucCode <<= 1;
g_ucCode &= ~_BIT0;
}
g_ucIrBitsCnt++;
g_ucIrStatus = IR_CODE;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -