33
{--------------------------------------------------------------}
{ functions }
{--------------------------------------------------------------}
function ScanKeyOnce (var kn: byte):boolean;//== однокр. сканирование клав-
ры
var row,col: byte; //== var kn - параметр переменная № клавиши
var delay:word;
begin
for col:=0 to 3 do //== сканируем по столбцам матрицы клавиатуры
PORTD:=not(1 shl col);//== 11111110,11111101,11111011,11110111 бегущий
//== ноль)
for row:=0 to 2 do //== сканируем по строкам матрицы клавиатуры
if ((PIND and ($10 shl row))=0) then //== если обнаружен ноль, то
kn := col*3+row;//== вычисляем порядковый № клавиши (0..11)
for delay:=0 to 5000 do endfor;//== задержка на дребезг контактов
return (true); //== возвращаем бит "обнаружено нажатие клавиши"
endif;
endfor;
endfor;
return (false); //== возвращаем бит "ни одна из клавиш не нажата"
end;
procedure Init_Ports; //== задаем направления передачи данных через порты,
begin //== а также начальные значения
DDRD:=%10001111; //== PD0..PD3 выводим "бегущий 0", PD4..PD6
//== считываем код возврата
//== линия PORTD.7 подключена к пъезодинамику, поэтому настроим ее
//== на вывод
DDRC:=$FF; //== порт C на вывод 8-ми сегментного кода
DDRE:=%11110000; //== бит7 порта E (LED) на вывод(по RESET'у все
//== порты настроены на ввод)
//== 6,5,4 биты на базы транзисторов, коллекторы к общим анодам
//== индикаторов
PORTE:=%11111111; //== гасим индикаторы, подавая на их аноды нули
//== через инверторы
end;
procedure Init_Timer0Async; //== настройка Таймера0 для работы от кварца
//== 32768Гц
begin
TCCR0:=$0D; //== бит CS00=CS02=1(предделитель=128),WGM01=1(сброс
//== счетчика при совп.)
OCR0:=$FF; //== регистр кода совпадения (256-1): 32768/128/256=ровно 1Гц
//== режим совпадения предпочтительнее режима переполнения, т.к. вместо
//== FF можно выбирать другие значения
ASSR.3:=1; //== бит AS0=1 - переходим в асинхронный режим Timer0 от
//== кварца 32768Гц