Разделы

 

Поиск

Проекты->Цифровой термометр

Назад...

Зачем все затевалось?

Достаточно часто в быту возникает задача измерения температуры с небольшой точностью. Можно воспользоваться спиртовыми или ртутными термометрами, но люди в нашей стране не ищут легких путей - надо что-то электронное и заумное. Тогда некоторые из-них вспоминают, что когда-то держали паяльник в руках, и решаются на невероятное - самому собрать подобное устройство. Сказано - сделано. Итак, будем мастерить цифровой термометр.

Что нам понадобится?

Для того, чтобы собрать этот девайс, понадобится следующее:
- микроконтроллер ATmega8L;
- цифровой датчик температуры DS18B20;
- 4-разрядный 7-сегментный ЖКИ, например, LXD34R3R02GH;
- стабилизатор +5 В (78L05), диоды, резисторы, конденсаторы;
- кусок стеклотекстолита, корпус (для божеского вида устройства) и пр.

Еще понадобится программатор, паяльник, припой, флюс и прямые руки.

Принципиальная схема

Принципиалка изображена на рис.1.


Рис.1. Принципиальная схема

Как видим, схема достаточно проста. Сердцем термометра является МК DD1. Выбор на семейство AVR пал потому, что с ними я уже работал, они продаются по приемлемой цене и, вообще, мне нравится продуманная система команд и именования регистров. Так как ЖКИ без внутреннего контроллера, то пришлось задействовать достаточно много выводов микросхемы. Это также ведет к усложнению разводки печатной платы. Именно здесь необходимо остановиться и подумать: а не развести ли плату сразу? Вот это и является первой изюминкой данного проекта.

Вторая изюминка заключается в очень малом энергопотреблении. МК тактируется внутренним RC-генератором 1 МГц, поэтому потребляемый ток достаточно мал. В качестве индикатора использовать светодиодные означает поставить крест на длительной автономной работе. Остаются ЖКИ, но найти трех-четырехразрядные индикаторы со встроенным контроллером оказалось невозможным. Пришлось приобрести дешевенький импортный 4-разрядный индикатор, аналогичный отечественному ИЖЦ-4/8.

Собственно датчиком является микросхема DA1. Это цифровой датчик температуры с однопроводным интерфейсом (1-Wire). Его точности 2° в рабочем диапазоне температур вполне достаточно для домашних измерений. А в диапазоне 0...70° производитель гарантирует точность 0.5°. Кроме того, микросхема может работать в режиме паразитного питания, что позволяет использовать всего два провода для соединения датчика с измерительным модулем - третья изюминка проекта.

Остальные элементы, я думаю, в особых комментариях не нуждаются. Схема включения датчика и стабилизатора - типовые. Питающим элементом является батарея "Крона".

Монтаж

Печатная плата рисовалась в прямом смысле вручную, поэтому рисунка печатной платы предоставить не могу :). Хочу лишь отметить, что ЖКИ устанавливается поверх МК, и соединения между ними представляют собой прямолинейные отрезки. Здесь как раз работает принцип: сначала делаем (разводим плату), а потом думаем (пишем программу) :). Внешний вид собранного устройства приведен на рис.2.


Рис.2. Внешний вид платы с элементами

Плата с установленными элементами вставлена в стандартный корпус КМ-33С (рис.3).


Рис.3. Корпус КМ-33С

Алгоритм работы

Попытаюсь в нескольких словах изложить алгоритм работы устройства.

При вкючении устройства выполняется начальная инициализация: инициализация стека, настройка портов на выход, настройка работы таймера, снятие блокировки прерываний. Таймер настраивается на деление частоты в 10000 раз, что дает частоту 1 МГц/10000=100 Гц. Такой коэффициент необходим для формирования меандра частотой 50 Гц. Интервал 1 с, необходимый для периодического запуска измерения, формируется программным путем. Далее идет бесконечный цикл с прерываниями.

При каждом вызове прерывания формируются сигналы на входах ЖКИ для возбуждения необходимых сегментов. За формирование конкретных знаков служат подпрограммы с соответствующими названиями. Как уже упоминалось, интервал 1 с получается программным путем. При включении девайса на секунду выводится логотип "PVA" (рис.4).


Рис.4. Логотип

На следующем этапе высвечивается значение регистра температуры. Сейчас в нем сохранен ноль (рис.5).


Рис.5. Вывод нуля

Далее проверяется наличие датчика температуры. Если он есть (а как же без него!), то с него читается значение температуры. При подаче питания на датчик в этот регистр автоматически заносится число 85 (рис.6).


Рис.6. Первое чтение температуры

Потом на индикатор выводится действительное значение температуры в градусах Цельсия. Отрицательные значение сопровождаются знаком "-" в четвертом разряде. В термометре реализован алгоритм гашения незначащих нулей. Если датчик не подключен или на линии к.з., то на индикатор выводится символ ошибки (рис.7).


Рис.7. Вывод ошибки

Программа

Полный исходный текст на ассемблере приведен в листинге 1.

Листинг 1

