определил на чтение одну ногу а припаялся к другой ( соседней )
клава работает.
имхо, длительность импульсов сканирования не суть важна, главное чтобы опрос клавы производился не реже раза в четверть секунды
Отправлено 18 Ноябрь 2003 - 14:09
Отправлено 18 Ноябрь 2003 - 15:37
Отправлено 19 Ноябрь 2003 - 00:41
Отправлено 19 Ноябрь 2003 - 01:11
Отправлено 19 Ноябрь 2003 - 01:47
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void) {
u8 i, c;
TCNT0 = 0x83; //reload counter value
// опрашиваем кнопки
c = PIND;
for (i = 0; i < BUTTON_COUNT; i++) {
struct button * b = buttons+i;
if ((c&buttonMask[i]) != b->value) {
// состояние кнопки изменилось
b->value = c&buttonMask[i];
b->processed = 0;
b->ticks = 0;
continue;
}
// состояние кнопки осталосьь тем же
if (b->processed)
continue; // кнопка уже обработана
if (++(b->ticks) > 4) {
// состояние кнопки не менялось уже 1ms, можно ее и обработать
u8 cl = i >> 1; // номер кулера
b->processed = 1;
if (b->value) // если кнопку отпустили - ничего не делаем
continue;
if (i & 1) {
// '+'
if (coolers[cl] < 8)
coolers[cl]++;
} else {
// '-'
if (coolers[cl] > 0)
coolers[cl]--;
}
// вывести значение на светодиоды
PORTC = ledMask[coolers[cl]];
// TODO: записать в соответствующий регистр
}
}
// TODO: включить/выключить все кулеры
output = coolers[0] > phase ? 0xFF : 0xBF;
phase++;
phase &= 7;
PORTB = output;
}
Отправлено 19 Ноябрь 2003 - 13:03
Отправлено 19 Ноябрь 2003 - 18:32
Отправлено 20 Ноябрь 2003 - 11:13
Отправлено 20 Ноябрь 2003 - 12:22
Отправлено 20 Ноябрь 2003 - 17:28
Цитата
Отправлено 21 Ноябрь 2003 - 22:51