не идеально но просто
использован флаг (в реале возможен дребезг, проверено)
видео https://youtu.be/UP9SuvpmRN4
CODE:#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#define max_count 5 //макс. число нажатий чтоб загорелся D2
volatile unsigned char i;
volatile unsigned char flag;
int main(void)
{
DDRB|=(1<<PB2); //Настраиваем ножку PB2 в режим выхода
DDRB&=~(1<<PB1); //Настраиваем ножку PB1 в режим входа
PORTB|=(1<<PB1); //Устанавливаем pull-up режим ножки PB1
DDRD|=(1<<PD2);
PORTD&=~(1<<PD2);
i=0; //начальное значение
flag=0;
while(1) //бесконечный цикл
{
if((PINB&(1<<PB1))==0) //Если на PB1 логический ноль то кнопку нажали
{
PORTB|=(1<<PB2); //Зажигаем светодиод и устанавливаем флаг
flag=1; // поднимаем флаг
if (i==max_count) // проверка "начат новый цикл нажатий?"
{
PORTD&=~(1<<PD2); //гасим светодиод 2 если начат новый цикл нажатий
i=0; // обнуляем счетчик нажатий
}
}
else //Если на PB1 логический единиц то кнопку отпустили
{
PORTB&=~(1<<PB2); //Гасим светодиод 1
if (flag==1) {i++; flag=0;} // если на PB1 логическая единица и установлен флаг то кнопку отпустили увеличиваем счетчик
}
if (i==max_count) {PORTD|=(1<<PD2);} // зажигаем светодиод 2 когда счетчик дошел до max_count нажатий
}
} (Отредактировано автором: 15 Августа, 2017 - 23:32:47) |