?? 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 + -