stm8 红外解码 使用TL IO中断与定时实现(芯片用103)
2014-12-21 13:13
531 查看
// http://blog.csdn.net/yingqiyingqi/article/details/7425047
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;
}
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)
- AVR单片机使用外部中断和定时器的NEC红外解码程序
- 使用flask_socketio实现服务端向客户端定时推送
- 使用WinIO库实现保护模式下的IO和内存读写(_inp,_outp)
- Spring--简单使用quartz实现定时作业
- Ajax4jsf使用a4j:poll实现定时刷新
- 使用Quartz实现定时功能
- Spring--简单使用quartz实现定时作业
- 使用双循环Buffer实现解码播放流媒体
- 使用C#的Timer控件来实现定时触发事件
- 使用System.Timers.Timer类实现程序定时执行
- 使用SQL Server维护计划实现数据库定时自动备份
- 使用混合脚本编程来实现的Base64解码
- 使用SQL Server维护计划实现数据库定时自动备份
- 使用SQL Server维护计划实现数据库定时自动备份
- 使用 T-SQL 实现 base64 解码
- Spring--简单使用quartz实现定时作业
- 单片机定时记数中断程序1--c语言实现
- 使用SQLServer代理实现定时清除数据库日志
- OpenJWeb使用Spring框架实现定时作业调度的例子