📄 timer.c
字号:
#include <./Atmel/at89x52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include "source.h"
void start_t2imer(void)//初始化定时器2,每10毫秒中断一次
{
T2CON=0X00;
RCAP2L=TIMER2L; //10ms
TL2=TIMER2L;
RCAP2H=TIMER2H;
TH2=TIMER2H;
ET2=1;//enable timer2 interrupt
TR2=1;//start timer
}
void stop_t2imer(void)//停止定时器2
{
ET2=0; //disable timer2 interrupt
TR2=0; //stop timer2 counter;
}
void reset_timer(unsigned char i)//停止软定时器i
{
extern struct my_timer TT[TIMER_NUM];
TT[i].enable=0;
TT[i].count=0;
}
void set_timer(unsigned char i,unsigned int count) //设置软定时器i的超时时间为count*10毫秒
{
TT[i].count=count;
TT[i].enable=1;
}
bit detect_timeout(void){//检测定时器是否超时间
unsigned char temp;
bit ret;
ret=0;
if(timerout&TIMOUT_MOVE_ARROW){//箭头移动定时器超时,箭头可以移动一个步进
timerout &=~TIMOUT_MOVE_ARROW;
send_status_msg(MSG_STATUS_MOVE);
}
if(timerout&TIMOUT_ADV_CHANGE){//信息转换定时器超时,发送一个信息转换消息
timerout &=~TIMOUT_ADV_CHANGE;
send_hbs_msg(MSG_HBS_INFO_CHANGE);
}
if(timerout&TIMOUT_RTC){//1秒的实时时钟换定时器超时
timerout &=~TIMOUT_RTC;
rtc_update();//更新读出的RTC时间
show_time();//在屏幕上显示时间。
}
if(timerout&TIMOUT_TEMPERATURE){//温度转化定时器超时
timerout &=~TIMOUT_TEMPERATURE;
switch(others.tem_fsm){
case 0x00://等待300毫秒后开始温度转化
others.tem_fsm=0X01;
set_timer(TMPERA_TIMER,30);//power on 300 ms.
break;
case 0x01://开始温度转换
others.tem_fsm=0X02;
tmstart();//温度转换开始
set_timer(TMPERA_TIMER,150);//必须到1.5秒后才能读到温度值
break;
case 0x02://温度传感器温度转换完毕,可以读取温度值了。
others.tem_fsm=0X00;
temp=tmrtemp_all();//temp为返回的温度值,其值为最高位为‘1’表明位负的温度,为‘0’表明为正的温度,其他的7比特表明温度值。
others.temperature=temp;
send_hbs_msg(MSG_HBS_UPD_TEMPE);//通知屏幕下半部分显示的程序,温度可以进行更新了。
set_timer(TMPERA_TIMER,50);//再等待0.5秒后进行状态转换
break;
default:
others.tem_fsm=0x00;
set_timer(TMPERA_TIMER,50);
break;
}
}
if(timerout&TIMOUT_TEST_TIMER){//测试定时器超时
static unsigned char test_num=0;
static unsigned char flag_inc=1;
static unsigned char flag_clear=0;
timerout &=~TIMOUT_TEST_TIMER;
if(flag_clear){//发送清除三角箭头消息
flag_clear--;
send_status_msg(MSG_STATUS_CLEAR);
}
else{//在正常模式下,发送向上或向下箭头的消息
if(flag_inc){//在每个TEST_TIMER超时时,使test_num的数值增加1,增长到22时停止增长
if(test_num>21){//到达数字22后数字停止跳动3秒
test_num=1;
flag_clear=3;
}
else{
test_num++;
send_status_msg(MSG_STATUS_UP);
}
}
else{//在每个TEST_TIMER超时时,使test_num的数值减少1,减少到1时停止减少
if(test_num>2){
test_num--;
send_status_msg(MSG_STATUS_DOWN);
}
else {//到达数字1后数字停止跳动3秒
test_num=1;
flag_clear=3;
}
}
scentry.storey[1]=test_num/10;//把test_num十位赋给显示数字的十位
scentry.storey[0]=test_num%10;//把test_num个位赋给显示数字的个位。这样显示数字就在由1增加到22,再由22减少到1,如此循环。
}
}
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -