Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 325 Действие этой функции полностью аналогично действию одноимен ­ ной процедуры из программы на Ассемблере. В строке 52 формируется задержка первого вида (48 мс), то есть вызывается функция wait () с параметром, равным единице. По окончании задержки (строка 53) про ­ грамма повторно считывает код состояния клавиатуры и записывает его в переменную cods. В строке 54 считанный код записывается в буфер ОЗУ (bufr). Одновременно указатель буфера увеличивается на единицу. В строке 55 проверяется условие переполнения буфера. Такая проверка принуди ­ тельно завершает работу цикла при попытке ввода слишком длинной кодовой комбинации. Если значение i i превысило величину константы bsize, значит, буфер уже полностью заполнен. В этом случае управление передается по метке ш4, то есть на конец цикла. Если значение i i не достигло конца буфера, то перехода не проис ­ ходит, и управление переходит к строке 56. В этом месте запускается процесс формирования контрольного промежутка времени. Для запу ­ ска этого процесса используется функция wait (). В данном случае она формирует задержку второго типа, поэтому вызывается с параметром, равным двум. Так же, как и в программе на Ассемблере, задержка второго типа лишь производит все настройки таймера, но не выполняет цикл ожидания. Комбинированный цикл ожидания находится вне функции задержки, а точнее в строках 57, 58. В строке 57 считывается новый код состояния клавиатуры и сравнивается со старым, который хранится в переменной codS. Если коды не равны (состояние клавиатуры изменилось), комбиниро ­ ванный цикл ожидания прерывается, и управление передается по метке m2. То есть на начало цикла ввода кодовой комбинации. А уже там, в начале цикла, снова формируется защитная задержка, и очередной код состояния помещается в буфер. Если при проверке в строке 57 старый и новый коды оказались все же равны между собой, перехода не происходит, и выполняется строка 58. В этой строке проверяется значение флага f lz. Если контрольный проме ­ жуток времени еще не истек, то значение флага равно нулю, и управление передается по метке m3. Комбинированный цикл продолжается. Если же контрольный промежуток времени уже закончится, значение флага f 1 z равно единице. Поэтому перехода не происходит, и управле ­ ние переходит к строке 59. На этом и комбинированный цикл ожидания, и цикл ввода кодовой комбинации заканчиваются. В строке 59 проверяется состояние тумблера sll. В зависимости от этого состояния выполняется либо запись только что принятой кодовой комбинации в EEPROM, либо извлечение из EEPROM и сравнение двух

RkJQdWJsaXNoZXIy MTExODQxMg==