![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программа управления
На рис. 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 } /*-------------------------------------------------------------------------*/
|