VS1838红外遥控中断+定时器版.docx
- 文档编号:9051458
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:17
- 大小:19.44KB
VS1838红外遥控中断+定时器版.docx
《VS1838红外遥控中断+定时器版.docx》由会员分享,可在线阅读,更多相关《VS1838红外遥控中断+定时器版.docx(17页珍藏版)》请在冰豆网上搜索。
VS1838红外遥控中断+定时器版
//说明:
以下函数在STM32F405RGT6上验证过,应用于其他条件下根据自身需要做移植
//VS1838.h
//*********************VS1838.h*********************//
//红外遥控按键控制,接收循环108ms,占用外部中断EXIT8,定时器VS1838_TIMx
//*********************VS1838.h*********************//
//启用调试需要调用液晶屏显示的函数,需自己编一下
//#defineVS1838_Debug1//启用调试,包括it.c中的调试
#defineCARMP31//遥控器型号定义(取消注释为MP3版,看键值程序就明白了)
#defineVS1838EN1//定义使用VS1838
#defineVS1838_TIMxTIM5//定义VS1838使用定时器
unionVS1838_DAT
{
u8vschar[4];//红外遥控接收数据
u32vslong;//红外遥控接收数据
};
externunionVS1838_DATHW;
externu8vsit_cnt;//红外遥控中断进入计数
externu8vs_recnt;//红外遥控按键重复接收计数
externu8vs_error;//红外遥控接收代码错误标志
externu8vs_finish;//红外遥控中断进入计数
//红外中断初始化
voidEXTIX_Init(void);
//正常返回键值0~9,非正常返回0xff
u8HW_NumConvert(void);
//按键转换,执行功能
voidKeyConvert(void);
externu16tim_temp;//计数器时间暂存值
//voidVS1838_ErrorDisp(void);
#ifdefVS1838_Debug
externu8vsit_max;
externvoidVS1838_ErrorDisp(u16TIM4_temp);
#endif
//VS1838.c
//*********************VS1838.c*********************//
//红外遥控按键控制,接收循环108ms,占用EXIT8,TIM5
//*********************VS1838.c*********************//
#include"stm32f4xx.h"
#include"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);//配置
}
//正常返回键值0~9,非正常返回0xff
u8HW_NumConvert(void)
{
u8keysw;
switch(key)
{
#ifdefCARMP3
case0x16:
keysw=0;break;
case0x0c:
keysw=1;break;
case0x18:
keysw=2;break;
case0x5e:
keysw=3;break;
case0x08:
keysw=4;break;
case0x1c:
keysw=5;break;
case0x5a:
keysw=6;break;
case0x42:
keysw=7;break;
case0x52:
keysw=8;break;
case0x4a:
keysw=9;break;
case0x09:
back_flag=1;return0xff;//EQ
#else
case0x0e:
keysw=0;break;
case0x10:
keysw=1;break;
case0x11:
keysw=2;break;
case0x12:
keysw=3;break;
case0x14:
keysw=4;break;
case0x15:
keysw=5;break;
case0x16:
keysw=6;break;
case0x18:
keysw=7;break;
case0x19:
keysw=8;break;
case0x1a:
keysw=9;break;
case0x06:
back_flag=1;return0xff;
#endif
default:
vs_finish=0;//键值被使用过
return0xff;//非按键数值
}
vs_finish=0;//键值被使用过
returnkeysw;//返回按键数值
}
//按键转换,执行功能
voidKeyConvert(void)
{
switch(key)
{
#ifdefCARMP3
{
case0x16:
//keysw=0,0>
break;
case0x0c:
//keysw=1,
break;
case0x18:
//keysw=2,
break;
case0x5e:
//keysw=3,
break;
case0x08:
//keysw=4,
break;
case0x1c:
//keysw=5,
break;
case0x5a:
//keysw=6,
break;
case0x42:
//keysw=7,
break;
case0x52:
//keysw=8,
break;
case0x4a:
//keysw=9,1:
break;
case0x09:
//EQ
break;
case0x45:
//CH-
break;
case0x46:
//CH
break;
case0x47:
//CH+
break;
case0x44:
//L
break;
case0x40:
//R
break;
case0x15:
//INC
break;
case0x07:
//DEC
break;
case0x19:
//100+
break;
case0x0d:
//200+
break;
}
#else
{
case0x0e:
//keysw=0,0>
break;
case0x10:
//keysw=1,
break;
case0x11:
//keysw=2,
break;
case0x12:
//keysw=3,
break;
case0x14:
//keysw=4,
break;
case0x15:
//keysw=5,
break;
case0x16:
//keysw=6,
break;
case0x18:
//keysw=7,
break;
case0x19:
//keysw=8,
break;
case0x1a:
//keysw=9,1:
break;
case0x06:
//back
break;
case0x02:
//menu
break;
case0x00:
//开关
break;
case0x09:
//OK
break;
case0x08:
//左
break;
case0x0a:
//右0:
break;
case0x05:
//上
break;
case0x0d:
//下0=
break;
case0x04:
//加
break;
case0x0c:
//减0<
break;
}
#endif
default:
vs_finish=0;//键值被使用过
break;
}
vs_finish=0;//键值被使用过
#ifdefVS1838_Debug
disp_hex(0,4,key);//显示键值
#endif
}
#ifdefVS1838_Debug
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);
}
#endif
//中断函数部分(重要)
/*******************************************************************************
//EXTI8VS1838占用PC8
*******************************************************************************/
voidEXTI9_5_IRQHandler(void)//VS1838占用PC8
{
#ifdefVS1838EN//VS1838enable
u16VS1838_TIMx_temp;//计数器时间暂存值
#endif
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;
VS1838_TIMx->CNT=0;
VS1838_TIMx->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->PR|=(u32)EXTI_Line8;//清中断标志位
return;
}
if(vsit_cnt==1)//低电平9ms结束,上升沿
{
if((VS1838_TIMx_temp<11000)&&(VS1838_TIMx_temp>7000))//正常9ms启动代码
{
vs_error=0;//红外遥控数据错误清零
vs_finish=0;//红外遥控传输完成标志清零
vsit_cnt++;//红外遥控中断进入计数加1
}
else//非正常9ms启动代码
{
vsit_cnt=0;//红外遥控中断进入计数清零
vs_error=1;//红外遥控数据错误
#ifdefVS1838_Debug
VS1838_ErrorDisp(VS1838_TIMx_temp);
#endif
}
EXTI->PR|=(u32)EXTI_Line8;//清中断标志位
return;
}
if(vsit_cnt==2)//下降沿,关键高电平时间4.5ms或者2.25ms
{
if((VS1838_TIMx_temp<5000)&&(VS1838_TIMx_temp>4000))//4.5ms启动代码
{
vsit_cnt++;//红外遥控中断进入计数加1
}
elseif((VS1838_TIMx_temp<2800)&&(VS1838_TIMx_temp>1800))//2.25ms重复代码
{
vsit_cnt++;//红外遥控中断进入计数加1,
vs_recnt++;//红外遥控重复按键计数加1,
}
else
{
vs_error=2;//红外遥控数据错误
vsit_cnt=0;//红外遥控中断进入计数清零
#ifdefVS1838_Debug
VS1838_ErrorDisp(VS1838_TIMx_temp);
#endif
}
EXTI->PR|=(u32)EXTI_Line8;//清中断标志位
return;
}
if(vsit_cnt==3)//上升沿,低电平0.56ms结束,重复码结束或码的第一位开始
{
if((VS1838_TIMx_temp<900)&&(VS1838_TIMx_temp>300))//正常0.56ms代码
{
vsit_cnt++;//红外遥控中断进入计数加1
if(vs_recnt!
=0)//重复码接收完
{
vs_recnt--;//重复计数减1,!
!
!
vs_finish=0xff;//红外遥控传输完成
vsit_cnt=0;//红外遥控中断进入计数清零
//***********************可以在此调用按键处理函数
(1)****************************//
#ifdefVS1838_Debug
KeyConvert();
#endif
//***********************可以在此调用按键处理函数
(1)****************************//
}
}
else//非正常代码
{
vsit_cnt=0;//红外遥控中断进入计数清零
vs_error=3;//红外遥控数据错误
#ifdefVS1838_Debug
VS1838_ErrorDisp(VS1838_TIMx_temp);
#endif
}
EXTI->PR|=(u32)EXTI_Line8;//清中断标志位
return;
}
if(vsit_cnt>3)
{
if(vsit_cnt>=67)//0.56ms结束,上降沿,停止位
{
VS1838_TIMx->CR1=~TIM_CR1_CEN;//关闭定时器4
vs_finish=0xff;//红外遥控传输完成
vsit_cnt=0;//红外遥控中断进入计数清零
//***********************可以在此调用按键处理函数
(2)****************************//
#ifdefVS1838_Debug
KeyConvert();
#endif
//***********************可以在此调用按键处理函数
(2)****************************//
EXTI->PR|=(u32)EXTI_Line8;//清中断标志位
return;
}
else//<67
{
if(vsit_cnt&0x01)//奇数,上升沿,低电平0.56ms结束
{
#ifdefVS1838_Debug
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<900)&&(VS1838_TIMx_temp>300))//正常0.56ms代码
{
vsit_cnt++;//红外遥控中断进入计数加1,
}
else//非正常代码
{
vs_error=vsit_cnt;//红外遥控数据错误
vsit_cnt=0;//红外遥控中断进入计数清零
#ifdefVS1838_Debug
VS1838_ErrorDisp(VS1838_TIMx_temp);
#endif
}
}//低电平0.56ms结束,上降沿
else//偶数,下降沿,判断接收代码位是0还是1,//先传低位,高位大地址
{
#ifdefVS1838_Debug
if(GPIOC->IDR&0X1000)
{
u8dat[5];
lcddispmore(0,1,5,"jiang");
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS1838 红外 遥控 中断 定时器