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

Директивой «define (строка 65) определяется идентификатор MAX_DEVICES. После этой строки перед компиляцией препроцессор заменит в тексте программы идентификатор MAX_DEV1CES на 8. В случае модификации программы для другого значения максимального количества устройств DS1820/DS18S20, подключённых к шине 1-Wire, достаточно будет лишь заменить значение в указанной директиве «define, не изменяя остального текста программы (см. Директива tfdefine, ttundef). Директива «define очень удобна, но вовсе не обязательна.

В строке 68 объявляется глобальный двухмерный массив rom_code, в котором будут храниться ROM-коды всех температурных датчиков. Для каждого устройства используется 9 байтов (смотри описание функции wl_search в главе Функции протокола 1-Wire), но только первые 8 байтов содержат ROM-код и CRC (контрольную сумму).

Строки 70...122 — это определение основной функции программы (main). Эта функция обязательно должна присутствовать во всех программах (но только one). Именно с этой функции, в каком бы месте программы она ни находилась, начинается выполнение программы.

В строке 70 осуществляется объявление функции main. В начале опушено (но подразумевается) ключевое слово void, указывающее на то, что эта функция не возвращает никаких значений; затем следует имя функции main (ЕГО ИЗМЕНЯТЬ НЕЛЬЗЯ!). В скобках опушено (но подразумевается) ключевое слово void, которое указывает на то, что в эту функцию не передаются никакие параметры (см. Функции).

В строке 71 открывающая фигурная скобка указывает на начало тела функции main.

В строке 72 объявляются переменные i, j, devices типа unsigned char (без знаковый байт).

В строке 73 объявляется переменная temp типа int (целое) (см. Типы данных).

В строке 75 осуществляется вызов функции ledjnit с фактическим параметром 16 (количество столбцов в используемом модуле LCD). Эта функция инициализирует модуль LCD, очищает дисплей и устанавливает позицию для вывода символа в ряд 0 столбца 0. Курсор не отображается.

В строке 76 осуществляется вызов функции lcd_putsf, которая отображает в текущей позиции дисплея последовательность «■CodeVisionAVR\nl Wire Bus Demo», т. е. сначала в верхней строке LCD будет выведена последовательность «CodeVisionAVR». Затем курсор будет переведён на нижнюю строку (последовательность \п), и в нижней строке будет выведена последовательность «1 Wire Bus Demo».

Функции lcd_init и lcd_putsf определены в подключенном файле led.h (строка 55). В строке 77 функция delay_ms генерирует задержку 2000 мс (см. Функции задержки). Эта функция определена в подключённом файле delay.h (строка 57).

В строке 78 осуществляется вызов функции lcd_clear, которая очищает LCD и устанавливает позицию для вывода символа в ряд 0 столбца 0. Эта функция определена в подключённом файле Icd.h (строка 55).

Далее определяется количество устройств DS1820/DS18S20, подключённых к шине 1-Wire (строка 82). Для этого вызывается функция wl_search с фактическими параметрами ОхГО (команда поиска ROM-кодов) и rom_code (указатель на ту область SRAM, где хранятся ROM-коды устройств). Эта функция возвращает количество устройств, подключённых к шине 1 -Wire, и это значение присваивается переменной devices. Кроме того, функция wl_search заполняет массив rom_code ROM-кодами устройств DS1820/DS18S20, подключённых к шине 1-Wire

В строке 83 функция sprintf осуществляет форматные преобразования и помешает результаты в строку lcd_buffer. Спецификация преобразования «%и DS1820\nDevice detected» означает, что сначала будет выведено значение глобальной переменной devices в десятичном без знаковом формате (символ преобразования и"), затем через пробел — последовательность «DS1820*. После этого курсор будет переведён на новую строку (последовательность \п), и в новой строке будет выведена последовательность «Device detected». Эта функция определена в подключённом файле stdio.h (строка 59) (см. Стандартные функции ввода/вывода).