Пост Алексей Еремеев - сообщение в Помогите с программированием микроконтроллера был отмечен как ответ
16 августа, 2023
по-простому
#define F_CPU 8000000UL // Работаем от внутреннего генератора 8МГц
/* ------------------------------------------------------------------------- */
#include <avr/io.h>
#include <util/delay.h>
/* ------------------------------------------------------------------------- */
// раскомментировать если считать нажатие в момент отпускания
//#define PRESS_ON_FALL 1
#define LEDS_PORT PORTB
#define LEDS_DDR DDRB
#define LED_1_BIT 0
#define LED_2_BIT 1
#define LED_3_BIT 2
#define LED_1_ON do { LEDS_PORT |= (1 << LED_1_BIT); } while (0)
#define LED_1_OFF do { LEDS_PORT &= ~(1 << LED_1_BIT); } while (0)
#define LED_2_ON do { LEDS_PORT |= (1 << LED_2_BIT); } while (0)
#define LED_2_OFF do { LEDS_PORT &= ~(1 << LED_2_BIT); } while (0)
#define LED_3_ON do { LEDS_PORT |= (1 << LED_3_BIT); } while (0)
#define LED_3_OFF do { LEDS_PORT &= ~(1 << LED_3_BIT); } while (0)
#define LED_1_ON_TIME 3000
#define LED_2_ON_TIME 1500
#define LED_3_ON_TIME 1500
#define BUTTONS_PORT PORTD
#define BUTTONS_DDR DDRB
#define BUTTONS_PIN PIND
#define BUTTON_1_BIT 2
#define BUTTON_1_GET() (!(BUTTONS_PIN & (1 << BUTTON_1_BIT)))
/* ------------------------------------------------------------------------- */
void button_wait_press(void)
{
// убеждаемся что кнопка отжата
while (BUTTON_1_GET()) asm("nop");
// ждем пока кнопку нажмут и немного подержат (антидребезг)
uint8_t check_counter = 0;
while (1)
{
if (BUTTON_1_GET())
{
check_counter++;
}
else
{
check_counter = 0;
}
_delay_us(100);
if (check_counter > 100) break;
}
// если нужно - ждем отпускания
#ifdef PRESS_ON_FALL
while (BUTTON_1_GET()) asm("nop");
#endif
}
/* ------------------------------------------------------------------------- */
int main(void)
{
// Настраиваем порт B (3 пина) на выход
LEDS_DDR |= (1 << LED_1_BIT) | (1 << LED_2_BIT) | (1 << LED_3_BIT);
// гасим светодиоды
LED_1_OFF; LED_2_OFF; LED_3_OFF;
// Настраиваем ножку порта PD2 на вход
BUTTONS_DDR &= ~(1 << BUTTON_1_BIT);
// Подтягиваем PD2 внутренним резистором к +5в
BUTTONS_PORT |= (1 << BUTTON_1_BIT);
while(1)
{
LED_1_ON;
_delay_ms(LED_1_ON_TIME);
LED_1_OFF;
button_wait_press();
LED_2_ON;
_delay_ms(LED_2_ON_TIME);
LED_2_OFF;
button_wait_press();
LED_3_ON;
_delay_ms(LED_3_ON_TIME);
LED_3_OFF;
button_wait_press();
}
}
/* ------------------------------------------------------------------------- */