www.pudn.com > cwin.rar > CLOCK.C
/*-----------------------------------------------------------
函数模块 clock.c 时钟和定时器模块
-----------------------------------------------------------*/
#include
#include
/*-- 局部静态变量定义 : 时钟和定时器的参数及工作变量 ------*/
static int _ClockColor = WHITE; /* 时钟数码显示色 */
static int _ClockBk = BLACK; /* 时钟背景显示色 */
static int _ClockCol = 0; /* 时钟显示列(字节) */
static int _ClockLine = 0; /* 时钟显示行(象素) */
static int _ClockXtimes = 1; /* 时钟横向放大倍数 */
static int _ClockYtimes = 1; /* 时钟纵向放大倍数 */
static int _ClockDisp = YES; /* 时钟是否显示标志 */
static int _AlarmCount = 0; /* 定时器个数 */
static ALARM *_Alarm[100]; /* 定时器队列 */
static struct time _Clock; /* 时钟变量 */
static struct date _Calendar; /* 日历变量 */
/*-----------------------------------------------------------
内部函数 _ClockFun : 处理时钟显示和整点报时
-----------------------------------------------------------*/
void far _ClockFun(void)
{
static int time = 0,count=0;
char info[8];
int i;
/*-- 处理整点报时 ---------------------*/
if(_Clock.ti_min==59 && _Clock.ti_sec>=56)
{
if(time==0)
sound(800 /* 480 */);
if(time==6)
nosound();
}
/*-- 处理半点报时 ---------------------*/
if((_Clock.ti_min==0 || _Clock.ti_min==30) && _Clock.ti_sec==0)
{
if(time==0)
sound(2000/* 1200 */);
if(time==6)
nosound();
}
/*-- 每次中断计数值加一 ---------------*/
time++;
/*-- 计数值满18则秒值加一 -------------*/
if(time>=18)
{
count++;
_Clock.ti_sec++;
/*-- 如果满60秒钟分值加一 ---------*/
if(_Clock.ti_sec>=60)
{
_Clock.ti_sec=0;
_Clock.ti_min++;
/*-- 如果满60分钟小时值加一 ---*/
if(_Clock.ti_min>=60)
{
_Clock.ti_min = 0;
_Clock.ti_hour = _Clock.ti_hour>=23?0:_Clock.ti_hour+1;
}
}
/*-- 修改时钟的显示 -------------------------------*/
if(_ClockDisp && !_VideoBusy)
{
/*-- 保存原来的放大倍数和显示寄存器值 ---------*/
int old_xt = _Xtimes;
int old_yt = _Ytimes;
unsigned char old03,old05;
/*-- 修改放大倍数为时钟显示放大倍数 -----------*/
_Xtimes = _ClockXtimes;
_Ytimes = _ClockYtimes;
/*-- 修改显示寄存器 -----------*/
outportb(0x3ce,0x05);
old05 = inportb(0x3cf);
outportb(0x3ce,0x03);
old03 = inportb(0x3cf);
outportb(0x3ce,0x03);
outportb(0x3cf,0x00);
outportb(0x3ce,0x05);
outportb(0x3cf,old05&0xfc);
info[0] = _Clock.ti_hour/10+'0';
info[1] = _Clock.ti_hour%10+'0';
info[2] = ':';
info[3] = _Clock.ti_min/10+'0';
info[4] = _Clock.ti_min%10+'0';
info[5] = ':';
info[6] = _Clock.ti_sec/10+'0';
info[7] = _Clock.ti_sec%10+'0';
/*-- 显示时钟值 ---------------*/
for(i=0;i<8;i++)
{
_Block(_ClockCol+i*_ClockXtimes,_ClockLine,_ClockXtimes,
_ClockYtimes*CHAR_HIGH,_ClockBk);
outxychar(_ClockCol+i*_ClockXtimes,_ClockLine,
_ClockColor,info[i]);
}
outportb(0x3ce,0x03);
outportb(0x3cf,old03);
outportb(0x3ce,0x05);
outportb(0x3cf,old05);
_Xtimes = old_xt;
_Ytimes = old_yt;
}
/*-- 如果某定时器到期则触发之 -----*/
for(i=0;i<_AlarmCount;i++)
{
if(_Alarm[i]->tag>0 && _Alarm[i]->t.ti_sec!=_Clock.ti_sec)
continue; /* per minate */
if(_Alarm[i]->tag>1 && _Alarm[i]->t.ti_min!=_Clock.ti_min)
continue; /* per hour */
if(_Alarm[0]->tag>2 && _Alarm[i]->t.ti_hour!=_Clock.ti_hour)
continue; /* per day */
if(_Alarm[i]->tag>3 && _Alarm[i]->d.da_day!=_Calendar.da_day)
continue; /* per month */
if(_Alarm[i]->tag>4 && _Alarm[i]->d.da_mon!=_Calendar.da_mon)
continue; /* per year */
if(_Alarm[i]->tag>5 && _Alarm[i]->d.da_year!=_Calendar.da_year)
continue; /* once only */
/*-- 触发器0是专为定时器保留 --*/
_Triggers[0].trigger = _Alarm[i]->fun;
ungeth(1);
}
/*-- 修正秒误差 -------------------*/
if(count == 5)
{
count = 0;
time = -1;
}
else
time = 0;
}
}
/*-----------------------------------------------------------
函数 run_clock : 激活时钟
-----------------------------------------------------------*/
void _Cdecl run_clock(void)
{
getdate(&_Calendar);
gettime(&_Clock);
_Int1CHfun[0] = _ClockFun;
}
/*-----------------------------------------------------------
函数 set_clock : 设置时钟显示模式
-----------------------------------------------------------*/
void _Cdecl set_clock(col,line,xtimes,ytimes,color,bk)
int col; /* 时钟显示列(字节) */
int line; /* 时钟显示行(象素) */
int xtimes; /* 时钟横向放大倍数 */
int ytimes; /* 时钟纵向放大倍数 */
int color; /* 时钟数码显示色 */
int bk; /* 时钟背景显示色 */
{
_ClockColor = color;
_ClockBk = bk;
_ClockCol = col;
_ClockLine = line;
_ClockXtimes = xtimes;
_ClockYtimes = ytimes;
}
/*-----------------------------------------------------------
函数 light_clock : 显示时钟
-----------------------------------------------------------*/
void _Cdecl light_clock(void)
{
_ClockDisp = YES;
}
/*-----------------------------------------------------------
函数 close_clock : 关闭时钟显示
-----------------------------------------------------------*/
void _Cdecl close_clock(void)
{
_ClockDisp = NO;
}
/*-----------------------------------------------------------
函数 set_alarm : 设置定时器
-----------------------------------------------------------*/
int _Cdecl set_alarm(date,time,type,fun)
struct date date; /* 定时日期 */
struct time time; /* 定时时间 */
int type; /* 定时器类型 */
unsigned (*fun)(); /* 定时器操作函数指针 */
{
int alarm_no = NO;
if((_Alarm[_AlarmCount]=malloc(sizeof(ALARM)))!=NULL)
{
_Alarm[_AlarmCount]->d = date;
_Alarm[_AlarmCount]->t = time;
_Alarm[_AlarmCount]->tag = type;
_Alarm[_AlarmCount]->fun = fun;
alarm_no = ++_AlarmCount;
}
return alarm_no;
}
/*-----------------------------------------------------------
函数 del_alarm : 删除一个定时器
-----------------------------------------------------------*/
void _Cdecl del_alarm(int alarm_no)
{
if(alarm_no>0 && alarm_no<=_AlarmCount)
{
free(_Alarm[alarm_no-1]);
for(;alarm_no<=_AlarmCount;alarm_no++)
_Alarm[alarm_no-1]=_Alarm[alarm_no];
_AlarmCount--;
}
}