Хе, выводы настолько чувствительные, что можно даже не замыкать их на общий провод, достаточно прикоснуться пальцем.
Программа на CodeVisionAVR:
//Внешние прерывания микроконтроллера ATmega8515 по внешним выводам int0 и int1. Обработка программных флажков.
#include <mega8515.h>
#include <delay.h>
int A, B; //Описываем программные флажки A и B.
//Обработчики прерываний________________________________________________________________________
interrupt[2] void ExtInt0(void) //Обработчик прерываний на int0 (Порт D, вывод 2).
{
A = 1; //При нажатии на кнопку int0 во влажок A запис единица, во флажок B нуль.
B = 0;
}
interrupt[3] void ExtInt1(void) //Обработчик прерываний на int1(Порт D, вывод 3).
{
A = 0; //При нажатии на кнопку int1 во влажок A запис нуль, во флажок B единица.
B = 1;
}
//Настройки портов и регистров__________________________________________________________________
void main(void)
{
DDRC=0b11111111; //Все выводы порта C настраиваем на выход.
DDRD=0b00000000; //Выводы порта D настраиваем как вход (0-вход, 1-выход).
PORTD=0b11111111; /* Подключаем внутренние подтягивающие резисторы к выводам порта D.
(0-высокоимпедансное состояние, 1-подтягивающий резистор, если при этом выставлен 0 на DDR в том же разряде) */
GICR=0b11000000; /* Регистр General Interrupt Control Register разрешает внешние прерывания:
10 000000 - по выводу int1;
01 000000 - по выводу into;
11 000000 - по обоим выводам */
MCUCR=0b00001010; /* Регистр Micro Controller Unit Control Registr настраивает прерывание на срабатывание:
0000 10 10 - по спадающим фронтам сигнала на выводах int0 и int1.
0000 10 00 - по спадающему фронту сигнала на выводе int1;
0000 11 00 - по нарастающему фронту сигнала на выводе int1;
0000 00 00 - по низкому уровню на выводе int1;
0000 01 00 - по любому изменению уровня на выводе int1 */
A = 0; B = 0; //Обнуляем программные флажки на всякий случай.
#asm("sei") //Разрешаем общие прерывания.
//Основная программа (пустой вечный цикл)__________________________________________________________
while(1)
{
if(A == 1 & B == 0) //Проверяем программные флажки.
{
PORTC.0 = 1; delay_ms(200); //Если флажок А равен единице и флажок B равен нулю, то делаем одно мигание светодиодом C0.
PORTC.0 = 0; delay_ms(200);
}
else
{
if(A == 0 & B == 1) //Вложенный цикл для проверки другой комбинации программных флажков.
{
PORTC.1 = 1; delay_ms(200); //Если флажок А равен нулю и флажок B равен единице, то делаем одно мигание светодиодом C1.
PORTC.1 = 0; delay_ms(200);
}
}
}
}