RTCALARM


. -, . -, - .

CMOS, , .

RTCALARM ( 4.1), . , .

4Ah. . 4Ah.

4.1. rtcalarm\rtcalarm.

// =====================================================

//

//

// (C) ., 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

//

// http://www.dials.ccas.ru/frolov

// =====================================================

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <dos.h>

typedef struct _SYSTIMER_

{

char hour; //

char min; //

char sec; //

unsigned year; //

char month; //

char day; //

char daylight_savings; //

} SYSTIMER;

#define RTC_GET_TIME 2 // ;

#define RTC_SET_TIME 3 // ;

#define RTC_GET_DATE 4 // ;

#define RTC_SET_DATE 5 // ;

#define RTC_SET_ALARM 6 // ;

#define RTC_CLEAR_ALARM 7 // .


int bcd1bin(char *bcd);

int bcd2bin(char *bcd);

void bin1bcd(int bin, char *bcd);

void _interrupt _far alarm(void);

int timer(char fn, SYSTIMER *tm);

//

#pragma check_stack( off )

#pragma check_pointer( off )

//

#define BEEP() _asm { \

_asm mov bx,0 \

_asm mov ax, 0E07h \

_asm int 10h \

}

// -

//

void _interrupt _far alarm(void);

//

//

void (_interrupt _far *old_4a)(void);

union REGS reg;

int main(void)

{

char *month_to_text[] =

{

"",

"",

"",

"",

"",

"",

"",

"",

"",

"",

"",

""

};

SYSTIMER tmr;

//

timer(RTC_GET_DATE, &tmr);

timer(RTC_GET_TIME, &tmr);

//

printf("\n %d , %s, %d ."

"\n",

bcd2bin((char*)&(tmr.year)),

month_to_text[bcd1bin(&(tmr.month)) - 1],

bcd1bin(&(tmr.day)));

printf("\n - %02.2d:%02.2d:%02.2d"

"\n",

bcd1bin(&(tmr.hour)),

bcd1bin(&(tmr.min)),

bcd1bin(&(tmr.sec)));

//

// .

//

// ,

// 59,

// .

//

//

bin1bcd(bcd1bin(&(tmr.min)) + 1, &(tmr.min));



// ,

// .

printf("\n "

"- %02.2d:%02.2d:%02.2d"

"\n",

bcd1bin(&(tmr.hour)),

bcd1bin(&(tmr.min)),

bcd1bin(&(tmr.sec)));

//

// ,

// 0x4a

old_4a = _dos_getvect(0x4a);

_dos_setvect(0x4a, alarm);

//

timer(RTC_SET_ALARM, &tmr);

printf("\n . "

" "

"\n ...");

getch();

//

//

timer(RTC_CLEAR_ALARM, &tmr);

_dos_setvect(0x4a, old_4a);



return 0;

}

// ----------------------------------

//

// BCD

//

// ----------------------------------

int bcd1bin(char *bcd)

{

return( ((*bcd) & 0x0f) +

10 * (((*bcd) & 0xf0) >> 4) );

}

// ----------------------------------

//

// BCD

//

// ----------------------------------

int bcd2bin(char *bcd)

{

return( bcd1bin(bcd) +

100 * bcd1bin(bcd + 1) );

}

// ----------------------------------

//

//

// BCD

// ----------------------------------

void bin1bcd(int bin, char *bcd)

{

int i;

i = bin / 10;

*bcd = (i << 4) + (bin - (i * 10));

}

// ----------------------------------

//

// .

// -

// ----------------------------------

void _interrupt _far alarm(void)

{

BEEP();

BEEP();

BEEP();

BEEP();

BEEP();

BEEP();



BEEP();

}

/**

*.Name timer

*.Title

*

*.Descr

*

* INT 1Ah

*

*.Proto int timer(char fn, SYSTIMER *tm)

*

*.Params char fn - :

*

* RTC_GET_TIME - ;

* RTC_SET_TIME - ;

* RTC_GET_DATE - ;

* RTC_SET_DATE - ;

* RTC_SET_ALARM - ;

* RTC_CLEAR_ALARM - .

*

* SYSTIMER tm - ,

*

* :

*

*.Return 0 - ;

* -1 -

* ;

**/

int timer(char fn, SYSTIMER *tm)

{

reg.h.ah = fn;

switch (fn)

{

case RTC_SET_TIME:

{

reg.h.ch = tm->hour;

reg.h.cl = tm->min;

reg.h.dh = tm->sec;

reg.h.dl = tm->daylight_savings;

break;

}

case RTC_SET_DATE:

{

reg.x.cx = tm->year;

reg.h.dh = tm->month;

reg.h.dl = tm->day;

break;

}

case RTC_SET_ALARM:

{

reg.h.ch = tm->hour;

reg.h.cl = tm->min;

reg.h.dh = tm->sec;

break;

}

}

int86(0x1a,&reg,&reg);

if(reg.x.cflag == 1)

return(-1);

switch (fn)

{

case RTC_GET_TIME:

{

tm->hour = reg.h.ch;

tm->min = reg.h.cl;

tm->sec = reg.h.dh;

break;

}

case RTC_GET_DATE:

{

tm->year = reg.x.cx;

tm->month = reg.h.dh;

tm->day = reg.h.dl;

break;

}

}

return 0;

}










Forekc.ru
, , , , , , , , , ,