rezident (25.07.2007 23:21, просмотров: 1) ответил Dany на Решил функцию оставить в следуюшем виде...
ИМХО это вариант ничуть не лучше. К тому же программа возвращает не собственно код нажатой клавиши, а битовое состояние матрицы кнопок. Если ваша функция inkey занимается лишь устранением дребезга, а не полным формированием кодов кнопок, то я бы предложил такой вариант ее.
<c>
unsigned char key;
void inkey(void)
{ static unsigned char matrix;
unsigned char press;
press=~code; // Код нажатой кнопки, только уже в нормальном виде 0-не нажата, 1-нажата
key=(~(press^matrix))&matrix; // останутся только те биты, которые соответствуют нажатым кнопкам, без дребезга
matrix=press; // сохраним новое состояние матрицы кнопок
}
</c>
Вызывать эту функцию inkey нужно в том же прерывании KB_Read_2x3 с периодом 20-30мс, что и процедура сканирования. Состояние матрицы кнопок считывайте из глобальной переменной key.
Останется правда проблема, что факт нажатия кнопок не всегда будет фиксироваться, если пользователь будет удерживать кнопку меньшее время, чем ваша программа обрабатывает событие по нажатию кнопки. Для избежания этого обычно делают буфер клавиатуры, в который помещают коды нажатых (и/или отжатых) кнопок.