📄 yaokong.c
字号:
#include "spce061a.h"
volatile unsigned int count_0_5ms=0;
volatile unsigned char IR_state=0;
volatile unsigned char IR_data=0;
void timer_b_init(void)
{
*P_TimeBase_Clear=0x0001;
*P_INT_Ctrl = *P_INT_Ctrl_New |C_IRQ4_2KHz; //Setup interrupt
__asm("INT IRQ");
}
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
unsigned int portb;
if(*P_INT_Ctrl&C_IRQ4_2KHz)
{
*P_TimerB_Data=0xfff3;
portb=*P_IOB_Data&0x0004; //外部中断一
++count_0_5ms;
switch(IR_state)
{
case 0:
break;
case 1: //同步头检测状态
if(count_0_5ms>29)//如果是重发位的处理
{
IR_state=0;
//*P_TimerB_Ctrl=0x06;
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
count_0_5ms=0;
}
break;
case 2: //数据位接收状态
if(count_0_5ms>7)//如果是42位数据后的空闲位的处理
{
IR_state=0;
// *P_TimerB_Ctrl=0x06;
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
count_0_5ms=0;
}
break;
}
*P_INT_Clear|=C_IRQ4_2KHz;
}
}
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
unsigned char pre_5ms_count=0;
static unsigned char bit_count=0;
static unsigned int get_IR_code;
if((0x0200 & *P_INT_Ctrl))
{
switch(IR_state)
{
case 0:
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
//*P_TimerB_Ctrl=0x06;//空闲状态下
count_0_5ms=0;
timer_b_init();
IR_state=1;
break;
case 1://测试起始码状态
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
// *P_TimerB_Ctrl=0x06;//stop
if((count_0_5ms>30)||(count_0_5ms<=24))//>14,<12.5不是起始码
{
count_0_5ms=0;
timer_b_init();//没有收到同步
break;
}
count_0_5ms=0;//找到引导符
bit_count=0;
get_IR_code=0;
IR_state=2;
timer_b_init();//收到同步头
break;
//起始码后就跟着控制数据, 共有42位数据, 其中前面
//26位数据为用户码的原码和反码, 后16位数据为遥控按键的原码和反码
case 2://接收数据状态
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
// *P_TimerB_Ctrl=0x06;//stop;
pre_5ms_count=count_0_5ms;//读出上一个数据位的脉冲宽度
timer_b_init();
count_0_5ms=0;
bit_count++;
if((pre_5ms_count>=2)&&(pre_5ms_count<=3))
//收到0 脉冲周期是1.12毫秒的为0
{
if(bit_count>16)
get_IR_code=get_IR_code>>1;
}
else
if((pre_5ms_count>=4)&&(pre_5ms_count<=5))
//收到1 脉冲周期是2.25毫秒的为1
{
if(bit_count>16)
get_IR_code=(get_IR_code>>1)|0x8000;
}
if(bit_count ==32)
{
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0020);//关掉2KHz的中断
//*P_TimerB_Ctrl=0x06;//stop 没有必要测试空闲位
IR_state=0;//原来为 1
if(((get_IR_code>>8)&0x00ff)==((~get_IR_code)&0x00ff))
//是否合法的遥控码
{
IR_data=get_IR_code & 0x00ff;
}
}break;
}
*P_INT_Clear=0x0200;
}
}
void adjust_time(void)
{
*P_INT_Ctrl = *P_INT_Ctrl_New|C_IRQ3_EXT2; //Open IRQ3_EXT2 interrupt
__asm("INT IRQ");
switch(IR_data)
{
case 0x0001: ;
break;
case 0x0002:;
break;
case 0x0003:;
break;
case 0x0004:;
break;
case 0x0005:;
break;
case 0x0006:;
break;
case 0x0007:;
break;
case 0x0008:;
break;
case 0x0009:;
break;
}
*P_Watchdog_Clear = 0x0001;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -