программа-обработчик (по таймеру):
Код: Выделить всё
#define KB_ANTIDREB 1
uint8_t i;
uint8_t kb_buff=0;
uint8_t kb_out=0;
KB_PORT &= ~(1<<KB_LOAD); // дергаем LD схемы в ноль - в порт вывода загружаются данные
KB_PORT |= (1<<KB_LOAD); // поднимаем LD
if(KB_PIN&(1<<KB_Q7)) kb_buff|=1; //считываем первый пин (нога D7)
for(i=0;i<7;i++)
{
KB_PORT &= ~(1<<KB_STROBE); // дергаем ножкой строба
KB_PORT |= (1<<KB_STROBE);
kb_buff<<=1; // делаем сдвиг в буферном байте
if(KB_PIN&(1<<KB_Q7)) kb_buff|=1; //считываем последующие пины (D6..D0)
}
// обработка на дребезг
for(i=0;i<8;i++) //в цикле просматриваем kb_buff
{
if(kb_buff&(1<<i)) kb_flags[i]+=1; else kb_flags[i]=0;
if(kb_flags[i]>=KB_ANTIDREB)
{
kb_out |=(1<<i);
kb_flags[i]-=1;
}
}
keyboard = kb_out;получаю глюк: при одновременном нажатии кнопки 0 и 7 МК считывает все кнопки как нажатые (лог. 1), зажатая кнопка 0 "мерцает", т.е. попеременно считывается то как 0 то как 1.
Не вызвано ли такое поведение подтяжкой кнопок на землю? Как на самом деле правильно проектировать "цифровые" кнопки?
Решил проблему - пятнадцатую ногу микросхемы надо было завести на землю.