logo search
HCS12 с применением языка С - royallib

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

}

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