Dany (25.07.2007 17:29, просмотров: 1) ответил rezident на Принципиальная разница в том, что сканирование происходит за известное конечное время, которое гораздо меньше периода сканирования.
while у меня ждал прерывания от таймера, раз в 30 мс. с
/*===========================================
определения для линий матричной клавиатуры
===========================================*/
// определения портов клавиатуры
// порты строк
#define KB_PORT_ROW PORTD
#define KB_PIN_ROW PIND
#define KB_DDR_ROW DDRD
// порты столбцов
#define KB_PORT_COL PORTD
#define KB_PIN_COL PIND
#define KB_DDR_COL DDRD
// линии строк
#define KB_ROW_WIRES ((1 << PD1) | (1 << PD2))
#define KB_ROW_SHIFT 1 // количество сдвигов вправо кода строк при формировании кода кнопки
// линии столбцов
#define KB_COL_WIRES ((1 << PD5) | (1 << PD6) | (1 << PD7))
char code=0xFF;
/******************************************************************************
Опрос клавиатуры. Возвращает код нажатой кнопки в переменную 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); // считываем состояние линий столбцов и преобразуем в код
code= (code1 | code2 | 0x1C); // возвращаем полученные коды состояний столбцов и строк
}
char inkey(void)
{
char press;
press=code; // Код нажатой клавиши
if(press!=0xFF) // Если есть нажатые кнопки
while(code!=0xFF);// Жду отпускания кнопки
return press; // Сохраняю код сработавшей клавиши
}
timer_init(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
TCCR0=0x05;
TCNT0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
#asm("sei")
}
/c