VS1838红外遥控中断+定时器版文档格式.docx
《VS1838红外遥控中断+定时器版文档格式.docx》由会员分享,可在线阅读,更多相关《VS1838红外遥控中断+定时器版文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
externu8vsit_max;
externvoidVS1838_ErrorDisp(u16TIM4_temp);
#endif
//VS1838.c
//*********************VS1838.c*********************//
//红外遥控按键控制,接收循环108ms,占用EXIT8,TIM5
#include"
stm32f4xx.h"
VS1838.h"
u8vsit_cnt=0;
u8vs_recnt=0;
u8vs_error=0;
u8vs_finish=0;
unionVS1838_DATHW;
//遥控接收数据
#definekeyHW.vschar[2]//键值
u8back_flag=0;
//返回键表示
voidEXTIX_Init(void)
EXTI_InitTypeDefEXTI_InitStructure;
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
//100M
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//上拉
GPIO_Init(GPIOC,&
GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
//使能SYSCFG时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource8);
//PC8连接到中断线8(与M3不同)
/*配置EXTI_Line8*/
EXTI_InitStructure.EXTI_Line=EXTI_Line8;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
//中断事件
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
//边沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//使能LINE8
EXTI_Init(&
EXTI_InitStructure);
//配置
}
u8HW_NumConvert(void)
u8keysw;
switch(key)
{
#ifdefCARMP3
case0x16:
keysw=0;
break;
case0x0c:
keysw=1;
case0x18:
keysw=2;
case0x5e:
keysw=3;
case0x08:
keysw=4;
case0x1c:
keysw=5;
case0x5a:
keysw=6;
case0x42:
keysw=7;
case0x52:
keysw=8;
case0x4a:
keysw=9;
case0x09:
back_flag=1;
return0xff;
//EQ
#else
case0x0e:
case0x10:
case0x11:
case0x12:
case0x14:
case0x15:
case0x16:
case0x19:
case0x1a:
case0x06:
#endif
default:
vs_finish=0;
//键值被使用过
return0xff;
//非按键数值
}
vs_finish=0;
returnkeysw;
//返回按键数值
voidKeyConvert(void)
switch(key)
{
//keysw=0,0>
break;
//keysw=1,
//keysw=2,
//keysw=3,
//keysw=4,
//keysw=5,
//keysw=6,
//keysw=7,
//keysw=8,
//keysw=9,1:
break;
//EQ
case0x45:
//CH-
case0x46:
//CH
case0x47:
//CH+
case0x44:
//L
case0x40:
//R
//INC
case0x07:
//DEC
//100+
case0x0d:
//200+
}
//back
case0x02:
//menu
case0x00:
//开关
//OK
//左
case0x0a:
//右0:
case0x05:
//上
//下0=
case0x04:
//加
//减0<
}
#ifdefVS1838_Debug
disp_hex(0,4,key);
//显示键值
#endif
u16vs_time[67];
u8vsit_max=0;
voidVS1838_ErrorDisp(u16VS1838_TIMx_temp)
u8dat[5];
lcddispone(0,0,vs_error/10+48);
lcddispone(1,0,vs_error%10+48);
dat[0]=VS1838_TIMx_temp/10000+48;
dat[1]=VS1838_TIMx_temp/1000%10+48;
dat[2]=VS1838_TIMx_temp/100%10+48;
dat[3]=VS1838_TIMx_temp/10%10+48;
dat[4]=VS1838_TIMx_temp%10+48;
lcddispmore(0,3,5,dat);
lcddispmore(6,3,6,"
itmax:
"
);
dat[0]=vsit_max/10%10+48;
dat[1]=vsit_max%10+48;
lcddispmore(12,3,2,dat);
//中断函数部分(重要)
/*******************************************************************************
//EXTI8VS1838占用PC8
*******************************************************************************/
voidEXTI9_5_IRQHandler(void)//VS1838占用PC8
{
#ifdefVS1838EN//VS1838enable
u16VS1838_TIMx_temp;
//计数器时间暂存值
if(EXTI->
PR&
EXTI_Line8)
#ifdefVS1838EN//VS1838enable
//delay(5000);
//EXTI->
PR|=(u32)EXTI_Line8;
//清中断标志位
VS1838_TIMx->
CR1=~TIM_CR1_CEN;
//关闭定时器
VS1838_TIMx_temp=VS1838_TIMx->
CNT;
CNT=0;
CR1|=TIM_CR1_CEN;
//启动定时器
#ifdefVS1838_Debug
if(vsit_cnt>
vsit_max)
vsit_max=vsit_cnt;
#endif
if(vsit_cnt==0)//低电平9ms开始,下降沿
{
vsit_cnt++;
//红外遥控中断进入计数加1
EXTI->
return;
if(vsit_cnt==1)//低电平9ms结束,上升沿
if((VS1838_TIMx_temp<
11000)&
&
(VS1838_TIMx_temp>
7000))//正常9ms启动代码
{
vs_error=0;
//红外遥控数据错误清零
vs_finish=0;
//红外遥控传输完成标志清零
vsit_cnt++;
}
else//非正常9ms启动代码
vsit_cnt=0;
//红外遥控中断进入计数清零
vs_error=1;
//红外遥控数据错误
#ifdefVS1838_Debug
VS1838_ErrorDisp(VS1838_TIMx_temp);
#endif
}
if(vsit_cnt==2)//下降沿,关键高电平时间4.5ms或者2.25ms
{
5000)&
4000))//4.5ms启动代码
}
elseif((VS1838_TIMx_temp<
2800)&
1800))//2.25ms重复代码
{
//红外遥控中断进入计数加1,
vs_recnt++;
//红外遥控重复按键计数加1,
}
else
vs_error=2;
if(vsit_cnt==3)//上升沿,低电平0.56ms结束,重复码结束或码的第一位开始
900)&
300))//正常0.56ms代码
if(vs_recnt!
=0)//重复码接收完
{
vs_recnt--;
//重复计数减1,!
!
vs_finish=0xff;
//红外遥控传输完成
vsit_cnt=0;
//***********************可以在此调用按键处理函数
(1)****************************//
#ifdefVS1838_Debug
KeyConvert();
#endif
}
else//非正常代码
vs_error=3;
#endif
}
if(vsit_cnt>
3)
=67)//0.56ms结束,上降沿,停止位
{
VS1838_TIMx->
//关闭定时器4
//***********************可以在此调用按键处理函数
(2)****************************//
KeyConvert();
EXTI->
return;
else//<
67
if(vsit_cnt&
0x01)//奇数,上升沿,低电平0.56ms结束
if((GPIOC->
IDR&
0X1000)==0)
{//显示信息较多,占用时间
u8dat[5];
lcddispmore(0,1,5,"
sheng"
dat[0]=vsit_cnt/10%10+48;
dat[1]=vsit_cnt%10+48;
lcddispmore(6,1,2,dat);
lcddispone(0,0,vs_error/10+48);
lcddispone(1,0,vs_error%10+48);
dat[0]=VS1838_TIMx_temp/10000+48;
dat[1]=VS1838_TIMx_temp/1000%10+48;
dat[2]=VS1838_TIMx_temp/100%10+48;
dat[3]=VS1838_TIMx_temp/10%10+48;
dat[4]=VS1838_TIMx_temp%10+48;
lcddispmore(9,1,5,dat);
}
#endif
if((VS1838_TIMx_temp<
{
vsit_cnt++;
//红外遥控中断进入计数加1,
}
else//非正常代码
vs_error=vsit_cnt;
vsit_cnt=0;
//红外遥控中断进入计数清零
#ifdefVS1838_Debug
VS1838_ErrorDisp(VS1838_TIMx_temp);
#endif
}
}//低电平0.56ms结束,上降沿
else//偶数,下降沿,判断接收代码位是0还是1,//先传低位,高位大地址
if(GPIOC->
0X1000)
{
jiang"
dat[0]=VS1838_TIMx