初级会员

- 积分
- 112
- 金钱
- 112
- 注册时间
- 2014-9-10
- 在线时间
- 0 小时
|
5金钱
IO配置
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
外部中断配置
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,GPIO_PinSource15);
EXTI_ClearITPendingBit(EXTI_Line15);
EXTI_InitStructure.EXTI_Line = EXTI_Line15;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//红外
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//处理红外键盘
//返回相应的键值
u8 Remote_Process(void)
{
u8 t1,t2;
t1= Remote_Odr>>24; //红外解码
t2=(Remote_Odr>>16)&0xff;
Remote_Rdy=0 ;//清除标记
if(t1==(u8)~t2&&t1==REMOTE_ID)//检验遥控识别码(ID)
{printf("###################解码成功#####################\r\n");
t1=Remote_Odr>>8;
t2=Remote_Odr;
if(t1==(u8)~ t2)
{
if(t1 ==0x00)
t1 =0x55;
printf("###################解码成功#####################\r\n");
return t1; //处理键值
}
}
return 0;
}
中断处理函数
void EXTI15_10_IRQHandler(void)
{
u8 res=0;
u8 OK=0;
u8 RODATA=0;
while(1)
{
if(RDATA)//有高脉冲出现
{
res=Pulse_Width_Check();//获得此次高脉冲宽度
if(res!=250)
printf("res=%d\r\n",res);
if(res==250)break;//非有用信号
if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
else if(res>=100&&res<200) //按键次数加一(2ms)
{
Remote_Rdy=1;//接受到数据
Remote_Cnt++;//按键次数增加
break;
}
else if(res>=50&&res<85)
{
RODATA=1;//1.5ms
}
else if(res>=10&&res<50)
{
RODATA=0;//500us
}
if(OK)
{
Remote_Odr<<=1;
Remote_Odr+=RODATA;
Remote_Cnt=0; //按键次数清零
}
// EXTI-> R=1<< 15; // 清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line15);
}
}
EXTI_ClearITPendingBit(EXTI_Line15); // 清除中断标志位
}
#define RDATA GPIO_ReadInputData(GPIOB)&GPIO_Pin_15
//检测脉冲宽度
//最长脉宽为 5ms
//返回值:x,代表脉宽为 x*20 us(x=1~250);
u8 Pulse_Width_Check(void)
{
u8 t=0,i=0;
while(RDATA)
{
t++;
delay_us(20);
//IRQ_delay_us(5);
if(t==250)return t; //超时溢出
}
return t;
}
void KEY_Process(void)
{
u8 keydate;
u8 i;
//KEY_Scan();
if(Remote_Rdy)
{
keydate = Remote_Process();
printf("keydate=%x\r\n",keydate); 这里解码一直未成功,一直为0
for(i=0;i<20;i++)
{
if(keydate == IrDAREC_KEY)
{ printf("###################解码成功#####################\r\n");
if(Remote_Cnt ==1)
{
Key_status = i;
KEY_TSK_SET();
}
break;
}
}
}
}
|
|