stm8 红外解码 使用TL IO中断与定时实现(芯片用103)
2012-04-04 10:20
519 查看
void EXTI_init(void) { EXTI_CR1_PCIS = 2; // PC口下降沿触发中断 } void TIM1_init(void) { CLK_PCKENR1|=0x80; //开启定时器1外设时钟 TIM1_PSCRH = 0; // 8M系统时钟经预分频f=fck/(PSCR+1) TIM1_PSCRL = 15; // PSCR=0x1F3F,f=8M/(15+1)=1/2MHz,每个计数周期2US TIM1_ARRH = 0xff; // 自动重载寄存器ARR=0xffff=130ms TIM1_ARRL = 0xff; TIM1_IER_UIE = 1; // 允许更新中断 TIM1_EGR_UG = 1; //产生更新事件 TIM1_CR1_ARPE = 1; // 自动装载 TIM1_CR1_CEN = 0; // 禁止计数 定时器1关 } #pragma vector=0x02 __interrupt void EXTI_PC3_TLI(void) { switch(IR_ID) { //解码开始 case 0: { IR_ID=1; TIM1_CR1_CEN =1; TIM1_CNTRH=0; TIM1_CNTRL=0; } break; //同步码头 case 1: { TIM1_CR1_CEN =0; //定时器1关 HIGH_WORD=TIM1_CNTRH; //保存高低字节 LOW_WORD=TIM1_CNTRL; TIM1_CNTRH=0; TIM1_CNTRL=0; TIM1_CR1_CEN =1; //定时器1开 SURGE_INTERVAL=0; //测量数据整开 SURGE_INTERVAL=(u16)HIGH_WORD; SURGE_INTERVAL=SURGE_INTERVAL<<8; SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD; bak1=SURGE_INTERVAL; nop(); //引导码捕捉 if(SURGE_INTERVAL>=6300&&SURGE_INTERVAL<=7300) { IR_ID=2; //遥控头获得位置1 SURGE_COUNT=0; } else { IR_ID=0; } } break; //解码 case 2: { TIM1_CR1_CEN =0; //定时器1关 HIGH_WORD=TIM1_CNTRH; //保存高低字节 LOW_WORD=TIM1_CNTRL; TIM1_CNTRH=0; TIM1_CNTRL=0; TIM1_CR1_CEN =1; //定时器2开 SURGE_INTERVAL=0; //测量数据整开 SURGE_INTERVAL=(u16)HIGH_WORD; SURGE_INTERVAL=SURGE_INTERVAL<<8; SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD; if(SURGE_COUNT<32) { if(SURGE_INTERVAL>=500&&SURGE_INTERVAL<=650)//0码 { IR_CODE=IR_CODE<<1; SURGE_COUNT++; } else if(SURGE_INTERVAL>=1000&&SURGE_INTERVAL<=1300)//1码 { IR_CODE=IR_CODE<<1; IR_CODE=IR_CODE|0x0001; SURGE_COUNT++; } else { IR_ID=0; IR_CODE=0; SURGE_COUNT=0; } break; } else { IR_COMPLAT=1; IR_ID=3; SURGE_COUNT=0; IR_REPEAT_COUNT=0; //IR重复码清零 break; } } break; case 3: { TIM1_CR1_CEN =0; //定时器1关 HIGH_WORD=TIM1_CNTRH; //保存高低字节 LOW_WORD=TIM1_CNTRL; TIM1_CNTRH=0; TIM1_CNTRL=0; TIM1_CR1_CEN =1; //定时器1开 SURGE_INTERVAL=0; //测量数据整开 SURGE_INTERVAL=(u16)HIGH_WORD; SURGE_INTERVAL=SURGE_INTERVAL<<8; SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD; if(SURGE_INTERVAL>=5000&&SURGE_INTERVAL<=8000) //100ms为连加信号 { IR_REPEAT_FOLLOW_UP=1; IR_ID=3; if(IR_REPEAT_COUNT<250) { IR_REPEAT_COUNT++; } } } break; default: break; } } #pragma vector=TIM1_OVR_UIF_vector __interrupt void TIM1_OVR_UIF(void) { TIM1_SR1 = 0; // 清除更新中断标记 TIM1_CNTRH=0; TIM1_CNTRL=0; IR_ID=0; printf("连按次数: %d\n\r", IR_REPEAT_COUNT); TIM1_CR1_CEN =0; IR_REPEAT_COUNT=0; }
相关文章推荐
- stm8 红外解码 使用TL IO中断与定时实现(芯片用103)
- 使用flask_socketio实现服务端向客户端定时推送
- AVR单片机使用外部中断和定时器的NEC红外解码程序
- 在Spring Boot中使用@Scheduled实现定时任务
- 20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序
- PHP中使用sleep函数实现定时任务实例分享
- iOS使用socketIO实现长连接
- Spring--简单使用quartz实现定时作业
- windows下使用PHP实现定时执行脚本
- 使用Spring的@Scheduled实现定时任务
- Linux非阻塞IO(六)使用poll实现非阻塞的服务器端
- 使用 T-SQL 实现 base64 解码
- Linux使用crontab实现PHP执行定时任务
- linux使用crontab实现PHP执行计划定时任务
- 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸,androidalarmmanager
- Digilent GENESYS vertex5开发板实现调用AC97(LM4550芯片)IP和LCD1602的使用
- 【nginx】定时器的实现及定时事件的使用
- 使用node.js和socket.io实现多人聊天室
- Linux下使用Python实现定时push到github
- 详解如何使用koa实现socket.io官网的例子