;********************************************************** ; Программа цифрового термометра ;********************************************************** ; Автор: В. А. Прищепа ; МК: ATmega8, внутренний тактовый генератор 1 МГц ; Датчик: DS18B20 ; ЖКИ: четырехразрядный импортный ;********************************************************** .include "C:\VMLAB\include\m8def.inc" ;********************************************************** ; Блок символических имен ;********************************************************** ; Символические имена выводов МК для датчика .equ BK =PD6 ; Вывод датчика 2, сигнальный .equ BK_PORT =PORTD ; Порт МК для датчика (запись) .equ BK_PIN =PIND ; Порт МК для датчика (чтение) .equ BK_DDR =DDRD ; Регистр направления МК для датчика ; Символические имена выводов МК для ЖКИ .equ LCD_BP =PD0 ; Вывод ЖКИ 1 и 40, общий .equ LCD_C4 =PD1 ; Вывод ЖКИ 7, сегмент с разряда 4 .equ LCD_E3 =PD2 ; Вывод ЖКИ 9, сегмент e разряда 3 .equ LCD_D3 =PD3 ; Вывод ЖКИ 10, сегмент d разряда 3 .equ LCD_C3 =PD4 ; Вывод ЖКИ 11, сегмент c разряда 3 .equ LCD_E2 =PB6 ; Вывод ЖКИ 13, сегмент e разряда 2 .equ LCD_D2 =PB7 ; Вывод ЖКИ 14, сегмент d разряда 2 .equ LCD_C2 =PD5 ; Вывод ЖКИ 15, сегмент c разряда 2 .equ LCD_E1 =PD7 ; Вывод ЖКИ 17, сегмент e разряда 1 .equ LCD_C1 =PD7 ; Вывод ЖКИ 19, сегмент c разряда 1 .equ LCD_B1 =PB0 ; Вывод ЖКИ 20, сегмент b разряда 1 .equ LCD_A1 =PB1 ; Вывод ЖКИ 21, сегмент a разряда 1 .equ LCD_F1 =PB1 ; Вывод ЖКИ 22, сегмент f разряда 1 .equ LCD_G1 =PB1 ; Вывод ЖКИ 23, сегмент g разряда 1 .equ LCD_B2 =PB2 ; Вывод ЖКИ 24, сегмент b разряда 2 .equ LCD_A2 =PB3 ; Вывод ЖКИ 25, сегмент a разряда 2 .equ LCD_F2 =PB4 ; Вывод ЖКИ 26, сегмент f разряда 2 .equ LCD_G2 =PB5 ; Вывод ЖКИ 27, сегмент g разряда 2 .equ LCD_B3 =PC0 ; Вывод ЖКИ 29, сегмент b разряда 3 .equ LCD_A3 =PC1 ; Вывод ЖКИ 30, сегмент a разряда 3 .equ LCD_F3 =PC2 ; Вывод ЖКИ 31, сегмент f разряда 3 .equ LCD_G3 =PC3 ; Вывод ЖКИ 32, сегмент g разряда 3 .equ LCD_B4 =PC4 ; Вывод ЖКИ 34, сегмент b разряда 4 .equ LCD_G4 =PC5 ; Вывод ЖКИ 37, сегмент g разряда 4 ; Символические имена портов МК для ЖКИ .equ LCD_PORT_BP =PORTD ; Порт общего вывода ЖКИ .equ LCD_PORT_C4 =PORTD ; Порт сегмента c разряда 4 .equ LCD_PORT_E3 =PORTD ; Порт сегмента e разряда 3 .equ LCD_PORT_D3 =PORTD ; Порт сегмента d разряда 3 .equ LCD_PORT_C3 =PORTD ; Порт сегмента c разряда 3 .equ LCD_PORT_E2 =PORTB ; Порт сегмента e разряда 2 .equ LCD_PORT_D2 =PORTB ; Порт сегмента d разряда 2 .equ LCD_PORT_C2 =PORTD ; Порт сегмента c разряда 2 .equ LCD_PORT_E1 =PORTD ; Порт сегмента e разряда 1 .equ LCD_PORT_C1 =PORTD ; Порт сегмента c разряда 1 .equ LCD_PORT_B1 =PORTB ; Порт сегмента b разряда 1 .equ LCD_PORT_A1 =PORTB ; Порт сегмента a разряда 1 .equ LCD_PORT_F1 =PORTB ; Порт сегмента f разряда 1 .equ LCD_PORT_G1 =PORTB ; Порт сегмента g разряда 1 .equ LCD_PORT_B2 =PORTB ; Порт сегмента b разряда 2 .equ LCD_PORT_A2 =PORTB ; Порт сегмента a разряда 2 .equ LCD_PORT_F2 =PORTB ; Порт сегмента f разряда 2 .equ LCD_PORT_G2 =PORTB ; Порт сегмента g разряда 2 .equ LCD_PORT_B3 =PORTC ; Порт сегмента b разряда 3 .equ LCD_PORT_A3 =PORTC ; Порт сегмента a разряда 3 .equ LCD_PORT_F3 =PORTC ; Порт сегмента f разряда 3 .equ LCD_PORT_G3 =PORTC ; Порт сегмента g разряда 3 .equ LCD_PORT_B4 =PORTC ; Порт сегмента b разряда 4 .equ LCD_PORT_G4 =PORTC ; Порт сегмента g разряда 4 ; Символические имена флагов регистра состояния .equ INV =0 ; Инверсия сигналов (аналогия - общий анод) .equ PVA =1 ; Этап вывода заставки " PVA" .equ ERR =2 ; Этап вывода символа ошибки " -- " .equ BC4 =3 ; Температура 100°С и более .equ MIN =4 ; Отрицательная температура ; Символические имена команд шины microLAN .equ CONVERT =0x44 ; Запуск преобразования .equ READPAD =0xBE ; Чтение блокнотной памяти .equ SKIPROM =0xCC ; Пропуск ПЗУ ;********************************************************** ; Блок символических переменных ;********************************************************** .def temp =r16 ; Временная переменная .def cnt =r17 ; Счетчик/делитель на 200, 100 Гц / 200 = 0.5 Гц .def stat =r18 ; Регистр состояния .def value =r19 ; Значение температуры по модулю .def dig1 =r20 ; Переменная для разряда единиц .def dig2 =r21 ; Переменная для разряда десятков ;********************************************************** ; Блок векторов прерываний ;********************************************************** .org 0x00 Reset: rjmp Start ; Вектор прерывания по сбросу .org 0x06 rjmp Tim1CompA ; Вектор прерывания от таймера 1 ;********************************************************** ; Блок обработки прерываний ;********************************************************** .org 0x20 ; Обработчик прерывания от таймера 1 Tim1CompA: tst cnt ; Проверка на ноль программного счетчика brne Tim1CompADisp ; Переход, если не ноль ldi cnt,100 ; Загрузка коэффициента деления rcall Logic ; Обработка этапов работы устройства Tim1CompADisp: dec cnt ; Декремент программного счетчика mov temp,stat ; Копирование stat в temp sbrc temp,INV ; Пропуск, если флаг сброшен andi stat,~(1<<INV) ; Сброс флага инверсии сигналов sbrs temp,INV ; Пропуск, если флаг поднят ori stat,(1<<INV) ; Поднятие флага инверсии сигналов sbrc stat,PVA ; Пропуск, если флаг сброшен rcall Logo ; Вывод заставки sbrs stat,PVA ; Пропуск, если флаг поднят rcall Display ; Вывод результатов измерения sbrc stat,ERR ; Пропуск, если флаг сброшен rcall Error ; Вывод сообщения об ошибке reti ; Выход из подпрограммы обработки прерывания ;********************************************************** ; Основная программа ;********************************************************** Start: ; Начало основной программы ldi temp,high(RAMEND) ; Инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp ldi temp,0xFF ; Настройка всех линий на выход out DDRB,temp out DDRC,temp out DDRD,temp sbi BK_PORT,BK ; Установка 1 на шине clr stat ; Очистка регистра состояния ori stat,(1<<PVA) ; Первый этап - вывод заставки clr value ; Очистка некоторых регистров clr dig1 clr dig2 ldi cnt,100 ; Загрузка коэффициента деления ldi temp,high(10000) ; Загрузка коэффициента out OCR1AH,temp ; деления в регистр сравнения ldi temp,low(10000) ; таймера 1, out OCR1AL,temp ; 1 МГц / 10000 = 100 Гц ldi temp,(1<<WGM12)|(1<<CS10) ; Таймер работает на out TCCR1B,temp ; тактовой частоте в режиме СТС ldi temp,(1<<OCIE1A) ; Разрешение прерываний от out TIMSK,temp ; таймера 1 в режиме СТС sei ; Разблокировка всех прерываний Forever: ; Бесконечный цикл с прерываниями rjmp Forever ;********************************************************** ; Подпрограмма управления этапами работы устройства ;********************************************************** Logic: cli ; Запрет всех прерываний sbrc stat,PVA ; Пропуск, если не этап вывода заставки rjmp LogicPVA ; Переход на этап вывода заставки rcall uLAN_Reset ; Сброс шины ori stat,(1<<ERR) ; Поднятие флага ошибки brts LogicEnd ; Переход, если ошибка при сбросе andi stat,~(1<<ERR) ; Сброс флага ошибки ldi temp,SKIPROM ; Пропуск ПЗУ rcall uLAN_ByteWrite ldi temp,READPAD ; Чтение блокнотной памяти rcall uLAN_ByteWrite rcall uLAN_ByteRead ; Чтение младшего байта температуры swap temp ; Перестановка тетрад andi temp,0x0F ; Выделение младшего полубайта температуры mov value,temp ; Копирование в value rcall uLAN_ByteRead ; Чтение старшего байта температуры swap temp ; Перестановка тетрад andi temp,0xF0 ; Выделение старшего полубайта температуры or value,temp ; Склеивание в один байт andi stat,~(1<<MIN) ; Сброс флага отрицательной температуры sbrs value,7 ; Проверка знакового разряда rjmp LogicPos ; Переход, если положительная температура ori stat,(1<<MIN) ; Поднятие флага отрицательной температуры com value ; Инвертирование значения LogicPos: rcall Transform ; Преобразование в двоично-десятичный вид rcall uLAN_Reset ; Сброс шины ori stat,(1<<ERR) ; Поднятие флага ошибки brts LogicEnd ; Переход, если ошибка при сбросе andi stat,~(1<<ERR) ; Сброс флага ошибки ldi temp,SKIPROM ; Пропуск ПЗУ rcall uLAN_ByteWrite ldi temp,CONVERT ; Запуск преобразования температуры rcall uLAN_ByteWrite rjmp LogicEnd ; Переход в конец LogicPVA: andi stat,~(1<<PVA) ; Сброс флага этапа вывода заставки LogicEnd: sei ; Разблокировка всех прерываний ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода заставки " PVA" ;********************************************************** Logo: sbrc stat,INV ; Проверка на необходимость инверсии rjmp LogoInv cbi LCD_PORT_BP,LCD_BP ; Сигнал на общем выводе в противофазе sbi LCD_PORT_A1,LCD_A1 ; Зажечь сегменты a, f, g разряда 1 sbi LCD_PORT_B1,LCD_B1 ; Зажечь сегмент b разряда 1 sbi LCD_PORT_C1,LCD_C1 ; Зажечь сегменты c, e разряда 1 cbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 cbi LCD_PORT_B4,LCD_B4 ; Потушить сегмент b разряда 4 cbi LCD_PORT_C4,LCD_C4 ; Потушить сегмент c разряда 4 cbi LCD_PORT_G4,LCD_G4 ; Потушить сегмент g разряда 4 rjmp LogoEnd LogoInv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_BP,LCD_BP ; Сигнал на общем выводе в фазе cbi LCD_PORT_A1,LCD_A1 ; Зажечь сегменты a, f, g разряда 1 cbi LCD_PORT_B1,LCD_B1 ; Зажечь сегмент b разряда 1 cbi LCD_PORT_C1,LCD_C1 ; Зажечь сегменты c, e разряда 1 sbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 sbi LCD_PORT_B4,LCD_B4 ; Потушить сегмент b разряда 4 sbi LCD_PORT_C4,LCD_C4 ; Потушить сегмент c разряда 4 sbi LCD_PORT_G4,LCD_G4 ; Потушить сегмент g разряда 4 LogoEnd: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода строки " -- " ;********************************************************** Error: sbrc stat,INV ; Проверка на необходимость инверсии rjmp ErrorInv cbi LCD_PORT_BP,LCD_BP ; Сигнал на общем выводе в противофазе cbi LCD_PORT_A1,LCD_A1 ; Потушить сегменты a, f, g разряда 1 cbi LCD_PORT_B1,LCD_B1 ; Потушить сегмент b разряда 1 cbi LCD_PORT_C1,LCD_C1 ; Потушить сегменты c, e разряда 1 cbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Потушить сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Потушить сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 cbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 cbi LCD_PORT_B4,LCD_B4 ; Потушить сегмент b разряда 4 cbi LCD_PORT_C4,LCD_C4 ; Потушить сегмент c разряда 4 cbi LCD_PORT_G4,LCD_G4 ; Потушить сегмент g разряда 4 rjmp ErrorEnd ErrorInv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_BP,LCD_BP ; Сигнал на общем выводе в фазе sbi LCD_PORT_A1,LCD_A1 ; Потушить сегменты a, f, g разряда 1 sbi LCD_PORT_B1,LCD_B1 ; Потушить сегмент b разряда 1 sbi LCD_PORT_C1,LCD_C1 ; Потушить сегменты c, e разряда 1 sbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Потушить сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Потушить сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 sbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 sbi LCD_PORT_B4,LCD_B4 ; Потушить сегмент b разряда 4 sbi LCD_PORT_C4,LCD_C4 ; Потушить сегмент c разряда 4 sbi LCD_PORT_G4,LCD_G4 ; Потушить сегмент g разряда 4 ErrorEnd: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма преобразования двоичного числа в двоично-десятичное. ; В качестве параметра принимается значение регистра value (0...199), ; а результат записывается в stat[BC4]:dig2:dig1 ;********************************************************** Transform: andi stat,~(1<<BC4) ; Сброс флага сотен clr dig2 ; Обнуление разряда десятков clr dig1 ; Обнуление разряда единиц mov temp,value ; Копирование значения в temp cpi temp,100 ; Сравнение с константой 100 brlo TransformLower100 ; Переход, если меньше 100 subi temp,100 ; Вычитание сотни ori stat,(1<<BC4) ; Поднятие флага сотен TransformLower100: TransformDiv10: cpi temp,10 ; Сравнение с константой 10 brlo TransformLower10 ; Переход, если меньше 10 subi temp,10 ; Вычитание десятков inc dig2 ; Подсчет десятков rjmp TransformDiv10 ; Замыкание цикла вычисления десятков TransformLower10: TransformDiv1: cpi temp,1 ; Сравнение с константой 1 brlo TransformLower1 ; Переход, если меньше 1 subi temp,1 ; Вычитание единиц inc dig1 ; Подсчет единиц rjmp TransformDiv1 ; Замыкание цикла вычисления единиц TransformLower1: ret ;********************************************************** ; Подпрограмма вывода значения температуры "-199°"..."199°" ; В качестве параметров принимаются значения stat[BC4]:dig2:dig1 ;********************************************************** Display: sbrc stat,INV ; Проверка на необходимость инверсии sbi LCD_PORT_BP,LCD_BP ; Сигнал на общем выводе в противофазе sbrs stat,INV ; Проверка на необходимость инверсии cbi LCD_PORT_BP,LCD_BP ; Сигнал на общем выводе в фазе rcall Deg ; Вывод символа '°' в разряде 1 Display0: cpi dig1,0 ; Сравнение с константой 0 brne Display1 ; Переход, если не равно rcall Dig0 ; Вывод символа '0' в разряде 2 Display1: cpi dig1,1 ; Сравнение с константой 1 brne Display2 ; Переход, если не равно rcall Dig1 ; Вывод символа '1' в разряде 2 Display2: cpi dig1,2 ; Сравнение с константой 2 brne Display3 ; Переход, если не равно rcall Dig2 ; Вывод символа '2' в разряде 2 Display3: cpi dig1,3 ; Сравнение с константой 3 brne Display4 ; Переход, если не равно rcall Dig3 ; Вывод символа '3' в разряде 2 Display4: cpi dig1,4 ; Сравнение с константой 4 brne Display5 ; Переход, если не равно rcall Dig4 ; Вывод символа '4' в разряде 2 Display5: cpi dig1,5 ; Сравнение с константой 5 brne Display6 ; Переход, если не равно rcall Dig5 ; Вывод символа '5' в разряде 2 Display6: cpi dig1,6 ; Сравнение с константой 6 brne Display7 ; Переход, если не равно rcall Dig6 ; Вывод символа '6' в разряде 2 Display7: cpi dig1,7 ; Сравнение с константой 7 brne Display8 ; Переход, если не равно rcall Dig7 ; Вывод символа '7' в разряде 2 Display8: cpi dig1,8 ; Сравнение с константой 8 brne Display9 ; Переход, если не равно rcall Dig8 ; Вывод символа '8' в разряде 2 Display9: cpi dig1,9 ; Сравнение с константой 9 brne DisplayEnd1 ; Переход, если не равно rcall Dig9 ; Вывод символа '9' в разряде 2 DisplayEnd1: Display00: cpi dig2,0 ; Сравнение с константой 0 brne Display10 ; Переход, если не равно sbrc stat,BC4 ; Проверка на присутствие сотни rcall Dig00 ; Вывод символа '0' в разряде 3 sbrs stat,BC4 ; Проверка на присутствие сотни rcall Blank3 ; Гашение разряда 3 Display10: cpi dig2,1 ; Сравнение с константой 1 brne Display20 ; Переход, если не равно rcall Dig10 ; Вывод символа '1' в разряде 3 Display20: cpi dig2,2 ; Сравнение с константой 2 brne Display30 ; Переход, если не равно rcall Dig20 ; Вывод символа '2' в разряде 3 Display30: cpi dig2,3 ; Сравнение с константой 3 brne Display40 ; Переход, если не равно rcall Dig30 ; Вывод символа '3' в разряде 3 Display40: cpi dig2,4 ; Сравнение с константой 4 brne Display50 ; Переход, если не равно rcall Dig40 ; Вывод символа '4' в разряде 3 Display50: cpi dig2,5 ; Сравнение с константой 5 brne Display60 ; Переход, если не равно rcall Dig50 ; Вывод символа '5' в разряде 3 Display60: cpi dig2,6 ; Сравнение с константой 6 brne Display70 ; Переход, если не равно rcall Dig60 ; Вывод символа '6' в разряде 3 Display70: cpi dig2,7 ; Сравнение с константой 7 brne Display80 ; Переход, если не равно rcall Dig70 ; Вывод символа '7' в разряде 3 Display80: cpi dig2,8 ; Сравнение с константой 8 brne Display90 ; Переход, если не равно rcall Dig80 ; Вывод символа '8' в разряде 3 Display90: cpi dig2,9 ; Сравнение с константой 9 brne DisplayEnd10 ; Переход, если не равно rcall Dig90 ; Вывод символа '9' в разряде 3 DisplayEnd10: sbrc stat,BC4 ; Проверка на присутствие сотни rcall Dig100 ; Вывод символа '1' в разряде 4 sbrs stat,BC4 ; Проверка на отсутствие сотни rcall Blank4 ; Гашение разряда 4 sbrc stat,MIN ; Проверка на присутствие минуса rcall Minus ; Вывод символа '-' в разряде 4 sbrs stat,MIN ; Проверка на отсутствие минуса rcall NoMinus ; Гашение символа '-' в разряде 4 ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '°' в разряде 1 ;********************************************************** Deg: sbrc stat,INV ; Проверка на необходимость инверсии rjmp DegInv sbi LCD_PORT_A1,LCD_A1 ; Зажечь сегменты a, f, g разряда 1 sbi LCD_PORT_B1,LCD_B1 ; Зажечь сегмент b разряда 1 cbi LCD_PORT_C1,LCD_C1 ; Потушить сегменты c, e разряда 1 rjmp DegEnd DegInv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A1,LCD_A1 ; Зажечь сегменты a, f, g разряда 1 cbi LCD_PORT_B1,LCD_B1 ; Зажечь сегмент b разряда 1 sbi LCD_PORT_C1,LCD_C1 ; Потушить сегменты c, e разряда 1 DegEnd: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '0' в разряде 2 (единицы) ;********************************************************** Dig0: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig0Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 rjmp Dig0End Dig0Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 Dig0End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '1' в разряде 2 (единицы) ;********************************************************** Dig1: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig1Inv cbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 rjmp Dig1End Dig1Inv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 Dig1End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '2' в разряде 2 (единицы) ;********************************************************** Dig2: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig2Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Потушить сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig2End Dig2Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Потушить сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig2End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '3' в разряде 2 (единицы) ;********************************************************** Dig3: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig3Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig3End Dig3Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Потушить сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig3End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '4' в разряде 2 (единицы) ;********************************************************** Dig4: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig4Inv cbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig4End Dig4Inv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_A2,LCD_A2 ; Потушить сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig4End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '5' в разряде 2 (единицы) ;********************************************************** Dig5: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig5Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Потушить сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig5End Dig5Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Потушить сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig5End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '6' в разряде 2 (единицы) ;********************************************************** Dig6: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig6Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Потушить сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig6End Dig6Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Потушить сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig6End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '7' в разряде 2 (единицы) ;********************************************************** Dig7: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig7Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 rjmp Dig7End Dig7Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Потушить сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Потушить сегмент g разряда 2 Dig7End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '8' в разряде 2 (единицы) ;********************************************************** Dig8: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig8Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig8End Dig8Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Зажечь сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig8End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '9' в разряде 2 (единицы) ;********************************************************** Dig9: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig9Inv sbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 sbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 sbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 sbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 cbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 sbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 sbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 rjmp Dig9End Dig9Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A2,LCD_A2 ; Зажечь сегмент a разряда 2 cbi LCD_PORT_B2,LCD_B2 ; Зажечь сегмент b разряда 2 cbi LCD_PORT_C2,LCD_C2 ; Зажечь сегмент c разряда 2 cbi LCD_PORT_D2,LCD_D2 ; Зажечь сегмент d разряда 2 sbi LCD_PORT_E2,LCD_E2 ; Потушить сегмент e разряда 2 cbi LCD_PORT_F2,LCD_F2 ; Зажечь сегмент f разряда 2 cbi LCD_PORT_G2,LCD_G2 ; Зажечь сегмент g разряда 2 Dig9End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма гашения разряда 3 (десятки) ;********************************************************** Blank3: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Blank3Inv cbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 rjmp Blank3End Blank3Inv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 Blank3End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '0' в разряде 3 (десятки) ;********************************************************** Dig00: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig00Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 rjmp Dig00End Dig00Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 Dig00End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '1' в разряде 3 (десятки) ;********************************************************** Dig10: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig10Inv cbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 rjmp Dig10End Dig10Inv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 Dig10End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '2' в разряде 3 (десятки) ;********************************************************** Dig20: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig20Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig20End Dig20Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Потушить сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig20End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '3' в разряде 3 (десятки) ;********************************************************** Dig30: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig30Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig30End Dig30Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Потушить сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig30End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '4' в разряде 3 (десятки) ;********************************************************** Dig40: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig40Inv cbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig40End Dig40Inv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_A3,LCD_A3 ; Потушить сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig40End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '5' в разряде 3 (десятки) ;********************************************************** Dig50: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig50Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig50End Dig50Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig50End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '6' в разряде 3 (десятки) ;********************************************************** Dig60: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig60Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig60End Dig60Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Потушить сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig60End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '7' в разряде 3 (десятки) ;********************************************************** Dig70: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig70Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 rjmp Dig70End Dig70Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Потушить сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Потушить сегмент g разряда 3 Dig70End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '8' в разряде 3 (десятки) ;********************************************************** Dig80: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig80Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig80End Dig80Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Зажечь сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig80End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '9' в разряде 3 (десятки) ;********************************************************** Dig90: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig90Inv sbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 sbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 sbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 sbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 cbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 sbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 sbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 rjmp Dig90End Dig90Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_A3,LCD_A3 ; Зажечь сегмент a разряда 3 cbi LCD_PORT_B3,LCD_B3 ; Зажечь сегмент b разряда 3 cbi LCD_PORT_C3,LCD_C3 ; Зажечь сегмент c разряда 3 cbi LCD_PORT_D3,LCD_D3 ; Зажечь сегмент d разряда 3 sbi LCD_PORT_E3,LCD_E3 ; Потушить сегмент e разряда 3 cbi LCD_PORT_F3,LCD_F3 ; Зажечь сегмент f разряда 3 cbi LCD_PORT_G3,LCD_G3 ; Зажечь сегмент g разряда 3 Dig90End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма гашения разряда 4 (сотни) ;********************************************************** Blank4: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Blank4Inv cbi LCD_PORT_B4,LCD_B4 ; Потушить сегмент b разряда 4 cbi LCD_PORT_C4,LCD_C4 ; Потушить сегмент c разряда 4 rjmp Blank4End Blank4Inv: ; Вывод сигналов в инвертированном виде sbi LCD_PORT_B4,LCD_B4 ; Потушить сегмент b разряда 4 sbi LCD_PORT_C4,LCD_C4 ; Потушить сегмент c разряда 4 Blank4End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '1' в разряде 4 (сотни) ;********************************************************** Dig100: sbrc stat,INV ; Проверка на необходимость инверсии rjmp Dig100Inv sbi LCD_PORT_B4,LCD_B4 ; Зажечь сегмент b разряда 4 sbi LCD_PORT_C4,LCD_C4 ; Зажечь сегмент c разряда 4 rjmp Dig100End Dig100Inv: ; Вывод сигналов в инвертированном виде cbi LCD_PORT_B4,LCD_B4 ; Зажечь сегмент b разряда 4 cbi LCD_PORT_C4,LCD_C4 ; Зажечь сегмент c разряда 4 Dig100End: ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма гашения символа '-' в разряде 4 ;********************************************************** NoMinus: sbrc stat,INV ; Проверка на необходимость инверсии sbi LCD_PORT_G4,LCD_G4 ; Потушить сегмент g разряда 4 (инверсия) sbrs stat,INV ; Проверка на необходимость инверсии cbi LCD_PORT_G4,LCD_G4 ; Потушить сегмент g разряда 4 ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма вывода символа '-' в разряде 4 ;********************************************************** Minus: sbrc stat,INV ; Проверка на необходимость инверсии cbi LCD_PORT_G4,LCD_G4 ; Зажечь сегмент g разряда 4 (инверсия) sbrs stat,INV ; Проверка на необходимость инверсии sbi LCD_PORT_G4,LCD_G4 ; Зажечь сегмент g разряда 4 ret ; Конец подпрограммы ;********************************************************** ; Подпрограмма задержки приблизительно на 60 мкс (шина MicroLAN) ;********************************************************** uLAN_Delay60u: push temp ; Сохранение переменной в стеке ldi temp,15 ; Загрузка константы 15х4=60 uLAN_Delay60uCycle: dec temp ; Декремент счетчика tst temp ; Проверка счетчика на ноль brne uLAN_Delay60uCycle ; Переход, если не ноль pop temp ; Восстановление переменной ret ; Выход из подпрограммы ;********************************************************** ; Подпрограмма сброса по шине MicroLAN ; О наличии ошибки свидетельствует бит Т=1 ;********************************************************** uLAN_Reset: set ; Поднятие флага ошибки в бите T sbi BK_PORT,BK ; Приведение в исходное состояние cbi BK_PORT,BK ; Начало импульса сброса rcall uLAN_Delay60u ; Суммарная задержка 480 мкс rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u sbi BK_PORT,BK ; Конец импульса сброса cbi BK_DDR,BK ; Переключение на прием cbi BK_PORT,BK ; Отключение подтягивающего резистора rcall uLAN_Delay60u ; Задержка 60 мкс sbis BK_PIN,BK ; Пропустить, если 1 clt ; Сброс флага ошибки в бите T rcall uLAN_Delay60u ; Суммарная задержка 480 мкс rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u rcall uLAN_Delay60u sbis BK_PIN,BK ; Пропустить, если 1 set ; Поднятие флага ошибки в бите Т sbi BK_DDR,BK ; Переключение на передачу sbi BK_PORT,BK ; Приведение в исходное состояние ret ; Выход из подпрограммы ;********************************************************** ; Подпрограмма чтения бита по шине MicroLAN ; Выходным аргументом является бит T ;********************************************************** uLAN_BitRead: clt ; Обнуление бита T sbi BK_PORT,BK ; Приведение в исходное состояние cbi BK_PORT,BK ; Начало слота cbi BK_DDR,BK ; Переключение на прием nop ; Задержка на 8 мкс nop nop nop nop nop nop nop sbic BK_PIN,BK ; Пропустить, если 0 set ; Запись 1 в бит T rcall uLAN_Delay60u ; Формирование слота sbi BK_PORT,BK ; Конец слота sbi BK_DDR,BK ; Переключение на передачу ret ; Выход из подпрограммы ;********************************************************** ; Подпрограмма записи бита по шине MicroLAN ; В качестве входного аргумента выступает бит T ;********************************************************** uLAN_BitWrite: sbi BK_PORT,BK ; Приведение в исходное состояние cbi BK_PORT,BK ; Начало слота brtc uLAN_BitWrite0 ; Переход, если 0 sbi BK_PORT,BK ; Признак 1 на линии uLAN_BitWrite0: rcall uLAN_Delay60u ; Формирование слота sbi BK_PORT,BK ; Конец слота ret ; Выход из подпрограммы ;********************************************************** ; Подпрограмма чтения байта по шине MicroLAN ; Выходным аргументом является temp ;********************************************************** uLAN_ByteRead: rcall uLAN_BitRead ; Чтение бита 0 bld temp,0 rcall uLAN_BitRead ; Чтение бита 1 bld temp,1 rcall uLAN_BitRead ; Чтение бита 2 bld temp,2 rcall uLAN_BitRead ; Чтение бита 3 bld temp,3 rcall uLAN_BitRead ; Чтение бита 4 bld temp,4 rcall uLAN_BitRead ; Чтение бита 5 bld temp,5 rcall uLAN_BitRead ; Чтение бита 6 bld temp,6 rcall uLAN_BitRead ; Чтение бита 7 bld temp,7 ret ; Выход из подпрограммы ;********************************************************** ; Подпрограмма записи байта по шине MicroLAN ; Входным аргументом является temp ;********************************************************** uLAN_ByteWrite: bst temp,0 rcall uLAN_BitWrite ; Запись бита 0 bst temp,1 rcall uLAN_BitWrite ; Запись бита 1 bst temp,2 rcall uLAN_BitWrite ; Запись бита 2 bst temp,3 rcall uLAN_BitWrite ; Запись бита 3 bst temp,4 rcall uLAN_BitWrite ; Запись бита 4 bst temp,5 rcall uLAN_BitWrite ; Запись бита 5 bst temp,6 rcall uLAN_BitWrite ; Запись бита 6 bst temp,7 rcall uLAN_BitWrite ; Запись бита 7 ret ; Выход из подпрограммы

