📄 cardextint.cpp.bak
字号:
//cardExtINT.cpp : source file for the card External Interrupts
//
#include "card.h"
#include "cardExtINT.h"
/////遥控相关位定义
volatile unsigned char ReviceDataCount=0;
volatile unsigned char IpodLongKey=0;
//unsigned char b_IrHigh=0;
//unsigned char b_IrLow=0;
//////BT RX AND TX
volatile unsigned char BtRxFirstData=0;
volatile unsigned char BtRxRecive=0;
/////////////
unsigned char b_HeadCodeRecOk=0;
unsigned char b_ReviceStart=0;
unsigned char ReviceData1=0;
unsigned char ReviceData2=0;
unsigned char ReviceData3=0;
unsigned char ReviceData4=0;
unsigned char IrReviceDCodeCount=0;
unsigned char IrValueCode=0;
unsigned char IrReviceOverOk=0;
unsigned char IrReviceLong=0; //遥控码长按标志标志
unsigned char BitData; //数据位
unsigned char FmIpodMode=0; //FM/IPOD 模式切换标志
unsigned char FmPrivacy=0; //耳机与公放切换标志
#define HEAD_LOW_COUNT_H 120 //9MS 6MS-12MS
#define HEAD_LOW_COUNT_L 60
#define FIRST_HEAD_HIGH_COUNT_H 60 //4.5MS 3MS-6MS
#define FIRST_HEAD_HIGH_COUNT_L 30
#define HEAD_HIGH_COUNT_H 30 //2.25MS 1.7MS-3MS
#define HEAD_HIGH_COUNT_L 17
#define DATA_LOW_COUNT_H 9 //560US 300US-900US LOW LEVEL
#define DATA_LOW_COUNT_L 3
#define DATA_HIGH_COUNT_H_ZERO 9 //560US 300US-900US ZERO HIGH LEVEL
#define DATA_HIGH_COUNT_L_ZERO 3
#define DATA_HIGH_COUNT_H_ONE 20 //560US 300US-900US ONE HIGH LEVEL
#define DATA_HIGH_COUNT_L_ONE 10
#define T_500MS 5
#define T_2000MS 20
#define FM_IPOD_CHANNEL_UP 0
#define FM_IPOD_CHANNEL_DOWN 1
#define IPOD_MODE_NEXT_CODE 2
#define IPOD_MODE_BACK_CODE 3
#define FM_IPOD_HANG_UP_CODE 4
#define FM_IPOD_HANG_DOWN_CODE 6
#define FM_IPOD_CHANGE_CODE 5
#define FM_IPOD_PRIVACY_CODE 7
#define FM_IPOD_ON_OFF_CODE 8
#define FM_IPOD 20
#define CHANNEL_UP_CODE 10
/////////////////////////////////////////////////////////////////////////////
//cardExtINT
void extint_init(void)
{
//{{WIZARD_MAP(External IRQ)
// INT0 Enabled, Mode: Logical Change
// INT1 Enabled, Mode: Logical Change
MCUCR |= 0x05;
MCUCSR |= 0x00;
GICR = 0xc0;
//}}WIZARD_MAP(External IRQ)
}
/////REVICE DATA CODE HEAR
void revice_data_code(void)
{
ReviceDataCount++;
if(ReviceDataCount<8)
{
ReviceData1|=BitData;
ReviceData1<<=1;
}
else if(ReviceDataCount==8)
ReviceData1|=BitData;
else if(ReviceDataCount<16)
{
ReviceData2|=BitData;
ReviceData2<<=1;
}
else if(ReviceDataCount==16)
ReviceData2|=BitData;
else if(ReviceDataCount<24)
{
ReviceData3|=BitData;
ReviceData3<<=1;
}
else if(ReviceDataCount==24)
ReviceData3|=BitData;
else if(ReviceDataCount<32)
{
ReviceData3|=BitData;
ReviceData4<<=1;
}
else
ReviceData3|=BitData;
}
////REVICE DATA OVER AND CLEAR SOME REGISTER
void revice_over_clear(void)
{
b_HeadCodeRecOk=0;
b_ReviceStart=0;
ReviceData1=0;
ReviceData2=0;
ReviceData3=0;
ReviceData4=0;
IrReviceDCodeCount++;
IrReviceOverOk=1;
}
////////////
ISR(SIG_INTERRUPT0) //遥控码接收中断
{
// TODO: Add your code here
if(PORTD&IR_PORT)
{
//b_IrHigh=TRUE;
if(b_ReviceStart)
{
if(b_HeadCodeRecOk)
{
if((IrDataLow>=DATA_LOW_COUNT_L)&&(IrDataLow<=DATA_LOW_COUNT_H)) //头码低电平时间判断
IrDataHigh=0;
else goto L_error;
}
else
{
if((IrDataLow>=HEAD_LOW_COUNT_L)&&(IrDataLow<=HEAD_LOW_COUNT_H)) //数据码低电平时间判断
IrDataLow=0;
else goto L_error;
}
}
else IrDataHigh=0;
}
else
{
if(b_ReviceStart)
{
if(b_HeadCodeRecOk)
{
if((IrDataHigh>=DATA_HIGH_COUNT_L_ZERO)&&(IrDataHigh<=DATA_HIGH_COUNT_H_ZERO)) //接收数据0
{
BitData=0;
revice_data_code();
}
else if((IrDataHigh>=DATA_HIGH_COUNT_L_ONE)&&(IrDataHigh<=DATA_HIGH_COUNT_H_ONE)) //接受数据1
{
BitData=1;
revice_data_code();
}
else goto L_error;
if(ReviceDataCount==32)
{
ReviceDataCount=0;
if(!((ReviceData1|ReviceData2)==0xff))
goto L_error;
if(!((ReviceData3|ReviceData4)==0xff))
goto L_error;
switch(ReviceData4)
{
case FM_IPOD_CHANNEL_UP:
{
revice_over_clear();
IrValueCode=FM_IPOD_CHANNEL_UP;
}
break;
case FM_IPOD_CHANNEL_DOWN:
{
revice_over_clear();
IrValueCode=FM_IPOD_CHANNEL_DOWN;
}
break;
case IPOD_MODE_NEXT_CODE:
{
revice_over_clear();
IrValueCode=IPOD_MODE_NEXT_CODE;
}
break;
case IPOD_MODE_BACK_CODE://FM_IPOD_MODE_DOWN_CODE:
{
revice_over_clear();
IrValueCode=IPOD_MODE_BACK_CODE;
}
break;
case FM_IPOD_HANG_UP_CODE://FM_IPOD_RING_CODE:
{
revice_over_clear();
IrValueCode=FM_IPOD_HANG_UP_CODE;
}
break;
case FM_IPOD_HANG_DOWN_CODE://FM_IPOD_STAUS_CHANGE_CODE:
{
revice_over_clear();
IrValueCode=FM_IPOD_HANG_DOWN_CODE;
}
break;
case FM_IPOD_CHANGE_CODE://FM_IPOD_HANG_DOWN_CODE:
{
revice_over_clear();
IrValueCode=FM_IPOD_CHANGE_CODE;
}
break;
case FM_IPOD_PRIVACY_CODE://FM_IPOD_PRIVACY_CODE:
{
revice_over_clear();
IrValueCode=FM_IPOD_PRIVACY_CODE;
}
break;
case FM_IPOD_ON_OFF_CODE://FM_IPOD_ON_OFF_CODE:
{
revice_over_clear();
IrValueCode=FM_IPOD_ON_OFF_CODE;
}
break;
default:
{
L_error:
b_ReviceStart=0;
b_HeadCodeRecOk=0;
ReviceData1=0;
ReviceData2=0;
ReviceData3=0;
ReviceData4=0;
ReviceDataCount=0;
IrReviceOverOk=0;
IrReviceLong=0;
IpodLongKey=0;
}
break;
}
}
}
else
{
if(IrReviceDCodeCount) //是否是第一次接收遥控码
{
if((IrDataHigh>=HEAD_HIGH_COUNT_L)&&(IrDataHigh<=HEAD_HIGH_COUNT_H))
{
IrDataLow=0;
b_HeadCodeRecOk=1;
}
else goto L_error;
}
else
{
if((IrDataHigh>=FIRST_HEAD_HIGH_COUNT_L)&&(IrDataHigh<=FIRST_HEAD_HIGH_COUNT_H))
{
IrDataLow=0;
b_HeadCodeRecOk=1;
}
else goto L_error;
}
}
}
else //遥控码接收开始
{
b_ReviceStart=1;
IrDataLow=0;
}
}
/////////////////////遥控码键值处理
if(IrReviceOverOk)
{
IrReviceOverOk=0;
if(IrReviceLong) //long key 键值判断
{
if((IrValueCode==FM_IPOD_CHANNEL_UP)||(IrValueCode==FM_IPOD_CHANNEL_DOWN)) //FM/IPOD LONG KEY
{
if(IrReviceDCodeCount>=T_500MS)
{
bKeyUse =TRUE;
IrReviceDCodeCount=1;
if(IrValueCode==FM_IPOD_CHANNEL_UP)
{
if(FmIpodMode) //fm long key channel up
KeyValue=KEY_FM_UP;
else
{KeyValue=KEY_IPOD_UP; //ipod long key UP
IpodLongKey=1;
}
}
else
{
if(FmIpodMode) //fm long key channel down
KeyValue=KEY_FM_DOWN;
else
{KeyValue=KEY_IPOD_DOWNP; //ipod long key down
IpodLongKey=1;
}
}
}
}
else if(IrReviceDCodeCount!=FM_IPOD_HANG_UP_CODE)
{
if(IrReviceDCodeCount>=T_2000MS)
switch(IrValueCode)
{
case IPOD_MODE_NEXT_CODE:
IpodLongKey=1;
KeyValue=KEY_IPOD_NEXT; //ipod long key play next
break;
case IPOD_MODE_BACK_CODE:
IpodLongKey=1;
KeyValue=KEY_IPOD_BACK; //ipod long key play back
break;
case FM_IPOD_HANG_DOWN_CODE:
bKeyUse =TRUE;
if(!FmIpodMode)
KeyValue=KEY_OFF_BLUETOOTH; //bluetooth is off
else
bKeyUse =FALSE;
break;
case FM_IPOD_PRIVACY_CODE:
bKeyUse =TRUE;
KeyValue=KEY_ON_OFF; //mcu is off
break;
case FM_IPOD_CHANGE_CODE: //ipod and fm mode change
if(FmIpodMode)
FmIpodMode=0;
else
FmIpodMode=1;
break;
default:
break;
}
}
}
else
{
IrReviceLong=1;
switch(IrValueCode)
{
case FM_IPOD_CHANNEL_UP:
bKeyUse =TRUE;
if(FmIpodMode) //fm short key channel UP
KeyValue=KEY_FM_UP;
else
KeyValue=KEY_IPOD_UP; //ipod short key UP
break;
case FM_IPOD_CHANNEL_DOWN: //fm short key channel down
bKeyUse =TRUE;
if(FmIpodMode) //fm short key channel down
KeyValue=KEY_FM_DOWN;
else
KeyValue=KEY_IPOD_DOWNP; //ipod short key dwon
break;
case IPOD_MODE_NEXT_CODE:
bKeyUse =TRUE;
KeyValue=KEY_IPOD_NEXT; //ipod short key play next
break;
case IPOD_MODE_BACK_CODE:
bKeyUse =TRUE;
KeyValue=KEY_IPOD_BACK; //ipod short key play back
break;
case FM_IPOD_ON_OFF_CODE:
bKeyUse =TRUE;
KeyValue=KEY_IPOD_STAUS; //ipod short key play pause
break;
case FM_IPOD_HANG_DOWN_CODE:
bKeyUse =TRUE;
if(FmIpodMode)
KeyValue=KEY_HAND_DOWN; //fm short key hand dowm
else
KeyValue=KEY_IPOD_ENTER; //ipod short key play enter
break;
case FM_IPOD_HANG_UP_CODE:
bKeyUse =TRUE;
if(FmIpodMode)
KeyValue=KEY_HAND_UP; //fm short key hand up
else
KeyValue=KEY_IPOD_MENU; //ipod short key play menu
case FM_IPOD_PRIVACY_CODE:
bKeyUse =TRUE;
KeyValue=KEY_PRIVACY_ON; //ipod short key privacy change
break;
case FM_IPOD_CHANGE_CODE: // fm short key mode change
bKeyUse =TRUE;
KeyValue=KEY_MODE_CHANGE;
break;
default:
break;
}
}
}
}
//////////
ISR(SIG_INTERRUPT1)
{
// TODO: Add your code here
if(!(PIND&BT_RX))
if(BtRxRecive)
{BtRxFirstData=1;
BtRxRecive=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -