Я не знаю, что там конкретно не работает, но хочу сказать несколько слов по поводу вышеприведенного способа реализации этого всего. Хочу сказать, потому что выглядит это мягко говоря не очень - логика работы размазана по всему коду, особенно бросается в глаза куча циклов во всех местах, хотя можно обойтись одним-двумя.
Исходя из имеющихся на данный момент условий задачи я вижу следующий вариант решения:
0. Выполняем инициализацию периферии.
1. Сканируем нажатые кнопки. Если какая-либо кнопка нажата, то переходим в
2, иначе в
1.
2. Обрабатываем нажатие на кнопку, и соотв. образом изменяем значение переменной.
3. В зависимости от значения переменной выполняем нужное действие.
4. Переходим в
1.
Отсюда уже должно быть видно, что достаточно всего одного цикла, максимум двух. Но это, наверное, не самое интересное. Намного интереснее организация пункта
2 без кучи циклов. Чтобы понять это - необходимо знать хотя бы что-нибудь про конечные автоматы и их программную реализацию, в том числе на языке Си. Вот
тут вполне доходчивое описание и пример, как раз с кучей циклов.
В нашем конкретном случае у нас будет автомат с тремя состояниями. Условно назовем их начальным состоянием (0), состоянием увеличения переменной (1), и состоянием уменьшения переменной (2). Логику работы автомата можно описать следующим образом:
Состояние 0.
- Если нажата кнопка 1, то переходим в
Состояние 1.
- Если нажата кнопка 2, то переходим в
Состояние 2.
Состояние 1.
- Если нажата кнопка 1, то ничего не делаем.
- Если нажата кнопка 2, то увеличиваем значение переменной и переходим в
Состояние 0.
Состояние 2.
- Если нажата кнопка 1, то уменьшаем значение переменной и переходим в
Состояние 0.
- Если нажата кнопка 2, то ничего не делаем.
Чтобы избежать переполнения переменной нужно проверять ее значение, перед уменьшением - не равно ли оно нулю, а перед увеличением - не достигло ли оно максимума. Так же, при сканировании нажатий кнопок нужно фильтровать дребезг, если конечно не используется какая-нибудь аппаратная фильтрация. На этом, пожалуй, все.
Конечно, можно было просто дать готовый кусок кода, но я все же надеюсь ты пойдешь путем настоящего джедая. Если нет - забудь все, что я тут написал, кто-нибудь да выложит рабочий код, который можно будет использовать особо в него не вникая. Если да - то пробуй и показывай, что получается.