Для написания программы настройки кнопки на микроконтроллере atmega128 в языке программирования C можно использовать следующий алгоритм:
1. Определить порт и пин, к которым подключена кнопка. Например, если кнопка подключена к порту D, пину 2, то можно использовать макросы вида `#define BUTTON_PORT PORTD` и `#define BUTTON_PIN 2`.
2. Настроить пин кнопки на вход с подтяжкой к питанию. Для этого можно использовать макросы вроде `BUTTON_PORT |= (1 << BUTTON_PIN)` для установки пина в HIGH и `BUTTON_DDR &= ~(1 << BUTTON_PIN)` для установки пина в режим ввода.
3. Создать функцию обработки нажатия кнопки. Например, функция `buttonPressed()` будет вызываться, когда кнопка нажата.
4. В основной программе в бесконечном цикле опрашивать состояние кнопки. Если кнопка нажата, вызывать функцию `buttonPressed()`.
При реализации изменения направления движения "огонька" при нажатии кнопки "огонек" можно использовать следующий алгоритм:
1. Определить порт и пин, к которым подключена кнопка "огонек". Например, если кнопка подключена к порту A, пину 0, то можно использовать макросы вида `#define LED_BUTTON_PORT PORTA` и `#define LED_BUTTON_PIN 0`.
2. Настроить пин кнопки "огонек" на вход с подтяжкой к питанию. Для этого можно использовать макросы вроде `LED_BUTTON_PORT |= (1 << LED_BUTTON_PIN)` для установки пина в HIGH и `LED_BUTTON_DDR &= ~(1 << LED_BUTTON_PIN)` для установки пина в режим ввода.
3. Создать переменную, которая будет хранить текущее направление движения "огонька". Например, можно использовать переменную `direction` типа `enum { LEFT, RIGHT }`, где `LEFT` - движение "огонька" влево, а `RIGHT` - движение "огонька" вправо.
4. Создать функцию обработки нажатия кнопки "огонек". Внутри этой функции изменять переменную `direction` на противоположное значение, чтобы поменять направление движения "огонька".
5. В основной программе в бесконечном цикле обновлять положение "огонька" в соответствии с текущим направлением движения. Например, если текущее направление задано переменной `direction` и значению `LEFT`, то огонек будет двигаться влево, а если `RIGHT`, то будет двигаться вправо.
Это только базовый алгоритм, и в реальной программе может потребоваться дополнительная обработка сигналов с кнопки и учет других условий.