отчеты по лабораторным работам / будильник / lab4
.docfirstRepeat = 0; // сбрасываем флаг первого повтора
delay = repeatDelay; // счетчик задержки = задержка между 1 и 2 повторами
} // если не первый повтор клавиши (напр. ААА), то
else delay = repeatSpeed; // счетчик задержки = задержка между 2-3,3-4 и т.д. повторами
writeKeyBuffer(key); // записываем клавишу в буфер
}
}
else { // если клавиша не нажата, то
drebezgWait = 1; // устанавливаем флаг дребезга
firstRepeat = 1; // устанавливаем флаг первого повтора
}
}
else delay--; // если счетчик задержки не равен 0, то уменьшаем его (ждем)
}
/*
Функция: инициализация таймеров 0 и 1 и UART
таймер 1 - для UART
таймер 0 - для задержек при выводе символов (дребезг, повторы)
Входные параметры: repDelay - задержка между первыми двумя повторениями символа
repSpeed - задержка между последующими повторениями
Выходные параметры: нет
*/
void initTimer(int repDelay, int repSpeed) {
repeatDelay = repDelay;
repeatSpeed = repSpeed;
TH0 = 0xDC; // настройка задержки 10 мс
TL0 = 0x32; //
TCON = 0x50; // запуск таймеров 0 и 1
TMOD = 0x21; // таймер 1 работает в 8-битном режиме с автоперегрузкой
// таймер 0 работает в 16-битном режиме
ET0 = 1; // разрешаем прерывания от таймера 0
}
void initKeyboard() {
initTimer(100, 20); // устанавливаем таймер на задержки:
// 1 с - между первым и вторым повторами
// 0,2 с - между последующими повторами символов
setVector(0x200B, (void *) timerHandler); // устанавливаем вектор обработчика прерывания
}
Главная программа
#include "aduc812.h"
#include "led.h"
#include "max.h"
#include "rtc.h"
#include "i2c.h"
#include "async.h"
#include "keyboard.h"
#include "lcd.h"
#include "tim.h"
#include "sound.h"
#define ERR_OUT_OF_RANGE "\n\rnumber not 0-255\n\r\0"
#define ERR_INVALID_CHAR "\n\rinvalid operator\n\r\0"
#define ERR_CLEAR_STOPWATCH "\n\rclear stopwatch\n\r\0"
unsigned xdata char word[16] = {'E','n','t','e','r',' ','(','h','h',':','m','m',':','s','s',')'};
int i1;
void WriteEnter()
{
Clear();
for (i1 = 1; i1 <= 16; i1++)
{
GotoXY(i1,1);
PrintChar(word[i1-1]);
}
}
void EnterTime(unsigned char mode)
{
unsigned char c;
int i = 0, d = 0, hms = 0, hh = 0, mm = 0, ss = 0;
unsigned char allow_exit = 0;
while(1)
if (readKeyBuffer(&c))
{
switch(i)
{
case 0:
if(c>=0x30 && c<0x3A)
{
d=(c-0x30)*10;
i=1;
GotoXY(3*hms + 1, 2);
PrintChar(c);
}
else if (c == '#') return;
break;
case 1:
if(c>=0x30 && c<0x3A)
{
d+=(c-0x30);
GotoXY(3*hms + 2, 2);
PrintChar(c);
i=0;
switch(hms)
{
case 0:
if (d >= 0 && d <= 23)
{
hh = d;
hms = 1;
GotoXY(3, 2);
PrintChar (':');
}
else
{
GotoXY(1,2); PrintChar (' '); GotoXY(2,2); PrintChar (' ');
}
break;
case 1:
if (d >= 0 && d <= 59)
{
mm = d;
hms = 2;
GotoXY6, 2);
PrintChar (':');
}
else
{
GotoXY(4,2); PrintChar (' '); GotoXY(5,2); PrintChar (' ');
}
break;
case 2:
if (d >= 0 && d <= 59)
{
ss = d;
hms = 0;
allow_exit = 1;
}
else
{
GotoXY(7,2); PrintChar (' '); GotoXY(8,2); PrintChar (' ');
}
break;
}
d = 0;
}
else if (c == '#') return;
break;
}
if (allow_exit)
{
if (mode == 0)
{
time.hour = hh;
time.min = mm;
time.sec = ss;
if (set_time(&time))
{
return;
}
}
else
{
alarm_time.hour = hh;
alarm_time.min = mm;
}
break;
}
}
}
void InitTimes()
{
time.hour = 0;
time.min = 0;
time.sec = 1;
if (set_time(&time))
return;
alarm_time.hour = 0;
alarm_time.min = 0;
alarm_time.sec = 0;
}
void startStop()
{
unsigned char symbol;
int i = 0;
while(1)
{
if (readKeyBuffer(&symbol))
{
if (IsFinish)
{
ET1 = 0;
snd_shut_up;
init_timer2(S9600);
IsFinish = !IsFinish;
continue;
}
switch (symbol)
{
case 'A':
ET1 = 0;
WriteEnter();
EnterTime(0);
Clear();
ET1 = 1;
break;
case 'B':
ET1 = 0;
WriteEnter();
EnterTime(1);
Clear();
ET1 = 1;
break;
}
}
}
}
void main( void )
{
InitTimes();
InitLCD();
initKeyboard();
init_timer2(S9600);
startStop();
}