Что-то типа этого:
Код:
#include <ioavr.h>
#include <intrinsics.h>
int main( void )
{
PORTB = 0x00; //Когда ножки будут выходами, на них будет 0
DDRB = 0x01; // Ножку PB0 - на выход
static enum {ON, OFF} state = OFF;
while(1) // Eternal loop
{
if( (PINB & 0x02) && state == OFF )
{
__delay_cycles(400000); // Ждем 400 000 циклов (ок. 50 мс) (для защиты от помехи)
if( PINB & 0x02 )
{
PORTB = 0x01; //Ножку PB0 в 1
__delay_cycles(2000000); // Ждем 2 000 000 циклов (ок. 250 мс)
PORTB = 0x00; //Ножку PB0 в 0
state = ON;
}
}
if( !(PINB & 0x02) && state == ON )
{
__delay_cycles(400000); // Ждем 400 000 циклов (ок. 50 мс) (для защиты от помехи)
if( !(PINB & 0x02) )
{
PORTB = 0x01; //Ножку PB0 в 1
__delay_cycles(2000000); // Ждем 2 000 000 циклов (ок. 250 мс)
PORTB = 0x00; //Ножку PB0 в 0
__delay_cycles(2000000); // Ждем 2 000 000 циклов (ок. 250 мс)
PORTB = 0x01; //Ножку PB0 в 1
__delay_cycles(2000000); // Ждем 2 000 000 циклов (ок. 250 мс)
PORTB = 0x00; //Ножку PB0 в 0
state = OFF;
}
}
}
}
Примитивизм конечно, но работать должно. Времена задержек подберите сами.
Выполняется однократная дополнительная проверка состояния входа для минимизации помехи. Можно усовершенствовать алгоритм, вплоть до написания цифровых фильтров.
Компилируется IAR C для Меги, в проекте необходимо правильно выбрать целевой процессор. В более старых версиях компилятора надо было включать специфический .h файл для каждого процессора, сейчас посмотрел бегло - вроде уже не надо, может быть что-то упустил.