Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
HCS12 с применением языка С - royallib.ru.doc
Скачиваний:
118
Добавлен:
11.03.2016
Размер:
2.28 Mб
Скачать

5.8. Кодовый замок

В этом заключительном примере мы объединили ранее полученные знания по аппаратному подключению и программному обслуживанию различных устройств ввода и вывода информации. В каждом параграфе данной главы мы рассмотрели какой-то отдельный тип устройства ввода/вывода. И для каждого устройства привели фрагмент программного кода, который необходим для его обслуживания. Эти фрагменты могут быть использованы Вами в реальных разработках. На примере электронного кодового замка мы покажем Вам, как воспользоваться полученными ранее знаниями.

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

Далее мы приводим функциональную схему аппаратных средств, блок-схему алгоритма работы и полную программу управления кодовым замком.

5.8.1. Схема подключения периферийных устройств

Электрическая схема подключения клавиатуры на 16 клавиш и символьного ЖК индикатора к выводам портов МК семейства 68HC12 приведена на рис. 5.22. Линии порта PORT B обслуживают матричную клавиатуру. В соответствии с электрической схемой линии PORTB[0]…PORTB[3] должны работать в режиме вывода, а линии PORTB[4]…PORTB[7] — в режиме ввода. Восьмиразрядная шина данных интерфейса индикатора подключена к выводам порта PORT P. Так же, как и в примере параграфа 5.6.2, мы будем производить только операции записи в контроллер управления индикатором. Поэтому порт PORT P будет постоянно работать в режиме вывода. Линии управления индикатором подключены к выводам PORTDLC2: PORTDLC3.

Рис. 5.22. Функциональная схема аппаратных средств для системы кодового замка

Можно убедиться, что рассмотренные ранее по отдельности схемы подключения клавиатуры и ЖК индикатора полностью повторены, вплоть до конкретных выводов портов. Поэтому мы сможем воспользоваться ранее приведенными программами управления без каких-либо изменений.

5.8.2. Программа управления

На рис. 5.23 представлена блок-схема алгоритма управления кодовым замком. Ниже приведен полный текст программного кода программы управления, составленный по этой блок-схеме алгоритма.

Рис. 5.23. Блок-схема алгоритма управления кодовым замком

/*------------------------------------------------------------------------*/

/* filename: lock.c программа управления электронной системой доступа     */

/* Число символов кода доступа равно 4. Правильная кодовая комбинация:C963*/

/* Аппаратная конфигурация:                                               */

/* PORTB 8 линий интерфейса клавиатуры                                    */

/*PORTP 8 линий шины данных интерфейса ЖК индикатора                      */

/*PORTDLC2 RD/WR, PORTDLC3 E.                                             */

/*------------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>

#include <stdio.h>

#include <math.h>

/*используемые функции*/

char which_key(unsigned int keypress); //определение, какая клавиша

                                       //нажата

void delay_100us(void); //задержка 100 мкс

void delay_5ms(void); //задержка 5 мс

void initialize_lcd(void); //инициализация контроллера ЖК

                           //индикатора

void initialize_key(void); //инициализация портов для

                           //клавиатуры

void putchars(unsigned char с); //запись одного символа в индикатор

void putcommands(unsigned char d); //запись одной команды в индикатор

void lcd_print(char *string); //запись в индикатор строки символов

char keypad(unsigned int keypress, int row);

void main(void) {

 int first = 0х01; //инициализация служебных переменных для опроса

 int second = 0х02; //клавиатуры

 int third = 0х04;

 int fourth = 0х08;

 int i,j,k, count = 0;

 unsigned int keypress;

 char key;

 int length=4;

 char pin[] = {'С', '9', '6', '3'}; //задание эталонной последовательности

                                    //символов

 char code[4]; //массив для введенной пользователем

               //последовательности символов

 initialize_lcd() ; //инициализация ЖК индикатора

 initialize_key(); //инициализация портов для клавиатуры

 for (k=0; k<4; k++) //разрешает 4 раза ввести комбинацию из

 { //4 символов

  count = 0;

  putcommands(0x01);

  lcd_print("Enter Code:");

  while (count < length) //обработка 4 нажатий клавиатуры

  {

   for(i=0; i<=50; i++) //ожидание ввода символа

   {

    PORTB = 0х01; //опрос первого ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, first);

    if (key != 'Z') //если клавиша нажата

    {

     printf("%c", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

   for(i=0; i<= 50; i++) // ожидание ввода символа

   {

    PORTB = 0х02; //опрос второго ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, second);

    if (key != 'Z') {

     printf("%с", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

   for(i=0; i<= 50; i++) //ожидание ввода символа

   {

    PORTB = 0х04; //опрос третьего ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, third);

    if (key != 'Z') {

     printf("%c", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

   for(i=0; i<= 50; i++) //ожидание ввода символа

   {

    PORTB = 0х08; //опрос четвертого ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, fourth);

    if (key != 'Z') {

     printf("%c", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

  } //очередные 4 символа введены, можно сверять с эталонными

  /*Проверка соответствия кода на эталонный*/

  j = 0;

  for(i=0;i<3;++i) //проверка по каждому символу эталонной

                   //последовательности

  {

   if(pin[i]==code[i]) //очередной символ правильный

   {

    j++;

   } else //очередной символ неправильный

   {

    j--;

   }

  }

  if (j == (length - 1)) //если j=3, то все символы введены правильно

  {

   putcommands(0x01);

   lcd_print("Access Granted");

  }

  else //символы введены неправильно

  {

   putcommands(0x01);

   lcd_print("Access Denied");

  }

 }

 putcommands(0x01);

 lcd_print(" Goodbye ! "); //конец попыток ввода

}

/*--------------------------------------------------------------------*/

/*Перечень функций, которые использованы в этой программе             */

/*--------------------------------------------------------------------*/

/* Функции, программный код которых был приведен ранее по тексту главы*/

char which_key(unsigned int keypress);

void delay_5ms(void);

void delay_100us(void);

void initialize_lcd(void);

void putchars(unsigned char с);

void putcommands(unsigned char d);

void lcdprint(char *string);

char keypad(unsigned int keypress, int row);

//Функция, которая приведена ниже

void initialize_key(void)

/*------------------------------------------------------------------------*/

/* Функция initialize_key устанавливает направление передачи линий портов */

/* для обслуживания клавиатуры                                            */

/*------------------------------------------------------------------------*/

void initialize_key(void) {

 DDRB = 0x0F; //линии PORTB[0]…PORTB[3] на вывод

              //линии PORTB[4]…PORTB[7] на ввод

 PORTB = 0х00; //четыре младших линии порта PORTB в 0

}

/*-------------------------------------------------------------------------*/ 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]