Dany (27.07.2007 09:48, просмотров: 1) ответил Dany на Здравствуйте, Уважаемые. Помогите разобраться с матричной клавиатурой. Возник ряд вопросов, нуждающихся в ответе.
Посмотрите пожалуйста, подкорректированный вариант... <c>
char key; // Код нажатой клавиши, формируется KB_Read_2x3
void inkey(void)
{
static char compare, press;
char pressNow;
pressNow=key; //получаем скан нажатой кнопки
if (((pressNow^press)==0)&&((pressNow^compare)!=0)) key=pressNow;
/* Если текущее и предыдущее нажатия совпадают значит дребезга нет
Если код клавиши изменился
значит нажата новая клавиша, сохраняем ее в key*/
compare=pressNow;
press=pressNow;
}
/******************************************************************************
Опрос клавиатуры. Возвращает код нажатой кнопки в переменную code.
В старшей тетраде – состояние линий строк, в младшей тетраде – состояние линий столбцов
Если в одной из тетрад кода кнопки более одной единицы, код не действительный
******************************************************************************/
// Прерывание TIMER 0 для опроса клавиатуры каждые 32 ms
interrupt [TIM0_OVF] void KB_Read_2x3(void)
{
char code1, code2;
KB_DDR_ROW &= ~KB_ROW_WIRES; // порт строк на ввод
KB_PORT_ROW |= KB_ROW_WIRES; // к выводам порта строк подключаем pull-up резисторы
KB_DDR_COL |= KB_COL_WIRES; // порт столбцов на вывод
KB_PORT_COL &= ~KB_COL_WIRES; // на всех выводах порта столбцов лог "0"
#asm("nop") // задержка на один такт, для установления сигналов на выводах порта
code1 = (KB_PIN_ROW >> KB_ROW_SHIFT) & 0x3; // считываем состояние линий строк и преобразуем в код
KB_DDR_COL &= ~KB_COL_WIRES; // порт столбцов на ввод
KB_PORT_COL |= KB_COL_WIRES; // к выводам порта столбцов подключаем pull-up резисторы
KB_DDR_ROW |= KB_ROW_WIRES; // устанавливаем направление порта строк на вывод
KB_PORT_ROW &= ~KB_ROW_WIRES; // на всех линиях порта строк лог "0"
#asm("nop") // задержка на один такт, для установления сигналов на выводах порта
code2 = (KB_PIN_COL & 0xE0); // считываем состояние линий столбцов и преобразуем в код
key=~(code1 | code2 | 0x1C); // возвращаем полученные коды состояний столбцов и строк
inkey();
}
</c>