最近自己在网上搜了很多资料,发现很多的红外解码,关于重码的处理的代码很少,分享一下红外解码包括重码的处理。
使用单片机:EN8F156
功能说明:红外遥控器解码,只使用定时器T0定时100us进行按键解码,处理按键短按与长按,将解码的数据通过串口打印。
/***************************************
功能说明:红外遥控器解码,定时器T0定时100us进行按键解码,处理按键短按与长按,串口打印解码数据。
****************************************/
#include "SYSCFG.h"
#define uchar unsigned char
#define uint unsigned int
#define IR_PIN PA2 //红外输入
#define PIN_TX PC0 //串口发射
//IR接收变量
#define IR_Long_Time 20 //110*20 = 2200ms
uchar Receive_Count = 0; //红外接收计位数
uchar Low_Level_Time = 0; //低电平时间
uchar High_Level_Time = 0; //高电平时间
uchar UserCode_High = 0;
uchar UserCode_Low = 0; //存放用户码1
uchar Data_Code = 0; //存放数据码
uchar IR_Temp = 0; //存放数据码反码
uchar Repeat_Count = 0; //重码计数
//IR接收标志
bit Data_Receive_Flag = 0; //数据接收标志
bit Begin_Flag = 0; //同步码标志
bit Receive_Error_Flag = 0; //接收失败
bit Start_Receive_Flag = 0; //开始标志
bit Receive_Over_Flag = 0; //键码解码完毕
bit Repeat_Flag = 0; //重码标志
bit Ready_Repeat_Det_Flag = 0; //准备接受重码
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化 系统时钟4MhZ/2 = 2MhZ
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void MCU_INIT(void)
{
OSCCON = 0B01010001;//WDT 32KHZ IRCF=101=4MHZ/2=2MHZ,0.5US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
OPTION = 0B00001000;//Bit4=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(RAPU)=0 ENABLED PULL UP PA
TRISA = 0x04; //PA2输入
TRISC = 0x00; //
PORTA = 0B00000000; //
PORTC = 0B00000000; //
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
MSCKCON = 0B00000000;//6B->0,禁止PA4,PC5稳压输出
//5B->0,TIMER2时钟为Fosc