📄 timer.c
字号:
/**********************************************
* File: Timer.C
* Description: Timer Function
* Created Date: 2007-10-01
* Last Modified: 2007-10-01
* Author: Jeffrey - Schicksal@126.com
* Notes: None
**********************************************/
//#include "Atmel/AT89X51.h"
#include "SST/SST89x5x4.H"
#include "INTRINS.H"
#include "timer.h"
#include "MAX7219.h"
#include "DS1620.h"
#include "keys.h"
#define TH0_VALUE 0x06
#define TL0_VALUE 0x00
unsigned int timer_tick;
unsigned int timer_tick_500ms;
/**********************************************
* Function: TIMER_Init
* Input Variables: None
* Return Variables: None
* Usage: T0 Initialization
*********************************************/
void TIMER_Init(void)
{
ET0 = 0; // 关闭T0的中断
TMOD = 0x00; // T0工作在模式0
TCON = 0x00; // 暂时未启动T0
TL0 = TL0_VALUE;
TH0 = TH0_VALUE; // 产生2ms中断 |24 MHz 晶振
ET0 = 1; // 打开T2的中断
timer_tick = 0;
timer_tick_500ms = 0;
}
/**********************************************
* Function: timer0_interrupt
* Input Variables: None
* Return Variables: None
* Usage: TIMER_Interrupt Service Routine
*********************************************/
void timer0_interrupt(void) interrupt 5 using 1
{
EA = 0; // 关全局中断
TF0 = 0; // 清中断标志
timer_tick++; // 2ms
if ( timer_tick == 250 ) // 1s = 2ms X 500
{
timer_tick_500ms += 1; // 秒计数增1
timer_tick = 0; // 2ms计数清零
}
TL0 = TL0_VALUE; // T0初值装载
TH0 = TH0_VALUE; // 产生2ms中断 |24 MHz 晶振
EA = 1; // 开中断
}
/**********************************************
* Function: TIMER_Start
* Input Variables: None
* Return Variables: None
* Usage: Start T0
*********************************************/
void TIMER_Start()
{
TR0 = 1; // 启动T0
}
volatile unsigned char time[4]={12,0,0,0};
volatile unsigned char alarm[2]={7,0};
extern volatile unsigned char flag;
extern volatile unsigned char alarm_flag;
extern volatile unsigned char change_timeflag;
extern volatile unsigned char change_adjustflag;
/**********************************************
*Function: void Display_Time()
* Input Variables: None
* Return Variables: None
* Usage: Display Time
*********************************************/
void Display_Time()
{
unsigned char data_dp[6] ;
unsigned char i;
if(timer_tick_500ms>0)
{
time[3]++;
if (time[1]==0xff)
{
time[1]=59;
}
if (time[0]==0xff)
{
time[0]=23;
}
if (time[3]>1)
{
time[3]=0;
time[2]++;
}
if (time[2]>=60)
{
time[2]-=60;
time[1]++;
}
if (time[1]>=60)
{
time[1]-=60;
time[0]++;
}
if (time[0]>=24)
time[0]-=24;
if (change_adjustflag==0) // 显示时钟
{
for (i=0;i<4;i+=2)
{
data_dp[i]=time[i/2]/10;
data_dp[i+1]=time[i/2]%10;
}
data_dp[2]=data_dp[2]|(1<<7);
data_dp[3]=data_dp[3]|(1<<7);
if (change_timeflag==0)
{
if (time[2]%2==1)
{
data_dp[2]=data_dp[2]-0x80;
data_dp[3]=data_dp[3]-0x80;
}
}
else
{
if (change_timeflag==1)
{
// 正在修改小时
if (time[3]==0)
{
data_dp[0]=0x0f;
data_dp[1]=0x0f;
}
}
else
{
// 正在修改分钟
if (time[3]==0)
{
data_dp[2]=0x8f;
data_dp[3]=0x8f;
}
}
}
}
else // 修改闹表
{
if (alarm_flag==0) // 没有闹表
{
for (i=0;i<4;i++)
data_dp[i]=0x0a;
if (time[2]%2==0)
{
data_dp[2]=data_dp[2]|(1<<7);
data_dp[3]=data_dp[3]|(1<<7);
}
}
else // 有闹表
{
for (i=0;i<4;i+=2)
{
data_dp[i]=alarm[i/2]/10;
data_dp[i+1]=alarm[i/2]%10;
}
data_dp[2]=data_dp[2]|(1<<7);
data_dp[3]=data_dp[3]|(1<<7);
if (change_timeflag==0)
{
if (time[2]%2==1)
{
data_dp[2]=data_dp[2]-0x80;
data_dp[3]=data_dp[3]-0x80;
}
}
else
{
if (change_timeflag==1)
{
// 正在修改小时
if (time[3]==0)
{
data_dp[0]=0x0f;
data_dp[1]=0x0f;
}
}
else
{
// 正在修改分钟
if (time[3]==0)
{
data_dp[2]=0x8f;
data_dp[3]=0x8f;
}
}
}
}
}
for (i=0;i<4;i++)
write_7219(i+1,data_dp[i]);
timer_tick_500ms=0; // 清500ms计数
}
}
/**********************************************
*Function: void Check_Alarm()
* Input Variables: None
* Return Variables: None
* Usage: Display Time
*********************************************/
void Check_Alarm()
{
if ((time[0]==alarm[0]) && (time[1]==alarm[1]) && (alarm_flag==1) && (change_adjustflag==0))
{
SetBuzzer(0x00); // 闹铃响
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -