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

📄 mst705Ȧ

📁 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 + -