Примеры проектирования интерактивных систем
Задача 1. Электронная записная книжка
При включении питания на однострочном индикаторе отображается курсор. Записная книжка готова к вводу новых строк текста. При нажатии кнопки «Enter» происходит запись строки в память и очистка индикатора. Курсор ставится в начальную позицию. При нажатии кнопки «Del» происходит удаление символов справа от курсора. При нажатии кнопок «» и «®» курсор перемещается в соответствующую сторону. При нажатии кнопок «» и «¯» происходит перелистывание записей книжки. При нажатии остальных кнопок происходит ввод соответствующих символов.
Структурная схема системы управления электронной записной книжкой
Управляющий автомат электронной записной книжки представляет собой типичный функциональный преобразователь, в котором каждому входному сигналу сопоставлен определенный выходной сигнал. Данная задача не требует автоматного программирования, так как в управляющей структуре отсутствуют сущности со сложным поведением. По структуре можно сразу разработать код программы.
Код программы
void main (void) {
char key; // идентификатор кнопки
char i; // счетчик вх. симв.
char j; // счетчик строк массива
char S[17][3]; // строковый буфер
while(1) { // обр-ка вх. симв.
switch (key) {
case 13: Save_Buf(); Lcd_Clear(); break;
case 46: Lcd_Erase(i); break;
case 36: Lcd_Shift_Left(); break;
case 38: Lcd_Shift_Right(); break;
case 37: if(j>0) j--; Lcd_Put_Str(j); break;
case 40: if(j<2) j++; Lcd_Put_Str(j); break;
default: Put_Buf(key); Lcd_Put_Str(j); break;
}
DelayMs(100);
}
}
Задача 2. Программа управления светофором.
В начальном состоянии горит красный сигнал. На индикаторе отображается слово «красный». Через tк включается желтый сигнал. На индикаторе отображается слово «желтый». Через 2 секунды красный и желтый сигналы гаснут, включается зеленый сигнал на время tз. На индикаторе отображается слово «зеленый». Затем 3 секунды зеленый сигнал мигает с частотой 1 Гц и скважностью 50%. По окончании мигания зеленый сигнал выключается, на 2 секунды включается желтый сигнал, на индикаторе - слово «желтый», затем желтый сигнал выключается и включается красный сигнал, на индикаторе - слово «красный». Далее работа светофора повторяется.
При нажатии на кнопку «Н» в режиме горения красного, желтого или зеленого сигнала светофор входит в режим настройки и все сигналы выключаются. На индикаторе отображается «tк=XXc». После следующего нажатия на кнопку «Н» значение tк сохраняется и на индикаторе отображается «tз=XXc». После следующего нажатия на кнопку «Н» значение tз сохраняется и светофор переходит из режима настройки в состояние горения красного цвета. Значения tк и tз изменяются с помощью кнопок «◄» и «►» в интервале от 5с до 30с с шагом 1с.
Структурная схема системы управления светофором
На базе условия задачи и структурной схемы строим таблицу переходов и выходов.
Таблица переходов и выходов
state | Красный | Красный-желтый | Зеленый | Миг. зеленый | Желтый | Настр. tк | Настр. tз |
Красный | «Красный» | (T){Z7(20), Z10} | - | - | - | (key=S) Z9 | - |
Красный-желтый | - | «Кр.-желтый» | (T) {Z7(10tз), Z9, Z11, Z12} | - | - | (key=S) { Z9, Z11} | - |
Зеленый | - | - | «Зеленый» | (T) Z7(3) | - | (key=S) Z13 | - |
Миг. зеленый | - | - | - | Z12, П(0,5) Z13, П(0,4) | (T){Z7(20), Z10} | - | - |
Желтый | (T) {Z7(10tк), Z11, Z8} | - | - | - | «Желтый» | (key=S) Z11 | - |
Настр. tк | - | - | - | - | - | «tк=XXc» (key=D) Z1 (key=U) Z2 | (key=S) |
Настр. tз | (key=S) {Z7(10tк), Z8} | - | - | - | - | - | «tз=XXc» (key=D) Z3 (key=U) Z4 |
Код программы
const char R = 1; // Код состояния
const char RY = 2;
const char G = 3;
const char GG = 4;
const char Y = 5;
const char SR = 6;
const char SG = 7;
const char D = 1; // Код нажатой кнопки
const char U = 2;
const char S = 3;
char key; // Идентификатор нажатой кнопки
char state; // Идентификатор управляющего состояния
char t = 5; // Значение счетчика
char tr = 5; // Время красного сигнала, с
char tg = 5; // Время зеленого сигнала, с
bit T = 0; // Сигнал счетчика «время истекло»
bit RED = 1; // Красный цвет
bit YEL = 0; // Желтый цвет
bit GRN = 0; // Зеленый цвет
void main (void) {
t = 10*tr;
state = R;
// Реализация управляющего автомата
while (1) {
switch (state) {
case R: // Красный
printf(“Красный”);
if (T) { state=RY; T = 0; t=20; YEL=1; }
else if (key == S) { state=SR; RED=0; }
break;
case RY: // Красный-желтый
printf(“Красный-желтый”);
if (T) { state=G; T = 0; t=10*tg; RED=0; YEL=0; GRN=1; }
else if (key == S) { state=SR; RED=0; YEL=0; }
break;
case G: // Зеленый
printf(“Зеленый”);
if (T) { state=GG; T = 0; t=3; }
else if (key == S) { state=SR; GRN=0; }
break;
case GG: // Мигающий зеленый
GRN=1; DelayMs(500);
GRN=0; DelayMs(400);
if (T) { state=Y; T = 0; t=20; YEL=1; }
break;
case Y: // Желтый
printf(“Желтый”);
if (T) { state=R; T = 0; t=10*tr; YEL=0; RED=1; }
else if (key == S) { state=SR; YEL=0; }
break;
case SR: // Настройка времени красного сигнала
printf(“tк=%2dc”, tr);
switch(key) {
case D: if (tr>5) tr--; break;
case U: if (tr<30) tr++; break;
case S: state=SG; break;
}
break;
case SG: // Настройка времени зеленого сигнала
printf(“tз=%2dc”, tg);
switch(key) {
case D: if (tg>5) tg--; break;
case U: if (tg<30) tg++; break;
case S: state=R; T = 0; t=10*tr; RED=1; break;
}
break;
}
DelayMs(100); // такт работы автомата
if(t==0) T=1; else t--; // счетчик
}
}
Разработать программу классическим (алгоритмическим) подходом, сравнить с автоматным подходом по времени разработки, объему занимаемых ресурсов, удобочитаемости, структурированности и возможностям отладки.