📄 timer.c
字号:
/*
功 能:定时器0操作接口
文件名:timer.c
编 译: WinAVR-20040720
速 度:外部4MHz
作 者:芯艺
EMAIL :changfutong@sina.com
更改记录:
2004-12-02
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include "common.h"
uchar g_bCounter;
uchar g_aBuf[26];
uchar g_bTimeOut;
//Timer0 中断,0.844 ms中断一次
SIGNAL(SIG_OVERFLOW0)
{
TCNT0=202;
if((IRPIN&_BV(IRBIT))==_BV(IRBIT))
g_aBuf[g_bCounter]=1;
else
g_aBuf[g_bCounter]=0;
g_bCounter++;
if(g_bCounter>=26)
{
TIMSK&=~_BV(TOIE0); //禁止中断
TCCR0=0; //关闭时钟源
}
}
//Timer1 中断,1s中断一次,用于超时检测
SIGNAL(SIG_OVERFLOW1)
{
TCNT1=0XF0BD;
if(--g_bTimeOut==0)
{
TIMSK&=~_BV(TOIE1);
TCCR1B=0;
}
}
void SetTimer(uchar sec)
{
TCNT1=0XF0BD;
g_bTimeOut=sec;
TCCR1B=_BV(CS12)|_BV(CS10);//1024 分频
TIMSK|=_BV(TOIE1);
}
uchar IsTimeOut(void)
{
uchar ret;
cli();
ret=g_bTimeOut;
sei();
return ret==0;
}
void CloseTimer(void)
{
TIMSK&=~_BV(TOIE1);
TCCR1B=0;
}
uchar ReadIRCode(void)
{
uchar i,j;
TCNT0=202;
g_bCounter=0;
TCCR0=_BV(CS01)|_BV(CS00); //时钟源分频64
TIMSK|=_BV(TOIE0);//中断允许
while(g_bCounter<26)
{
DelayMs(1);
}
for(i=0;i<26;i+=2)
{
if(g_aBuf[i]==g_aBuf[i+1])
return 0;
}
j=0;
for(i=14;i<26;i+=2)
{
j<<=1;
if(g_aBuf[i]==0)
j|=0x01;
}
return j;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -