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

📄 ir.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 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 + -