Аппаратное обеспечение персонального компьютера




Программа RTCALARM - часть 2


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




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