VS1838红外遥控中断+定时器版文档格式.docx

上传人:b****6 文档编号:22187581 上传时间:2023-02-03 格式:DOCX 页数:17 大小:19.44KB
下载 相关 举报
VS1838红外遥控中断+定时器版文档格式.docx_第1页
第1页 / 共17页
VS1838红外遥控中断+定时器版文档格式.docx_第2页
第2页 / 共17页
VS1838红外遥控中断+定时器版文档格式.docx_第3页
第3页 / 共17页
VS1838红外遥控中断+定时器版文档格式.docx_第4页
第4页 / 共17页
VS1838红外遥控中断+定时器版文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

VS1838红外遥控中断+定时器版文档格式.docx

《VS1838红外遥控中断+定时器版文档格式.docx》由会员分享,可在线阅读,更多相关《VS1838红外遥控中断+定时器版文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

VS1838红外遥控中断+定时器版文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1