Исследование портов ввода/вывода в режиме ввода, страница 3

                {

                               if( !BTN1_cur ) //Если текущее состояние 0, то кнопка нажата

                                               state = 1; //Переменная состояния означает, что кнопка нажата

                }

                BTN1_prev = BTN1_cur;   //Текущее состояние сохраняется в переменной,

//которая будет предыдущей в следующем цикле проверки

                return state; //Возвращаем состояние 0 если кнопка не нажата и 1 если нажата

}

В данном примере первый светодиод зажигается при первом нажатии на кнопку 1. Необходимо модифицировать программу следующим образом:

·  Подобрать задержку (параметр функции Delay) примерно 10 миллисекунд. Для этого подобранный параметр из предыдущей лабораторной работы для примерно 1 секунды разделить на 100.

·  Модифицировать программу таким образом, чтобы первый светодиод включался при нажатии на кнопку 1 и выключался при нажатии на кнопку 2

·  Модифицировать программу таким образом, чтобы первый светодиод включался и выключался при нажатии на кнопку 1

·  Модифицировать программу таким образом, чтобы на светодиодах стенда был сформирован бегущий огонь. При этом при нажатии на кнопку 1 он должен остановиться, при нажатии на кнопку 2 возобновить движение, при нажатии на кнопки 3 и 4 менять направление движения.

·  Модифицировать программу таким образом, чтобы на светодиодах стенда был сформирован бегущий огонь в соответствии с индивидуальным заданием из предыдущей лабораторной работы. При этом при каждом нажатии на кнопку 1 скорость движения должна увеличиваться, а при нажатии на кнопку 2 уменьшаться.

3.  Написать программу проверки состояния энкодера

Аналогично предыдущему примеру для проверки состояния энкодера необходимо использовать две переменных – с текущим и с предыдущим состоянием. В случае вращения энкодера по часовой стрелке необходимо включить первый светодиод и выключить его, если энкодер вращается в противоположном направлении.

Для этого функцию main прототипа проекта необходимо модифицировать следующим образом:

int ENCA_cur, ENCA_prev; //Глобальные переменные текущего и предыдущего состояний контакта А

int ENCB_cur, ENCB_prev; //Глобальные переменные текущего и предыдущего состояний контакта B

void main (void)

{             

                // Настроить порт

                SCS |= 0x01; //Разрешить быстрый ввод/вывод

                FIO0DIR = 0x00000000; // Все разряды порта 0 на ввод для чтения состояния кнопок и энкодера

                FIO0MASK = 0; //Все разряды порта 0 работают в быстром режиме

                FIO2DIR = 0x00FF; // Биты 0-7 порта 2 на вывод для управления светодиодами

                FIO2MASK = 0; //Все разряды порта 2 работают в быстром режиме

                ENCA_cur = ENCA_prev = (FIO0PIN & 0x00000800) >> 11; //Чтение начального состояния

//контакта А энкодера (P0.11)

                ENCB_cur = ENCB_prev = (FIO0PIN & 0x00200000) >> 21; //Чтение начального состояния

//контакта B энкодера (P0.21)

                while (1)//Loop forever

                {

                               if( GetEncState() == 1 )

                               {

                                               FIO2PIN = 0x01; //Вкл. первый светодиод если энкодер вращается по часовой

                               }

                               else

                               if( GetEncState() == -1 )

                               {

                                               FIO2PIN = 0x00; //Выкл. первый светодиод если энкодер вращается против часовой

                               }

                               Delay( 100 ); //Задержка между опросами состояния >10 мсек