📄 remote_drv.c
字号:
#include "config.h" /* lib configuration header */
#include "remote_drv.h"
#include "lib_mcu\timer\timer_drv.h" /* timer driver definition */
#include "lib_mcu\lcd\lcd_drv.h"
#include "lib_mcu\kbd\key_drv.h" /* Keyboard driver definition */
#include <stdio.h>
INT8U gl_rmt;
bit gl_rmt_ok;
INT32U u32RmtValue; /*用于存放接收到的遥控信号*/
INT8U u8BitPoint;
INT8U u8ReceiveEnd;
/////////////////////////////////////////////////////////////////////////////
void remote_disable(void)
{
EX1 = 0;
}
/////////////////////////////////////////////////////////////////////////////
void remote_enable(void)
{
u32RmtValue = 0; //32bit receive value = 0
u8ReceiveEnd = 0; //not start to receive
u8BitPoint = 0; //bit point reset
gl_rmt = 0xff;
gl_rmt_ok = FALSE;
EX1 = 1; //enable ext1 interrupt
}
/////////////////////////////////////////////////////////////////////////////
void t1_remote_init(void)
{
T1_init(0,0,0x10); //T1工作于方式1,16BIT计数器
T1_start(); //开计数器1,用于判断遥控脉冲周期
IT1 = 1; //外部中断INT1管脚电平下降沿触发中断
remote_enable();
}
/////////////////////////////////////////////////////////////////////////////
INT8U remote_value(void)
{
INT8U u8Value;
if(gl_rmt_ok == TRUE)
{
switch(gl_rmt)
{
case 0x90: u8Value = REMOTE_0; break;
case 0x00: u8Value = REMOTE_1; break;
case 0x10: u8Value = REMOTE_2; break;
case 0x08: u8Value = REMOTE_3; break;
case 0x18: u8Value = REMOTE_4; break;
case 0x04: u8Value = REMOTE_5; break;
case 0x14: u8Value = REMOTE_6; break;
case 0x0c: u8Value = REMOTE_7; break;
case 0x1c: u8Value = REMOTE_8; break;
case 0x80: u8Value = REMOTE_9; break;
case 0x50: u8Value = REMOTE_CHUP; break;
case 0x48: u8Value = REMOTE_CHDN; break;
case 0x4c: u8Value = REMOTE_MUTE; break;
case 0x40: u8Value = REMOTE_POWN; break;
case 0x44: u8Value = REMOTE_VOUP; break;
case 0x54: u8Value = REMOTE_VODN; break;
case 0xd8: u8Value = REMOTE_CALL; break;
case 0xcc: u8Value = REMOTE_LUUP; break;
case 0xdc: u8Value = REMOTE_LUDN; break;
case 0x88: u8Value = REMOTE_10UP; break;
case 0xe8: u8Value = REMOTE_TIME; break;
case 0xec: u8Value = REMOTE_NONE; break;
default : u8Value = REMOTE_NONE; break;
}
remote_disable();
return (u8Value);
}
else
return (0xff);
}
//////////////////////////////////////////////////////////////////////////////////
Interrupt(remote_int(void), IRQ_INT1)
{
INT8U bTbit;
INT8U i;
INT16U u16TimeValue;
EX1 = 0; //关中断
T1_stop(); //关定时器
u16TimeValue = TH1; //取定时器值
u16TimeValue <<= 8;
u16TimeValue += TL1;
TH1 = 0x00;
TL1 = 0x00;
T1_start(); //开定时器
if((u16TimeValue > 1800)&&(u16TimeValue < 2200))
bTbit = 1;
else if((u16TimeValue > 900)&&(u16TimeValue < 1100))
bTbit = 0; //判断出得到的位是1还是0
if(u8BitPoint < 32)
{
u32RmtValue += bTbit;
u8BitPoint ++;
u32RmtValue <<= 1;
}
else
{
u8ReceiveEnd = 1;
u8BitPoint = 0;
}
if(u8ReceiveEnd == 1) //收满4个字节的数据后,进行字节内容判断
{
for(i=0; i<16; i++)
{
if((u32RmtValue & 0xff000000) == 0xe2000000)
{
gl_rmt = (u32RmtValue >> 16);
gl_rmt_ok = TRUE;
break;
}
else
{
u32RmtValue <<= 1;
}
}
u8ReceiveEnd = 0;
u32RmtValue = 0;
}
EX1 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -