Цитата(algidim @ Mar 7 2008, 19:49)

У вас схема не может работать по определению, ну подумайте сами. В тот момент, когда вы выставляете на PA7 лог 1 и опрашиваете PD0-PD2, с челью узнать нажатую кнопку, вы получите на PD0-PD2 в любом случае лог 1, даже если кнопки не нажаты, если конечно, у вас подключены встроенные подтягивающее резисторы. Если они не подключены то результат опроса будет не предсказуем, похоже, у вас такая ситуация. Просто, прежде чем проектировать подобные схемы, нужно чётко представлять логику её работы.
Не совсем так. Эта схема работает. И не только в симуляторе, но и на реальном контроллере, упрравление идёт через JTAG.
PA7 настроен на вход с подтягивающим резистором. Когда нажата кнопка, лог. нуль через диод, замкнутую кнопку подаётся на вход PA7. Запоминается номер вывода и взводится флаг антидребезга на 20 мсек для устранения дребезга. После этого программа улучает момент, когда лог. нуль появляется на том выводе, который она запомнила перед пднятием флага антидребезга. Если кнопка замкнута, тогда номер вывода = запомненному номеру и программа возвращает номер вывода, те номер кнопки. Может туманно объяснил, смотри код
// Сканирование клавиатуры
unsigned char Scan_Key(void)
{
static unsigned char pk=0;
static unsigned char Key_Buf;
if(TESTBIT(flag,DREBEZG)) //
{
if(cnt_dr!=0)
{
delay_timer1(MSEC(1)); // задержка 1 мсек
// delay_ms(1);
cnt_dr--;
}
else
{
cnt_dr=CNT_DR_MAX;
CLEARBIT(flag,DREBEZG);
BUZER=0; // снять звуковой сигнал
}
}
else
{
switch (h)
{
case 0 : if (!KEY) // кнопка нажата!
{
SETBIT(flag,DREBEZG); // взвести флаг антидребезга
BUZER=1; // подать звуковой сигнал
Key_Buf=n; // запомнить номер кнопки
h++; // увеличить счётчик прохождений
}
pk=0; break;
case 1 : if(n==Key_Buf)
{
if (!KEY)
{
SETBIT(key,n); // запоминаем нажатую кнопку!
pk=key;
SETBIT(flag,KEYBOARD);
}
else // если кнопка отжата,
{ // то проверяем - действительно ли
SETBIT(flag,DREBEZG); // взводим флаг антидребезга
h++; // и увеличиваем счётчик прохождений
}
}
break;
case 2 : if((KEY)&&(Key_Buf==n)) // если кнопка отжата и её
{ // номер соответствует записанному в буфер
Key_Buf=0xFF; // запись в буфер неиспользуемого числа
h=0; // обнуление счётчика прохождений
pk=0;
key=0;
CLEARBIT(flag,BUSY);
}
break;
default: break;
}
}
return pk;
}
Сообщение отредактировал Anjey_N - Mar 7 2008, 17:47