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--; 
        } 
    }