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

                }

}

int GetEncState()

{

                int state = 0;

                ENCA_cur = (FIO0PIN & 0x00000800) >> 11; //Чтение текущего состояния контакта А энкодера (P0.11)

                ENCB_cur = (FIO0PIN & 0x00200000) >> 21; //Чтение текущего состояния контакта B энкодера (P0.21)

                if( (ENCA_cur != ENCA_prev) )         //Если состояние контакта А энкодера изменилось

                {

                               if( !ENCA_cur ) //Если текущее состояние контакта А энкодера - 0 (переход из 1)

                               {

                                               if( !ENCB_cur ) //Если текущее контакта B энкодера - 0

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

                                               else

                                                               state = -1; //Переменная состояния означает, что вращение против часовой

                               }

                               else        //Если текущее состояние контакта А энкодера - 1 (переход из 0)

                               {

                                               if( ENCB_cur ) //Если текущее контакта B энкодера - 1

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

                                               else

                                                               state = -1; //Переменная состояния означает, что вращение против часовой

                               }

                }

                ENCA_prev = ENCA_cur;//Текущее состояние сохраняется в переменных,

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

                ENCB_prev = ENCB_cur;

                return state; //Возвращаем состояние 0 если энкодер не вращается,

                                                                              //1 если вращается по часовой и -1 если против часовой

}

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

·  Добавить проверку изменения состояния контакта В аналогично изменению состояния контакта А (см. таблицу 1)

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

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

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

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