Скачиваний:
35
Добавлен:
09.05.2014
Размер:
347.14 Кб
Скачать

firstRepeat = 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();

}

Соседние файлы в папке будильник