ir.c
来自「CS8955控制TV软件。用MCU做模拟电视的控制。」· C语言 代码 · 共 239 行
C
239 行
/******************************************************************************\
Project Version: MTKCARDVD()
********************************************************************************
Filename: ir.c
Author: Bonson chen
Company: CoreTek/ACT Company
********************************************************************************
File Version: 1.01
File Created: July 2007
Compiled Using: keil uVision2 Version 2.23
********************************************************************************
Files Required:
********************************************************************************
File Description:
********************************************************************************
File History:
--------------------------------------------------------------------------------
Date Name Description
--------------------------------------------------------------------------------
Mar. 2007 bonson chen File Created
\******************************************************************************/
#define _IR_RECV_C_
#pragma NOAREGS
#include "Global.h"
#include "key.h"
#include "irkey.h"
// static variables
// *********************************************************************
// Function : void vIrInit(void)
// Description : Called when system initial, to reset IR and UI
// Parameter : None
// Return : None
// *********************************************************************
void vInitIRVar(void)
{
// reset IR related variable
_bIR0 = IR_NONE;
_fgIRKeyValid = FALSE;
_bPlaypostKey = IR_NONE;
_bIRKey0 = IR_NONE;
_bIRLongPush = IR_NONE;
LongPushCount = 0;
_bRemoteTimer = 0;
}
#define IR_OVERFLOW 250 /* 38 ms */
#define IR_LEAD_CENTER 23 /* 3.37 ms */
#define IR_REPEAT_CENTER 14 /* 2.25 ms */
#define IR_DATA_CENTER 8 /* 1.21 ms */
#define IR_LEADH_MAX 93
#define IR_LEADH_MIN 80 //measure is 83 //87
#define IR_LEADL_MAX 48
#define IR_LEADL_MIN 38 //35 //measure is 40 //40
#define IR_DATA1_MAX 20
#define IR_DATA1_MIN 9
#define IR_DATA0_MAX 6
#define IR_DATA0_MIN 2
#define IR_REPEAT_MIN 15//measure is 18 //19
#define IR_REPEAT_MAX 24
#define IR_PULSE_MAX 7
#define IR_PULSE_MIN 4
#define IR_HEAD_TIMER 13500
#define IR_CONHEAD_TIMER 11250
#define IR_HEAD_MISTAKE 400
#define IR_DIGITAL1_TIMER 2250
#define IR_DIGITAL0_TIMER 1125
#define IR_DIGITAL_MISTAKE 200
void vDelay100us(void)
{
BYTE c;
for (c=0;c<28;c++)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
}
/************************************************************************
Function :
Description :
Parameter :
Return :
************************************************************************/
BYTE bRemoteDetect(void)
{
BYTE bCount, i, j;
BYTE bCodes[4];
BYTE bByte;
// ********** Leader signal (low 9ms + high 4.5 ms) **********
for (bCount=0; (!PIN_IR); bCount++) vDelay100us(); //Leader signal low = 9ms
if ((bCount < IR_LEADH_MIN) || (bCount > IR_LEADH_MAX))
{
return(IR_NONE);
}
for (bCount = 0; ((PIN_IR) && (bCount < (IR_LEADL_MAX+10))); bCount++) vDelay100us(); //Leader signal high = 4.5ms
if ((bCount < IR_LEADL_MIN) || (bCount > IR_LEADL_MAX)) // outside high 4.5 range
{ // consider same key is pressed
// if input the same key, only leader code is sent
// low (9ms) , high (2.25), low (0.56)
// if ((bCount >= IR_REPEAT_MIN) && (bCount <= IR_REPEAT_MAX)) // key remain pressed
{
for (bCount=0; !PIN_IR ; bCount++) vDelay100us();
}
for (bCount=0; (PIN_IR) && (bCount < (IR_DATA1_MAX+20)) ; bCount++) vDelay100us();
// if ((bCount >= IR_PULSE_MIN) && (bCount <= IR_PULSE_MAX))
if (bCount >= (IR_DATA1_MAX+10))
{
//gotoxy(1,1);
// PrintHex(bCount,1);
_bRemoteTimer = 5;
if ((++LongPushCount)>=5)
{
LongPushCount = 0;
_bRemoteTimer = 0;
return(IR_LONGPUSH); // return the previous input key
}
}
else
LongPushCount = 0;
return(IR_NONE);
}
LongPushCount = 0;
// *********** Read Code *************
// logic 0 = low (0.56) + high (0.56)
// logic 1= low (0.56) + high (1.68)
for (i=0; i<4; i++)
{
bByte = 0;
for (j=0; j<8; j++)
{
for (bCount=0; (!PIN_IR); bCount++) vDelay100us(); //bypass low signal at INT0
for (bCount=0; (PIN_IR) && (bCount < (IR_DATA1_MAX+10)) ; bCount++) vDelay100us();
if (bCount == 0)
{
j--;
continue; // maybe signal noise
}
bByte >>= 1; // shift right one bit
if (bCount >= IR_DATA1_MIN) // bit=0 => bCount<9ms; bit=1 => bCount>9ms
{ // > 0.9 ms==> logic 1
// else ==> logic 0
if (bCount >= IR_DATA1_MAX)
{
return(IR_NONE); // bCount>30 => error
}
bByte |= 0x80;
}
}
bCodes[i] = bByte;
}
if ((bCodes[0] != IR_CUSTOM_CODE) || (bCodes[1] != ~bCodes[0]))
{
return(IR_NONE); // system code error
}
// each bit of aCodes[2] will be invert of aCodes[3]
if (bCodes[2] == ~bCodes[3])
{
_bIR0 = bCodes[2];
if (bCodes[2] >= IR_KEY_GAP_START)
{
bCodes[2] -= IR_KEY_GAP_SIZE;
}
if (bCodes[2] < IR_KEY_TBL_SIZE)
{
{
/* look up the mapping table */
bCodes[2] = _pbIRKeyTbl[bCodes[2]];
}
/* put the received key */
if (bCodes[2] != IR_NONE)
{
// long push key
if (IsLongPushKey(bCodes[2]))
{
_bRemoteTimer = 5;
}
/* assume IR interrupt priority is the highest */
return(bCodes[2]);
}
}
}
return(IR_NONE);
}
BYTE bGetIR0(BYTE bKey)
{
BYTE i;
for(i = 0; i< (IR_KEY_CODE_MAX-IR_KEY_GAP_SIZE); i++)
{
if(bKey ==_pbIRKeyTbl[i])
{
if(i < IR_KEY_GAP_START)
return i;
else
return(i + IR_KEY_GAP_SIZE);
}
}
return(IR_NONE);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?