📄 ir.c
字号:
#pragma interrupt INTP7 MD_INTP7
#pragma interrupt INTTM000 MD_INTTM000
#include "includes.h"
unsigned char CommParity;
unsigned char UartRxByte;
unsigned char UartBitCount;
unsigned char RcKeyCode;
void IrStartToRx( void )
{
UartBitCount = 9;
UartRxByte = 0;
CommParity = UART_BIT_9_L;
TMIF000 = 0;
TMMK000 = 1;
PMK7 = 0;
PIF7 = 0;
}
void INTP0Init( void )
{
PMK7 = 1;
PIF7 = 0;
ISC.0 = 0;
ClrIORBit( EGP, BIT7 );
SetIORBit( EGN, BIT7 );
PMK7 = 0;
}
__interrupt void MD_INTP7( void )
{
PIF7 = 0;
if ( CommPortChose == 0 )
{
CommPortChose = IR_PORT;
}
_wait_time = COMM_TIMEOUT;
if ( CommPortChose == IR_PORT )
{
PMK7 = 1;
TMMK000 = 1;
TMC00 = 0x00;
CRC00 = 0x00;
PRM00 = 0x01;
CR000 = ( UART_BIT_TIME_1200 + UART_HALF_BIT_TIME_1200 );
TMMK000 = 0;
TMC00 = 0x0C;
}
else if ( CommPortChose == IR_RC )
{
if ( PowerStateFlag &PS_BREAKPOWER_FLAG )
{
IrOn( 15 );
}
else
{
IR_OFF();
}
if ( CommPortChose == IR_RC )
{
if ( ( FramePointer > 16 ) && ( FramePointer <= 24 ) )
{
unsigned short temp = TM00;
RcKeyCode >>= 1;
if ( ( temp >= 2000 ) && ( ( temp <= 2500 ) ) )
{
RcKeyCode &= ( unsigned char ) ( ~ 0x80 );
}
else if ( ( temp >= 4000 ) && ( ( temp <= 5000 ) ) )
{
RcKeyCode |= 0x80;
}
}
TMC00 = 0x00;
if ( FramePointer > 24 )
{
FramePointer = 0;
TMC00 = 0x00;
SYS_EVT_ADD( EVT_RC );
CommPortChose |= COMM_RX_FINISH;
}
else
{
FramePointer++;
TMC00 = 0x0C;
}
}
}
}
__interrupt void MD_INTTM000( void )
{
unsigned char timerAtemp1;
TMIF000 = 0;
TMC00 = 0x00;
CR000 = UART_BIT_TIME_1200;
TMC00 = 0x0C;
timerAtemp1 = IR_RX_IN &IR_RX;
if ( UartBitCount > 1 )
{
UartRxByte >>= 1;
if ( timerAtemp1 )
{
UartRxByte |= 0x80;
CommParity = ~ CommParity;
}
UartBitCount--;
}
else
{
TMC00 = 0x00;
TMMK000 = 1;
if ( timerAtemp1 )
{
if ( ( UART_BIT_9_H == CommParity ) == 0 )
{
FrameBuffer[ 0 ] = 0;
}
}
else
{
if ( ( UART_BIT_9_L == CommParity ) == 0 )
{
FrameBuffer[ 0 ] = 0;
}
}
if ( FramePointer == 0 )
{
if ( UartRxByte == 0 )
{
if ( timerAtemp1 == 0 )
{
CR000 = 0xffff;
CommPortChose = IR_RC;
TMC00 = 0x0C;
}
}
}
RxFrameDispose();
IrStartToRx();
}
}
void IrSendLow( void )
{
TMC00 = 0x0C;
IR_TX_OUT &= ~ IR_TX;
}
void IrSendHigh( void )
{
TMC00 = 0x00;
IR_TX_OUT |= IR_TX;
CommParity = ~ CommParity;
}
void IrSendByte( unsigned short sData )
{
unsigned char sBitCount;
CommParity = UART_BIT_9_L;
sData <<= 1;
sData |= 0x0400;
sBitCount = 11;
TMC00 = 0x00;
PRM00 = 0x01;
CRC00 = 0x00;
CR000 = 26;
TOC00 |= BIT0 | BIT1;
TMC00 = 0x0C;
P0.1 = 0;
_disable_interrupt();
do
{
if ( sBitCount != 2 )
{
if ( sData &0x0001 )
{
IrSendHigh();
}
else
{
IrSendLow();
}
}
else
{
if ( CommParity == UART_BIT_9_H )
{
IrSendHigh();
}
else
{
IrSendLow();
}
}
sData >>= 1;
Delay( UART_BOND_RATE_1200 *4 );
}while ( --sBitCount );
_enable_interrupt();
}
void IrStartToTx( void )
{
unsigned char ii;
IrSendByte( 0xFE );
for ( ii = 0; ii < FrameBuffer[ FRM_DATALEN ] + 12; ii++ )
{
IrSendByte( FrameBuffer[ii] );
}
_sys_evt_add( EVT_INIT_COMM );
}
void IrOff( void )
{
IR_OFF_PD();
}
void IrOn( unsigned char tt )
{
TimerCounter[ TIMER_PROC_IR_TOGGLE ] = tt;
LCD_LIGHT_ON();
}
void IrPrepareForRxFromLowPower( void )
{
INTP0Init();
IrStartToRx();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -