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

Лабораторная работа включает в себя несколько фронтальных и индивидуальных заданий:

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

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

void main (void)

{             

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

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

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

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

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

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

                while (1)//Loop forever

                {

                               if( FIO0PIN & 0x0020 )       // Проверка кнопки 1, подключенной к P0.5

//(0010 0000 в двоичном коде или 0x0020)

                               {

                                               FIO2PIN = 0x00;  // Выключить все светодиоды, если кнопка не нажата

                               }

                               else

                               {

                                               FIO2PIN = 0x01;  // Включить первый светодиод, если кнопка нажата

                               }

                }

}

В данном примере производится проверка состояния только одной кнопки и без подавления дребезга контактов. После проверки работоспособности данного примера необходимо модифицировать программу таким образом, чтобы производилась проверка состояния всех кнопок BTN1-BTN4 с отображением на светодиодах.

2.  Написать программу проверки состояния кнопок с подавлением дребезга контактов

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

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

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

void main (void)

{             

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

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

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

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

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

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

                BTN1_cur = BTN1_prev = FIO0PIN & 0x0020; //Чтение начального состояния кнопки 1

                while (1)//Loop forever

                {

                               if( GetBTN1State() )

                               {

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

                               }

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

                }

}

int GetBTN1State()

{

                int state = 0;

                BTN1_cur = FIO0PIN & 0x0020; // //Чтение текущего состояния кнопки 1

                if( BTN1_cur != BTN1_prev)             //Если состояние изменилось