Dany (27.07.2007 16:23, просмотров: 1) ответил rezident на Не-а. Не будет работать.
Спасибо, за замечания. Будет по простому... <c>
char key; // Код нажатой клавиши, формируется KB_Read_2x3
char inkey(void)
{
static char press;
char pressNow;
pressNow=key; //получаем скан нажатой кнопки
if (!(pressNow^press)) key=0;
/* Если код клавиши не изменился
значит не нажата новая клавиша*/
press=pressNow;
return key;
}
/******************************************************************************
Опрос клавиатуры. Возвращает код нажатой кнопки в переменную 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); // возвращаем полученные коды состояний столбцов и строк
}