Содержимое файла прошивки приведено в листинге 2.

Листинг 2

:020000020000FC :0200000030C00E :02000C0019C019 :10004000112311F414E626D01A95022F00FD2E7FFD :1000500000FF216021FD43D021FFB0D022FD6DD0F3 :10006000189504E00EBF0FE50DBF0FEF07BB04BBF3 :1000700001BB969A2227226033274427552714E68E :1000800007E20BBD00E10ABD09E00EBD00E109BFBA :100090007894FFCFF89421FD1FC082D22460EEF047 :1000A0002B7F0CECC5D20EEBC3D2B1D202950F70F0 :1000B000302FADD20295007F302B2F7E37FF02C04C :1000C0002061309568D06CD224603EF02B7F0CEC20 :1000D000AFD204E4ADD201C02D7F7894089520FD05 :1000E00016C09098C19AC09A979AC398C29A959A46 :1000F000C79AC69AC49AC598A99AA89A94989398A8 :10010000929AAA9AAB9AAC989198AD9815C0909A89 :10011000C198C0989798C39AC2989598C798C6985E :10012000C498C59AA998A898949A939A9298AA98CC :10013000AB98AC9A919AAD9A089520FD16C090980C :10014000C198C0989798C398C2989598C798C69830 :10015000C498C59AA998A898949893989298AA98A0 :10016000AB9AAC989198AD9815C0909AC19AC09AE4 :10017000979AC39AC29A959AC79AC69AC49AC598EA :10018000A99AA89A949A939A929AAA9AAB98AC9A96 :10019000919AAD9A0895277F55274427032F043657 :1001A00010F0045628600A3018F00A505395FBCF1F :1001B000013018F001504395FBCF089520FD909A2F :1001C00020FF909848D0403009F44FD0413009F4D6 :1001D0005ED0423009F46DD0433009F47CD0443015 :1001E00009F48BD0453009F49AD0463009F4A9D0EF :1001F000473009F4B8D0483009F4C7D0493009F481 :10020000D6D0503021F423FDF6D023FFE2D0513078 :1002100009F403D1523009F412D1533009F421D139 :10022000543009F430D1553009F43FD1563009F437 :100230004ED1573009F45DD1583009F46CD15930A2 :1002400009F47BD123FD93D123FF89D124FD9CD1D7 :1002500024FF95D1089520FD04C0C19AC09A9798B3 :1002600003C0C198C098979A089520FD08C0C39A0A :10027000C29A959AC79AC69AC49AC59807C0C39855 :10028000C2989598C798C698C498C59A089520FDB5 :1002900008C0C398C29A959AC798C698C498C5983A :1002A00007C0C39AC2989598C79AC69AC49AC59A25 :1002B000089520FD08C0C39AC29A9598C79AC69A15 :1002C000C498C59A07C0C398C298959AC798C6980B :1002D000C49AC598089520FD08C0C39AC29A959AF9 :1002E000C79AC698C498C59A07C0C398C2989598EB :1002F000C798C69AC49AC598089520FD08C0C398A7 :10030000C29A959AC798C698C49AC59A07C0C39AC4 :10031000C2989598C79AC69AC498C598089520FD22 :1003200008C0C39AC298959AC79AC698C49AC59AA3 :1003300007C0C398C29A9598C798C69AC498C5989A :10034000089520FD08C0C39AC298959AC79AC69A84 :10035000C49AC59A07C0C398C29A9598C798C69878 :10036000C498C598089520FD08C0C39AC29A959A6A :10037000C798C698C49AC59807C0C398C29895985C :10038000C79AC69AC498C59A089520FD08C0C39A12 :10039000C29A959AC79AC69AC49AC59A07C0C39832 :1003A000C2989598C798C698C498C598089520FD96 :1003B00008C0C39AC29A959AC79AC698C49AC59A11 :1003C00007C0C398C2989598C798C69AC498C5980C :1003D000089520FD08C0A998A89894989398929899 :1003E000AA98AB9807C0A99AA89A949A939A929AB5 :1003F000AA9AAB9A089520FD08C0A99AA89A949A3F :10040000939A929AAA9AAB9807C0A998A898949898 :1004100093989298AA98AB9A089520FD08C0A9983D :10042000A89A949A93989298AA98AB9807C0A99A78 :10043000A8989498939A929AAA9AAB9A089520FDB4 :1004400008C0A99AA89A9498939A929AAA98AB9A53 :1004500007C0A998A898949A93989298AA9AAB984A :10046000089520FD08C0A99AA89A949A939A929800 :10047000AA98AB9A07C0A998A89894989398929A2A :10048000AA9AAB98089520FD08C0A998A89A949AB2 :1004900093989298AA9AAB9A07C0A99AA898949808 :1004A000939A929AAA98AB98089520FD08C0A99AA9 :1004B000A898949A939A9298AA9AAB9A07C0A998E6 :1004C000A89A94989398929AAA98AB98089520FD28 :1004D00008C0A99AA898949A939A929AAA9AAB9AC1 :1004E00007C0A998A89A949893989298AA98AB98BC :1004F000089520FD08C0A99AA89A949A9398929872 :10050000AA9AAB9807C0A998A8989498939A929A97 :10051000AA98AB9A089520FD08C0A99AA89A949A1F :10052000939A929AAA9AAB9A07C0A998A898949875 :1005300093989298AA98AB98089520FD08C0A99A1C :10054000A89A949A939A9298AA9AAB9A07C0A99853 :10055000A89894989398929AAA98AB98089520FD99 :1005600003C0AC98919802C0AC9A919A089520FD6E :1005700003C0AC9A919A02C0AC989198089520FD5E :10058000AD9A20FFAD98089520FDAD9820FFAD9A5B :1005900008950F930FE00A950023E9F70F9108954E :1005A0006894969A9698F5DFF4DFF3DFF2DFF1DFD7 :1005B000F0DFEFDFEEDF969A8E989698EADF869B63 :1005C000E894E7DFE6DFE5DFE4DFE3DFE2DFE1DF5A :1005D000E0DF869B68948E9A969A0895E894969A9E :1005E00096988E98000000000000000000000000B7 :1005F0000000000086996894CCDF969A8E9A089540 :10060000969A96980EF4969AC4DF969A0895E6DF25 :1006100000F9E4DF01F9E2DF02F9E0DF03F9DEDFF0 :1006200004F9DCDF05F9DADF06F9D8DF07F9089508 :1006300000FBE6DF01FBE4DF02FBE2DF03FBE0DFC0 :1006400004FBDEDF05FBDCDF06FBDADF07FBD8DFC0 :0206500008950B :00000001FF

Назад...

© Designed by Sjava

Hosted by uCoz