Аппаратное обеспечение IBM PC



         

Использование часов реального времени - часть 2


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

Эта функция выполняет все виды обслуживания часов реального времени, которые поддерживаются BIOS.

Для иллюстрации основных приемов работы с часами мы подготовили программу, которая выводит на экран текущие дату и время. Затем устанавливается будильник. Он должен сработать через одну минуту и подать звуковой сигнал.

Перед установкой будильника программа подключает свой обработчик прерывания 4Ah. Это прерывание вызывается при срабатывании будильника. Перед завершением работы программа сбрасывает будильник и восстанавливает вектор прерывания 4Ah.

#include <stdio.h> #include <stdlib.h> #include <dos.h> #include "sysp.h"

// Выключаем проверку стека и указателей

#pragma check_stack( off ) #pragma check_pointer( off )

// Макро для выдачи звукового сигнала

#define BEEP() _asm { \ _asm mov bx,0 \ _asm mov ax, 0E07h \ _asm int 10h \ }

void main(void);

// Описание программы-обработчика прерывания // будильника

void _interrupt _far alarm(void);

// Переменная для хранения старого // вектора будильника

void (_interrupt _far *old_4a)(void);

void 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(&(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)));




Содержание  Назад  Вперед