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

📄 ir.c

📁 用IO口模拟红外通讯应用程序
💻 C
字号:
#include "includes.h"

unsigned char CommParity;
unsigned char UartRxByte;
unsigned char UartBitCount;
unsigned char RcKeyCode;

void _ir_start_to_rx(void)
{
    UartBitCount=9;
    UartRxByte=0;
    CommParity=UART_BIT_9_L;
    IR_RX_IFG&=~(IR_RX);
    IR_RX_IE|=IR_RX;
}

#pragma vector=PORT1_VECTOR
__interrupt void Port1(void)
{
    if(P1IFG&IR_RX)
    {
        if( !CommPortChose )
            CommPortChose=IR_PORT;

        _wait_time=COMM_TIMEOUT;

        if( CommPortChose == IR_PORT )
        {
            CCR0=TAR+UART_BIT_TIME_1200+(unsigned char)(UART_BIT_TIME_1200/2);
            TACTL=TASSEL_1+MC_2; //ACLK+Contious mode
            TACCTL0=CCIE;
            P1IE&=~(IR_RX);
        }
        else if( CommPortChose == IR_RC )
        {        
            if(PowerStateFlag&PS_BREAKPOWER_FLAG)
            {
                _ir_on(15);
            }	        
            else
            {
                IR_OFF();
            }        
            if(rx_frame()==OK)
            {
                CommPortChose |= COMM_RX_FINISH;
                _BIC_SR_IRQ(LPM3_bits);
            }
        }
    }    
    if(P1IFG&PWR_F0)
    {
        if(!IsPowerOn())
        {
            SystemIndication|=EVT_POWER_DOWN;
            _BIC_SR_IRQ(LPM3_bits);
        }
    }
    P1IFG=0;
}


#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA (void)
{
    unsigned char timerAtemp1;

    CCR0+=UART_BIT_TIME_1200;
    
    //read bit value here
    timerAtemp1=IR_RX_IN&IR_RX;
    
    if(UartBitCount>1)
    {
        UartRxByte>>=1;
        if(timerAtemp1)
        {
            UartRxByte|=0x80;
            CommParity=~CommParity;
        }
        UartBitCount--;
    }
    else
    {
        if(timerAtemp1)
        {
            if(!(UART_BIT_9_H==CommParity)) FrameBuffer[0]=0;
        }
        else
        {
            if(!(UART_BIT_9_L==CommParity)) FrameBuffer[0]=0;
        }
        TACCTL0=0;
        TACTL=MC_0;
        if(rx_frame()==OK)
        {
            CommPortChose |= COMM_RX_FINISH;
            _BIC_SR_IRQ(LPM3_bits);
        }
        
        if(FramePointer==0)
        {
            if(UartRxByte==0)
            {
                if(timerAtemp1==0)
                {
                    CommPortChose = IR_RC;
                }
            }
        }
        
        _ir_start_to_rx();
    }
}

void _ir_tx_low(void)
{
    TACTL |=MC0;
    P2SEL |= IR_TX;
}

void _ir_tx_high(void)
{
    TACTL &=(~MC0);
    P2OUT |= IR_TX;
    P2SEL &= ~IR_TX;
    CommParity=~CommParity;
}

/*Send one byte(11bits)*/
void _ir_send_byte(unsigned short sData)
{
    unsigned char sBitCount;
    
    CommParity=UART_BIT_9_L;
    sData<<=1;
    sData|=0x0400;
    sBitCount=11;
                  
    _DINT();
    CCR0=(unsigned short)(IR_CAR_GEN/2);
    IR_TX_CCR=(unsigned short)(CCR0/2);
    TACTL=TASSEL_2+TACLR;
    IR_TX_TACCTL=OUTMOD_4;
        
    do{
        if(sBitCount!=2)
        {
            if(sData&0x0001)
                _ir_tx_high();
            else
                _ir_tx_low();
        }else{
            if(CommParity==UART_BIT_9_H)
                _ir_tx_high();
            else
                _ir_tx_low();
        }
        sData>>=1;
        Delay(865);
    }while(--sBitCount);
    _EINT();
}

void _ir_start_to_tx(void)
{
    unsigned char i;

    _ir_send_byte(0xFE);
    
    for( i = 0; i < FrameBuffer[FRM_DATALEN]+12; i++ )
    {
        _ir_send_byte( FrameBuffer[i] );
    }
    
    _sys_evt_add(EVT_INIT_COMM);
}

void _ir_off(void)
{
    IR_OFF_PD();
}

void _ir_on(unsigned char tt)
{
    TimerCounter[TIMER_PROC_IR_TOGGLE]=tt;
    LCD_LIGHT_ON();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -