Рис. 2.5. Регистр управления и состояния модуля клавиатуры -
INTKBSCR
Соответствующий фрагмент (процедура KBDinit) инициализации
модуля клавиатуры будет выглядеть следующим образом:
KBDinit(){//== установка интерфейса клавиатуры в исходное
состояние
DDRA=0x0E;//== 4 ст. бита - на ввод (линии возврата), 3 бита PTA1..3
- на вывод
PTAPUE=0xF0;//== включаем 4 подтягивающих резистора (PullUp) на
входах PTA4..7
//== если не нажата ни одна из клавищ, на ВСЕХ линиях возврата -
будут единицы
PTA=0xF1;//== на все выходы PA1..PA3 подаем нули (без
сканирования)
INTKBIER=0xF0;//== разрешить прер-я от отрицат. фронта (``|__) на
входах PTA4..7
}
В обработчике прерывания KBD_int (см. внизу) при нажатии на
клавишу необходимо подтвердить обработку установив бит ACKK=1,
который автоматически обнуляется при возникновении прерывания. Как
обычно, предусматриваем задержку на время возможного “дребезга”
контактов клавиши. Затем читаем код на входах PTA7..4
(r=(PTA&0xF0)>>4)) и выбираем из таблицы rown номер ряда (row=rown[r]).
Маска F0 нужна, т.к. считываются все биты порта целиком, но для нас здесь
имеют значения только четыре старших. Номер колонки находим
последовательно подавая единицы на выходы PTA3..1 (PTA|=0x08>>i) и
повторно считывая код на входах PTA7..4. Если ноль в колонке нажатой
клавиши “перекрыт”, т.е. 4 старших бита равны 1111=F
(if((PTA&0xF0)==0xF0)), записываем номер колонки (col=2-i) и вычисляем
номер нажатой клавиши (keynum=col+row*3). Оставшиеся операции
достаточно откомментированы.
char key[]={'1','2','3','4','5','6','7','8','9','*','0','#',''};//== ASCII коды клавиш
char keynum, keypressed=0; //== номер клавиши и признак "клавиша
была нажата"
char rown[]={0,0,0,0,0,0,0,3,0,0,0, 2, 0, 1, 0, 0};//== таблица номеров
рядов клавиш 7 11 13 14
58