📄 intctrl.c
字号:
#include "reg52.h"
#include "intrins.h"
#include "..\..\inc\globedef.h"
#include "..\..\inc\intctrl.h"
#include "..\..\inc\keyproc.h"
#include "..\..\inc\tuner.h"
/*====================================================
外部中断1, 用来接收遥控信号,和Timer0配合使用
====================================================*/
void RemoteInt(void) interrupt 2
{
WORD IRTimeCount;
BYTE temp1,temp2;
IRTimeCount = (WORD)Timer0_CntH*256+(WORD)Timer0_CntL;
Timer0_CntH =0;
Timer0_CntL = 0;
Start_Timer0;
switch(IrState)
{
case IR_READY:
IRDataTemp=0;
IRDataCount=0;
IrState=IR_HEAD;
break;
case IR_HEAD:
if((IRTimeCount<IR_HEAD_MAX)&&(IRTimeCount>IR_HEAD_MIN))
{
IRDataCount=0;
IrState=IR_OFFCODE;
IRDataTemp=0;
RepCount = 0;
Current_Remote_In = 0;
}
else if((IRTimeCount>IR_REP_MIN) && (IRTimeCount<IR_REP_MAX))
{
//是重复信号
#ifdef IRRepEnable
if(1 == Current_Remote_In)
{
if( (Remote_value == 18) //FM/AM 和AUTO_SCAN_KEY复用
|| (Remote_value == 7) //STEPR和FB复用
|| (Remote_value == 8)) //STEPF和FF复用
{
FMAM_PRESSED = 1;
RepCount++;
}
if( (Remote_value == 19) //IR_KEY_TBL[2] = VOLUME_UP_KEY;
||(Remote_value == 2) //IR_KEY_TBL[6] = VOLUME_DOWN_KEY;
||(Remote_value == 12) //IR_KEY_TBL[5] = BASS_PLUS_KEY;
||(Remote_value == 14)) //IR_KEY_TBL[9] = CENTER_MINUS_KEY;
//||(Remote_value == 0x7) ) //IR_KEY_TBL[7] = CENTER_PLUS_KEY;
{
//当遥控输入是以上按键时,才有重复功能
RepCount++;
if(RepCount > 3)
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;//检测"1
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; //检测到“1”
if(IRDataCount >= 16)
{
//判断检测到的数据码是否正确
IRDataCount=0;
temp1 = (BYTE)(IRDataTemp%256);
temp2 = (BYTE)(IRDataTemp/256);
temp2 = ~temp2;
if(temp1 == temp2)
{
Remote_value = temp1;
if(Remote_value > 0x1f)
Remote_value -= 0x20;
Current_Remote_In = 1;
if( (Remote_value == 18) //FM/AM 和AUTO_SCAN_KEY复用
|| (Remote_value == 7) //STEPR和FB复用
|| (Remote_value == 8)) //STEPF和FF复用
FMAM_PRESSED = 1;
else
IR_KeyAct = 1;
}
IrState = IR_READY;
IRDataCount = 0;
}
}
else
{
//无效键
IR_KeyAct = 0;
Current_Remote_In = 0;
IrState = IR_READY;
}
break;
}
}
/*======================================================
外部中断0, 用来判断CS49326是否有message发送给主控MCU
=======================================================*/
void CS49326Int(void) interrupt 0// using 1
{
//read CS49326 unsolicited messages
}
/*================================================================
Timer0中断用于遥控按键输入中断的计时
================================================================*/
void TIMER0Int(void) interrupt INT_Timer0
{
Stop_Timer0;
IrState = IR_READY;
Timer0_CntH = 0;
Timer0_CntL = 0;
ET0 = 1;
}
/*===================================================================
设置TIMER1为定时中断,每次中断时间为20ms,中断1ms后开始测试滚轮按键,
VFD显示时间长度计时
===================================================================*/
void TIMER1Int(void) interrupt INT_Timer1
{
Timer1_CntL = 0xE0;
Timer1_CntH = 0xB1;
Start_Timer1;
/*
if(Volume_Interval > 0)
{
Volume_Interval++;
if(Volume_Interval > 60)
Volume_Interval = 0;
}
*/
if(FMAM_PRESSED > 0)
{
FMAM_PRESSED++;
//证明已经没有FM/AM按下,如果按下FMAM_PRESSED=1,
//按下经过120ms,(NEC最长为108ms)
if(FMAM_PRESSED > 8)
{
if(RepCount > 5)
{
if(Remote_value == 18)//FMAM_KEY
Remote_value = 28;//AUTO_SCAN_KEY
else if(Remote_value == 7) //CHANNEL_SETPR_KEY
Remote_value = 20;//CHANNEL_FB_KEY
else if(Remote_value == 8) //CHANNEL_SETPF_KEY
Remote_value = 21;//CHANNEL_FF_KEY
}
IR_KeyAct = 1;
FMAM_PRESSED = 0;
}
}
if(TO_MAIN_DISPLAY > 0)
{
TO_MAIN_DISPLAY--;
if((TO_MAIN_DISPLAY % 15) == 0)
{
if(FLASH_TEMP == 0)
FLASH_TEMP = 1;
else
FLASH_TEMP = 0;
}
}
if(Key_Timer >= 1)
{
Key_Timer++;
}
if(Wait_Lock_40ms > 0)
Wait_Lock_40ms++;
}
/*===================================================================
Timer2中断,暂时未用
===================================================================*/
void TIMER2Int(void) interrupt INT_Timer2
{
TF2 = 0;
if(ReadKey_Timer < 20)
{
ReadKey_Timer++;
}
if(Volume_Control == 1)
{
Jog_A_Input = 1;
Jog_B_Input = 1;
Jog_A_Buffer <<= 1;
Jog_B_Buffer <<= 1;
if(1 == Jog_A_Input)
Jog_B_Buffer++;
if(1 == Jog_B_Input)
Jog_A_Buffer++;
Jog_A_Buffer &= 0x7;
Jog_B_Buffer &= 0x7;
if(( 4 == Jog_A_Buffer) && (0 == Volume_Key_Dealed))
{
if(Jog_B_Buffer >= 0x7)//ab ab ab ab ab ab ab ab
{
Jog_Key = 1; //11->01->00->10->11->01->00->10 ;a=9 b=0xc
}
else
{
Jog_Key = 2; //ab ab ab ab ab ab ab ab
}
Jog_KeyAct = 1; //11->10->00->01->11->10->00->01 ;a=4 b=(0,1)
Volume_Key_Dealed = 1;
}
}
else
{
Jog_A_Buffer = 0;
Jog_B_Buffer = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -