Исследование принципа работы микроконтроллеров семейства AVR, страница 5

В строке 101 находится укороченный оператор if-else (без else). Так как в его теле всего один оператор, вся конструкция записана в одну строку, без фигурных скобок. В условии оператора if-else (в скобках) проверяется, равно ли значение переменной] числу 3. Если равно (истина), то вызывается функция lcd_gotoxy с фактическими параметрами (0,1). Эта функция устанавливает текущую позицию дисплея соответственно в столбец 0 ряда 1. Нумерация рядов и столбцов начинается с 0. Эта функция определена в подключённом файле Icd.h (строка 55). Подробнее см. LCD-функции для дисплеев до 2x40 символов.

Если не равно 3 (ложь), то строка 101 пропускается.

Таким образом, в верхнюю строку LCD через пробел будут выведены значения четырех младших байтов (0...3) ROM-кода соответствующего устройства, а во вторую строку — четырёх старших байтов (4...7).

После выполнения цикла for (строка 97) в строке 103 функция dclay_ms генерирует задержку 5000 мс.

В строке 106 находится ключевое слово else оператора if-elsc, означающее, что следующий оператор будет выполняться, если условие оператора if-clsc (строка 88) ложно.

В строке 107 реализован бесконечный цикл с помощью оператора while (см. Оператор while). Этот оператор будет выполняться до тех пор, пока выражение в скобках истинно, т. е. не 0. Выражение в скобках — I (можно также написать 15 или 8), а не 0, т. е. всегда истинно. Следовательно, этот оператор будет выполняться бесконечно.

В строке 111 также реализован бесконечный цикл с помощью оператора while. В этом цикле бесконечно будет выполняться группа операторов, заключённая в фигурные скобки, находящиеся в строках 112 (открывающая скобка) и 121 (закрывающая скобка).

В строке 113 находится оператор for (см. Оператор for). Тело этого оператора, заключённое в фигурные скобки, находящиеся в строках 114 (открывающая скобка) и 120 (закрывающая скобка), будет выполняться для каждого устройства DSI820/DS18S20.T. е. столько раз, сколько устройств подключено к шине 1-Wire.

В строке 115 вызывается функция dsl820_temperature_10 с фактическим параметром &rom_code[i,0] (адрес ROM-кода i-ro датчика). Эта функция возвращает температуру 1-го датчика DS1820/DS18S20. Это значение присваивается переменной temp. Температура выражена в 'Си умножена на 10 (см. Функции температурного датчика DS1820/DS18S20 от Dallas Semiconductor). Эта функция определена в подключённом файле dsl820.h (строка 56).

В строке 116 функция sprintf осуществляет форматные преобразования и помещает результаты в строку lcd_bufTer. Спецификация преобразования •t%u=%i.%u\xdfCo означает, что сначала будет выведен символ «t», затем значение выражения ++I (т. е. значение переменной I, увеличенное на 1) в формате десятичного целого без знакового числа (символ преобразования и'). После этого будет выведен символ «=», значение выражения temp/10 в формате десятичного целого числа со знаком (символ преобразования Т), т. с. целая часть результата этого выражения. Затем будет выведен символ «.», значение выражения abs(temp% 10) в формате десятичного целого без знакового числа (символ преобразования и'), т. е. абсолютное значение остатка от деления temp/10, и, наконец, последовательность «*С» (управляющая последовательность \xdf означает, что будет выведен символ с кодом df, т. е. символ «*») (см. Стандартные функции ввода/вывода).

В строке 117 осуществляется вызов функции lcd_clear, которая снова очищает LCD и устанавливает позицию для вывода символа в ряд 0 столбца 0.

В строке 118 функция lcd_puts отображает в текущей дисплейной позиции содержимое строки lcd_buffer, которая была сформирована в 116-й строке программы.