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

📄 sys_ir.c

📁 其乐达(Cheertek)LCD驱动芯片(CT675)的C51源代码
💻 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 + -