📄 ir.c
字号:
#define __TIMER_IR__
#include "..\Header\Include.h"
#if (_IRPOLLING)
BYTE xdata ucIr_Cmd[2] = { 0x00, 0x00 };
BYTE xdata ucIr_State = 0x00;
BYTE xdata ucIrShowRead[4];
BYTE xdata ucIr_Seq = 0xff;
BYTE xdata ucTimerCnt = 0x00;
BYTE xdata ucIrKeyMessage;
void CMcuInitialTimerIr(void)
{
/* use MTV512 ET2 as IR timer
MCU_ETCTR_F88 = 0x00;
MCU_ETMOD_F89 = 0x01;
MCU_THET_F8A = _T2_COUNT_HBYTE;
MCU_TLET_F8B = _T2_COUNT_LBYTE;
MCU_RCAPETH_F8C = _T2_COUNT_HBYTE;
MCU_RCAPETL_F8D = _T2_COUNT_LBYTE;
MCU_EINT1PEN_F8E = 0x40; // enable ET2 interrupt
MCU_ETCTR_F88 = 0x04; //start ET2
IT1 = 0;
IE1 = 0;
EX1 = 1;
PT0 = 1; // set timer 0 as high level
*/
// use T1 as IR timer
TH1 = _TIMER1_COUNT_HBYTE;
TL1 = _TIMER1_COUNT_LBYTE;
TF1 = 0;
ET1 = 1;
TR1 = 1;
}
// Read IR signal by Timer 1 interrupt
void IntProcTimer1(void) interrupt 3
{
TR1 = 0;
TL1 = _TIMER1_COUNT_LBYTE;
TH1 = _TIMER1_COUNT_HBYTE;
TR1 = 1;
if (ucIr_State) {
if (bIR_GPIO) {
ucIr_Seq = (ucIr_Seq << 1) | 0x01;
if ((0xff == ucIr_Seq) && (ucIr_State & 0xfe)) {
ucIr_State = 0;
((unsigned int *)ucIr_Cmd)[0] = 0;
}
}
else {
if (ucIr_State > 1) {
if (ucIr_Seq & 0x01) {
((unsigned int *)ucIr_Cmd)[0] = (((unsigned int *)ucIr_Cmd)[0] << 1) | ((0x07 != (ucIr_Seq & 0x07)) ? 1 : 0);
#if (_IR_SHOW_CODE == _ENABLE)
if (23 == ++ucIr_State) {
ucIrShowRead[0] = ucIr_Cmd[0];
ucIrShowRead[1] = ucIr_Cmd[1];
}
if (39 == ucIr_State) {
ucIrShowRead[2] = ucIr_Cmd[0];
ucIrShowRead[3] = ucIr_Cmd[1];
ucIr_State = 0; // Command complete; Back to idle state
ucIr_Cmd[1] = 8; // Set command timer to 8 (7*20 = 140ms)
ucIr_Cmd[0] = ucIr_Cmd[1] = 0xff;
}
#else
if ((23 == ++ucIr_State) && (_CUSTOM_CODE != ((unsigned int *)ucIr_Cmd)[0]) ){
ucIr_State = 0; // Customer code error; Back to idle state
((unsigned int *)ucIr_Cmd)[0] = 0;
}
else if (39 == ucIr_State) {
ucIr_State = 0; // Command complete; Back to idle state
ucIr_Cmd[1] = 8; // Set command timer to 8 (7*20 = 140ms)
}
#endif
}
else if ((ucIr_Seq & 0xfe) == 0x00){
ucIr_State = 0; // Command crashed; Back to idle state
((unsigned int *)ucIr_Cmd)[0]= 0;
}
}
else { // ucIR_State is 1
if (0xff == ucIr_Seq) {
ucIr_State = 0x07; // Start to decode new command and clear old command
((unsigned int *)ucIr_Cmd)[0] = 0;
}
else {
ucIr_State = 0; // Fire repeat command and reset to idle
ucIr_Cmd[1] = ucIr_Cmd[0] ? 8 : 0;
}
}
ucIr_Seq = ucIr_Seq << 1;
}
}
else {
ucIr_Seq = (ucIr_Seq << 1) | bIR_GPIO;
if (ucIr_Seq == 0x07)
ucIr_State = 1; // Leader code detected
}
if (54 <= ++ucTimerCnt) { // 0.375ms*54 = 20.25ms passed
ucTimerCnt = 0;
if (0 == ucIr_State) {
if (ucIr_Cmd[1] && 0 == --ucIr_Cmd[1])
ucIr_Cmd[0] = 0;
}
}
}
BYTE CIrKeyScan(void)
{
BYTE ucKey = 0;
// You cannot respond to ucIR_Cmd[0] when IR command decoding (1 < ucIR_State).
// Because ucIR_Cmd[0] is not a constant during command decoding.
pData[0] = (1 < ucIr_State) ? 0 : ucIr_Cmd[0];
if (pData[0]) {
switch (pData[0]) {
case _IR_POWER_KEY : ucKey |= (_POWER_KEY_MASK); break;
case _IR_LEFT_KEY : ucKey |= (_LEFT_KEY_MASK); break;
case _IR_RIGHT_KEY : ucKey |= (_RIGHT_KEY_MASK); break;
case _IR_MENU_KEY : ucKey |= (_MENU_KEY_MASK); break;
#if (_SOURCE_KEY_TYPE == _SOURCE_KEY_ONEKEY || _SOURCE_KEY_TYPE == _SOURCE_KEY_MIXKEY)
case _IR_SOURCE_KEY: ucKey |= (_SOURCE_KEY_MASK); break;
#endif
default :
ucKey |= _IR_KEY_MASK;
switch (pData[0]) {
case _IR_MUTE_KEY:
ucIrKeyMessage = _IR_MUTE_MESSAGE;
break;
case _IR_VOL_UP:
ucIrKeyMessage = _IR_VOL_UP_MESSAGE;
break;
case _IR_VOL_DOWN:
ucIrKeyMessage = _IR_VOL_DOWN_MESSAGE;
break;
// for other IR key:
// ...
default:
// reset message to avoid unused key repeat previous function
ucIrKeyMessage = 0;
ucKey = 0;
break;
}
break;
}
}
return ucKey;
}
#if (_IR_SHOW_CODE == _ENABLE)
//--------------------------------------------------
// Description :
// Input Value :
// ucPar:
// bit 0 (Align left or right) [ 0: Align left 1: Align right ]
// bit 1 (Force to show number) [ 0: Disable 1: Enable ]
// bit 4 ~ 6 (Show numbers) [ 0 ~ 7: Show 1 ~ 8 numbers ]
// bit 7 (Hex or Decimal) [ 0: Decimal 1: Hex ]
// Output Value :
//--------------------------------------------------
void COsdFxShowNumberHex(BYTE ucRow, BYTE ucCol, WORD usValue, BYTE ucPar)
{
BYTE index, temp, i;
if (ucPar & _BIT7) {
pData[4] = usValue>>12;
pData[3] = (pData[4]<=9)?(_0_+pData[4]):(_A_+pData[4]-10);
pData[4] = (usValue>>8)&0x0F;
pData[2] = (pData[4]<=9)?(_0_+pData[4]):(_A_+pData[4]-10);
pData[4] = (usValue>>4)&0x0F;
pData[1] = (pData[4]<=9)?(_0_+pData[4]):(_A_+pData[4]-10);
pData[4] = usValue&0x0F;
pData[0] = (pData[4]<=9)?(_0_+pData[4]):(_A_+pData[4]-10);
}
else {
pData[3] = (_0_ + (usValue%10000)/1000);
pData[2] = (_0_ + (usValue%1000)/100);
pData[1] = (_0_ + (usValue%100)/10);
pData[0] = (_0_ + (usValue%10));
}
for(index=0;index<5;index++)
{
if(pData[4 - index] != ((bit)(ucPar & _BIT1) ? 0x00 : _0_))
{
index = 4 - index;
break;
}
}
if((bit)(ucPar & _BIT1))
{
temp = (ucPar & 0x70) >> 4;
index = (ucPar & 0x70) >> 4;
}
else
{
temp = (ucPar & 0x70) >> 4;
if(temp < index)
temp = index;
}
if(usValue == 0 && !((bit)(ucPar & 0x02)) )
index = 0;
if((bit)(ucPar & 0x01)) // Align Right
COsdFxCalcStartAddress(ucRow, ucCol - temp, _WRITE_BYTE1);
else // Align Left
COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);
for(i=0;i<=temp;i++)
{
if(index >= temp)
{
pData[i + 8] = pData[index - i];
}
else
{
if(i < (temp - index))
pData[i + 8] = 0x00;
else
pData[i + 8] = pData[index - (i - (temp - index))];
}
}
CScalerWrite(_OSD_DATA_PORT_92, (temp + 1), &pData[8], _NON_AUTOINC);
//return temp + 1;
}
void CIrShowCode(void)
{
COsdFxApplyMapSetting(_OSD_MAP4);
COsdFxShowNumberHex(ROW(0), COL(0), ucIrShowRead[0], _BIT7 | (_BIT4) | _BIT1); // IR customer ID (Hbyte)
COsdFxShowNumberHex(ROW(0), COL(3), ucIrShowRead[1], _BIT7 | (_BIT4) | _BIT1); // IR customer ID (Lbyte)
COsdFxShowNumberHex(ROW(0), COL(6), ucIrShowRead[2], _BIT7 | (_BIT4) | _BIT1); // IR key ID
COsdFxShowNumberHex(ROW(0), COL(9), ucIrShowRead[3], _BIT7 | (_BIT4) | _BIT1); // IR key ID (opposite)
COsdFxSetPosition(WIDTH(_OSD_MAIN_DH_END), HEIGHT(_OSD_MAIN_DV_END>>2), 20, 0, 0x01);
COsdFxEnableOsd();
}
#endif // end of IR_SHOW_CODE
#endif //end of IRPOLLING
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -