📄 sys_ir.c
字号:
#include "INC\SYS_DECLARE.H"
#include "INC\SYS_GLOBAL.H"
#include "INC\SYS_IR.H"
// NEC IR code definition
#define CHECK_LEADING_CODE 0
#define CHECK_CUSTOM_CODE 8
#define CHECK_CUSTOM_CODE_NOT 16
#define CHECK_DATA_CODE 24
#define CHECK_DATA_CODE_NOT 32
#define TH1_13mS 0x65 // 26000=0x6590
#define TH1_14mS 0x6D // 28000=0x6D60
#define TH1_1125uS_MIN 0x06 // 1125*2=2250=0x08CA
#define TH1_1125uS_MAX 0x0A // --> 07-09
#define TH1_2250uS_MIN 0x0F // 2250*2=4500=0x1194
#define TH1_2250uS_MAX 0x13 // --> 10-12
//--------------------------------------------------------------------------
// | 9mS |4.5mS| 0 | 1 |
// IR recv. --\_________/-----\_/-\_/---\_/
// Int1 ^ 13.5mS ^ ^ ^
// | |
// | +--- 2.25mS =2250uS
// +-------- 1.125mS=1125uS
//
//--------------------------------------------------------------------------
BYTE gbIrStage, gbTH1, gbIrMask;
BOOL gfIrTimeOut;
//--------------------------------------------------------------------------
// Function : Timer1ISR
// Description : 1. Timer1 time out interrupt(32.768 mS)
//--------------------------------------------------------------------------
void Timer1_ISR(void) interrupt 3
{
gfIrTimeOut = TRUE;
TR1 = FALSE; // Stop Timer1
}
//--------------------------------------------------------------------------
void SYS_IR_Initial(void)
{
TMOD &= 0x0F;
TMOD |= 0x10; // Timer1 : 16 bit timer
TR1 = 1; // Start Timer1, remote control timer
ET1 = 1; // Enable Timer1 interrupt
IT1 = 1; // Set INT1 to edge trigger, IR Interrupt
EX1 = 1; // Enable INT1 interrupt
gfIrTimeOut = FALSE;
gbIrStage = CHECK_LEADING_CODE;
gfIrKeyReady = FALSE;
}
//--------------------------------------------------------------------------
void _CheckIrData(BYTE *bData)
{
if ((gbTH1 > TH1_1125uS_MIN) && (gbTH1 < TH1_1125uS_MAX))
{
*bData &= ~gbIrMask;
gbIrStage++;
gbIrMask <<= 1;
if(gbIrMask == 0) gbIrMask = 0x01;
}
else if ((gbTH1 > TH1_2250uS_MIN) && (gbTH1 < TH1_2250uS_MAX))
{
*bData |= gbIrMask;
gbIrStage++;
gbIrMask <<= 1;
if(gbIrMask == 0) gbIrMask = 0x01;
}
else
{
gbIrStage = CHECK_LEADING_CODE;
}
}
//--------------------------------------------------------------------------
// Function : INT1ISR
// Description : Interrupt 1 ISR
// 1. Read Timer0 counter and set remote-control data
//--------------------------------------------------------------------------
void Int1_ISR(void) interrupt 2
{
if(gfIrKeyReady) return;
TR1 = FALSE; // Stop counter
gbTH1 = TH1;
TH1 = 0;
TL1 = 0;
TR1 = TRUE; // Start Timer1
if (gfIrTimeOut) // 32mS TimeOut
{
gfIrTimeOut = FALSE;
gbIrStage = CHECK_LEADING_CODE;
return;
}
if(gbIrStage == CHECK_LEADING_CODE)
{
if ((gbTH1 > TH1_13mS) && (gbTH1 < TH1_14mS))
{
gbIrStage++;
gbIrMask = 0x01;
}
return;
}
else if((gbIrStage > CHECK_LEADING_CODE) && (gbIrStage <= CHECK_CUSTOM_CODE))
{
_CheckIrData(&gbIrCustomCode);
}
else if((gbIrStage > CHECK_CUSTOM_CODE) && (gbIrStage <= CHECK_CUSTOM_CODE_NOT))
{
_CheckIrData(&gbIrCustomCodeNot);
}
else if((gbIrStage > CHECK_CUSTOM_CODE_NOT) && (gbIrStage <= CHECK_DATA_CODE))
{
_CheckIrData(&gbIrDataCode);
}
else if((gbIrStage > CHECK_DATA_CODE) && (gbIrStage <= CHECK_DATA_CODE_NOT))
{
_CheckIrData(&gbIrDataCodeNot);
}
if(gbIrStage == CHECK_DATA_CODE_NOT)
{
gbIrStage = CHECK_LEADING_CODE;
gfIrKeyReady = TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -