ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
95206 Топик полностью
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