99
преобразования
ad=ADR;//== читаем код напряжения из регистра ADR (регистр данных
АЦП)
ADSCR|=0x07;//== снова запускаем АЦП (7-ой канал), бит ADCO=0 -
однократный пуск
}
#pragma interrupt_handler KBD_int
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 //== клавиш
void KBD_int(void){//== обработчик нажатия на клавишу (БЕЗ
сканирования!)
char row,col,temp,r,i;//== col - номер колонки слева, row - номер ряда сверху
INTKBSCR|=(1<<ACKK);//== подтверждаем обработку прерывания
Delay(800);//== задержка на время возможного дребезга при нажатии
if((r=(PTA&0xF0)>>4)==0x0F)goto exit;//==
r=0111(7),1011(11),1101(13),1110(14)
//== "goto exit" игнорирует возможный дребезг при отпускании клавиши и
появление
//== кода r = 1111 вместо 0111..1110
row=r[rown];//== выбираем из таблицы номер ряда = (0,1,2,3)
for(i=0;i<3;i++){//== ищем в какой колонке находится нажатая клавиша
PTA|=0x08>>i;//== последовательно "перекрываем" единицей колонки
PTA3..1(col=2..0)
if((PTA&0xF0)==0xF0){col=2-i;break;}//== если 1 перекрыла 0 -
закончить проверку
}
keynum=col+row*3;//== вычисляем номер нажатой клавиши (0..11)в таблице
key
exit:
PTA=0b11110001;//== возвращаем начальное состояние выводов порта А
INTKBSCR|=(1<<ACKK);//== сбрасываем возможные запросы при
манипулир. с битами PTA
keypressed=1;//== устанавливаем признак (флаг) нажатия клавиши (этот
признак
} //== можно использовать в основной программе - main())
//== инициализируем таблицу векторов прерываний по соотв. адресам
(таблица 1.3)
#pragma abs_address:0xFFE0
void (*_vec_keyboard)(void) = KBD_int;
#pragma end_abs_address
#pragma abs_address:0xFFDE
void (*_vec_adc)(void) = ADC_int;