📄 intctrl.c
字号:
#include "reg52.h"
#include "intrins.h"
#include "globedef.h"
#include "intctrl.h"
#include "keyproc.h"
#include "keydef.h"
#include "Lcd.h"
extern unsigned char ff_key_flag;
extern unsigned char fb_key_flag;
void RemoteInt(void) interrupt 0
{
WORD IRTimeCount;
BYTE temp1,temp2;
IRTimeCount = (WORD)Timer0_CntH*256+(WORD)Timer0_CntL;
Timer0_CntH =0;
Timer0_CntL = 0;
Start_Timer0; //中断后timer0开始定时,定时数值放到IRTimeCount
switch(IrState)
{
case IR_READY:
IRDataTemp=0;
IRDataCount=0;
IrState=IR_HEAD; //进入NEC码头低电平段
break;
case IR_HEAD:
if((IRTimeCount<IR_HEAD_MAX) && (IRTimeCount>IR_HEAD_MIN)) //NEC码头9ms+4.5ms=13.5ms
{
IRDataCount=0;
IrState=IR_OFFCODE; //NEC码头完毕
IRDataTemp=0;
RepCount = 0;
Current_Remote_In = 0;
}
else if((IRTimeCount > IR_REP_MIN) && (IRTimeCount < IR_REP_MAX)) //重复码9ms+2.5ms=11.5ms
{
#ifdef IRRepEnable
if(1 == Current_Remote_In)
{
if((Remote_value == 0x0b) || (Remote_value == 0x1b))
FF_FB_Active = 1;
if( (Remote_value == 0x0a) || //音量+
(Remote_value == 0x0e) || //音量-
(Remote_value == 0x0b) || //NEXT_KEY
(Remote_value == 0x1b)||//PREVIOUS_KEY
(Remote_value == 0x0f)) //PLAY/PAUSE_KEY
{
RepCount++;
if(RepCount > 3)
{
if( (Remote_value == 0x0a) ||
(Remote_value == 0x0e)) //如果按住的是音量键
{
IR_KeyAct = 1;
Remote_Key = Remote_value;
}
/* if((Remote_value == 0x0b)||(Remote_value == 0x1b))
{
Remote_Key = Remote_value + 1;//FF_KEY OR FB_KEY
IR_KeyAct = 1;//遥控有效标志位
}*/
if(Remote_value == 0x0b)
ff_key_flag = 1;
if(Remote_value == 0x1b)
fb_key_flag = 1;
}
if(RepCount > 10)
{
if(Remote_value == 0x0f) //如果常按住play键则关ipod
{
Remote_Key = 0x13;//IPOD_OFF_KEY
Current_Remote_In = 0;
}
IR_KeyAct = 1;
}
}
}
#endif
IrState = IR_READY;
}
else
{
IR_KeyAct = 0;
IrState = IR_READY;
Current_Remote_In = 0;
}
break;
case IR_OFFCODE:
IRDataTemp<<=1;
if(((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
|| ((IRTimeCount < CODE_0_MAX) && (IRTimeCount > CODE_0_MIN)))
{
IRDataCount++;
if((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
IRDataTemp |= 0x1;
if(IRDataCount >= 16)
{
IRDataCount=0;
if((IRDataTemp==IR_SYSTEM_CODE))
{
IrState=IR_ADDRESS;
IRDataTemp=0;
}
else
{
IR_KeyAct=0;
Current_Remote_In = 0;
IrState=IR_READY;
}
}
}
else
{
IR_KeyAct = 0;
Current_Remote_In = 0;
IrState = IR_READY;
}
break;
case IR_ADDRESS:
IRDataTemp>>=1;
if(((IRTimeCount < CODE_1_MAX)&&(IRTimeCount > CODE_1_MIN))
|| ((IRTimeCount < CODE_0_MAX) && (IRTimeCount > CODE_0_MIN)))
{
IRDataCount++;
if((IRTimeCount < CODE_1_MAX) && (IRTimeCount > CODE_1_MIN))
IRDataTemp |= 0x8000;
if(IRDataCount >= 16)
{
IRDataCount=0;
temp1 = (BYTE)(IRDataTemp%256);
temp2 = (BYTE)(IRDataTemp/256);
temp2 = ~temp2;
if(temp1 == temp2)
{
Remote_value = temp1;
Remote_Key = Remote_value;
Current_Remote_In = 1;
if((Remote_value == 0x0b) || (Remote_value == 0x1b))
FF_FB_Active = 1;
else
IR_KeyAct = 1;
}
IrState = IR_READY;
IRDataCount = 0;
}
}
else
{
IR_KeyAct = 0;
Current_Remote_In = 0;
IrState = IR_READY;
}
break;
}
}
void TIMER2Int(void) interrupt INT_Timer2
{
TF2 = 0;
if(FF_FB_Active >= 1)
{
FF_FB_Active++;
if(FF_FB_Active > 40)
{
if(RepCount < 4)
{
Remote_Key = Remote_value;
}
else
{
Remote_value = 0x7;
Remote_Key = Remote_value;
}
IR_KeyAct = 1;
FF_FB_Active = 0;
}
}
display_counter++;
flash_counter++;
if((Key_LongTimer >=1) && (Key_LongTimer < 130))
{
Key_LongTimer++;
}
if((Key_ShortTimer >=1) && (Key_ShortTimer < 25))
{
Key_ShortTimer++;
}
if(ReadKey_Timer < 5)
ReadKey_Timer++;
}
void NotUsing(void) interrupt INT_EXT1 //外部中断1
{
_nop_();
_nop_();
}
void TIMER0Int(void) interrupt INT_Timer0
{
Stop_Timer0;
IrState = IR_READY;
Timer0_CntH = 0;
Timer0_CntL = 0;
ET0 = 1;
}
void TIMER1Int(void) interrupt INT_Timer1
{
}
void SerialInt(void) interrupt INT_Serial
{
if(RI)
RI = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -