📄 necdecode.txt
字号:
#include "REG2051.h"
#include <intrins.h>
#include "M62429.h"
#define uchar unsigned char
unsigned char dataIR[4];
uchar data flag; //控制进程标志
unsigned char ir_repeat;//重复按键识别
bit ir_repeat_Flag = 0;
bit iR_Rec_Succ = 0;
uchar data count;
unsigned char ir_data;
#define POWER 0x02
#define MODE 0x01
bit flagTX; //接收缓冲满标志
sbit MUTE_PIN = P3^7;
sbit Mode_Led = P1^3;
bit Chang_Led_Flag = 0;
sbit Blue_Led = P1^6;
sbit Green_Led = P1^7;
sbit Red_Led = P1^5;
long int Music_Flag = 0;
// define not used interrupt, so generate "reti" in their entrance
unsigned char iVolumeVal = 15;
#define IR_VOL_ADD 0xf9
#define IR_VOL_SUB 0xfe
#define IR_POWER 0xef
#define IR_SLEEP 0xee
#define IR_MODE 0xed
#define IR_FIX_MODE 0xfc
void intitimer()
{
TMOD |= 0x20; //T1工作在外部计数器,方式1。 T0工作在内部定时器,方式2
TH1 = 0x9b; /* 定时器0赋予初值 500uS */
IT0 = 1; /* 外部中断1, 下降沿触发 */
IT1 = 1;
EX0 = 1; /* 外部中断1, 允许 */
ET1 = 1; /* 定时器0中断, 允许 */
EX1 = 1;
ES = 0; /* 串行口中断, 允许 */
TR1 = 1; /* 定时器0, 启动 */
//PT1 = 1;
//PX1 = 0;
EA = 1; /* 总中断, 允许 */
}
unsigned char iFixMode = 0;
unsigned char iIrInStopLed = 0;
unsigned char iIrInStopFlag = 0;
unsigned char iMode = 0;
int i100us = 0;
////////////////////////////////////////////
void ext0_isr(void) interrupt 0 using 1
{
unsigned char i=0;
unsigned char width;
EX0 = 0;
///////////////////////////////////////////////////////////////////////////////////////////
width = 0x00;
/****常规状态下INT1为高电平,由高电平跳变为低电平时(即下降沿)产生中断****/
// 引导信号:9ms低电平
// i100us_C = i100us;
while(!INT0) /***计算引导电平的宽度***/
{
delay_100us();
width++;
}
if (width < 80) /* 8ms=80*100us 如果不到8ms视为干扰信号 */
{
EX0 = 1;
return;
}
// 计算4.5ms低电平宽度
width = 0x00;
while(INT0) /* Wait for boot signal 4.5ms high-level */
{
delay_100us();
width++;
}
/* 判断是否是重复信号 2.5ms */
if (width < 30) /* 3ms=30*100us 如果不到3ms即视为2.5ms重复信号 */
{
ir_repeat++;
if(ir_repeat>4)
{
ir_repeat = 0;
ir_repeat_Flag = 1;
// Green_Led = 1;
}
EX0 = 1;
return;
}
ir_repeat = 0;
/* Receive new_press */
// 4.5ms新键码引导电平
if (width < 40) /* 4ms=40*100us 如果不到4ms视为错误信号,放弃接收 */
{
EX0 = 1;
return;
}
// 至此,引导码已校验,以下接收地址码和数据码,一共32位
while(i++ < 32) /* receive 32bits */
{
while(!INT0); /* Wait for 0.5625ms low-level passed */
width = 0x00;
while(INT0) /* Wait for data signal high-level "1" 1680us; "0" 560us */
{
delay_100us();
width++;
}
ir_data >>= 1;
if (width > 0x08) /* identify "1" or "0" */
ir_data |= 0x80;
if (i==8) /* note IR_receive data */
dataIR[0] = ir_data;
if (i==16)
dataIR[1] = ir_data;
if (i==24)
dataIR[2] = ir_data;
if (i==32)
dataIR[3] = ir_data;
}
if (dataIR[2] != ~dataIR[3]) // 纠错较验
{
EX0 = 1;
flagTX = 0;
return;
}
flagTX = 1;
EX0 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -