setbP0.1
mova, P0 ;считывание порта p0
anla, #00000011B ;обнуление лишних разрядов
xrla, #00000011B ;инвертирование
ret
;подпрограмма сброса ЖКИ №1
eres1: movP2, #0FH ;засылаем адрес регистра блокировки
setbP2.4
clrP2.4
movP2, #01000001B ;записываем код снятия блокировки
setbP2.4
clrP2.4
movP2, #0 ;устанавливаем адрес на первый разряд
setbP2.4
clrP2.4
ret
; подпрограмма сброса ЖКИ №2
eres2: mov P3, #0FH
setb P3.4
clr P3.4
mov p3, #01000001B
setb P3.4
clr P3.4
mov P3, #0
setb P3.4
clrP3.4
ret
;подпрограмма очистки ЖКИ №1
eclr1: calleres1 ;сброс экрана
movP2, #01000000B ;установка управляющего кода
movR0, #20 ;инициализация счетчика разрядов
c11: setP2.4 ;импульс записи
clrP2.4
djnzR0, c11 ;оператор цикла
ret
; подпрограмма очистки ЖКИ №2
eclr2: calleres2
mov P3, #01000000B
mov R0, #20
c21: set P3.4
clr P3.4
djnz R0, c21
ret
;подпрограмма установки курсора для ЖКИ №1 по аккумулятору
ecur1: anla, #0FH ;отделяем биты адреса
movP2, a ;устанавливаем адрес на первый разряд
setbP2.4
clrP2.4
ret
; подпрограмма установки курсора для ЖКИ №2 по аккумулятору
ecur2: anl a, #0FH
mov P3,a
setbP3.4
clrP3.4
ret
;таблица символов
ORG 0600H
ts: DB 0EEH ;0
DB 060H ;1
DB 02FH ;2
DB 06DH ;3
DB 0E1H ;4
DB 0CDH ;5
DB 0CFH ;6
DB 068H ;7
DB 0EFH ;8
DB 0EDH ;9
DB 0EBH ;A
DB 0C7H ;b
DB 08EH ;C
DB 067H ;d
DB 08FH ;E
DB 08BH ;F
DB 000H ;
DB 0A9H ;°
DB 001H ;-
DB 003H ;r
DB 047H ;o
;подпрограмма вывода символа на ЖКИ №1 через аккумулятор
prch1: pushDPL ;сохранение регистров в стеке
pushDPH
pushb
movDPTR, #ts ;начало таблицы символов
movc, acc.7 ;сохраняем значение точки
clracc.7 ;сбрасываем значение бита
movca, @a+DPTR ;получаем выводимый код
movacc.4, c ;восстанавливаем значение точки
movb, a ;сохраняем его в b
anla, #0FH ;отделяем младший полубайт
movP2, a ;выводим его на индикатор
setbP2.6 ;вкл. Режим вывода данных
setbP2.4 ;импульс записи
clrP2.4
mova, b ;восстанавливаем выводимый код
swapa
anla, #0FH ;отделяем старший полубайт
movp2, a ;выводим его на индикатор
setbp2.6 ;вкл. Режим вывода данных
setbP2.4 ;импульс записи
clrP2.4
popb
popDPH ;восстановление регистров
popDPL
ret
;подпрограмма вывода символа на ЖКИ №2 через аккумулятор
prch2: pushDPL ;сохранение регистров в стеке
pushDPH
pushb
movDPTR, #ts ;начало таблицы символов
movc, acc.7 ;сохраняем значение точки
clracc.7 ;сбрасываем значение бита
movca, @a+DPTR ;получаем выводимый код
movacc.4, c ;восстанавливаем значение точки
movb, a ;сохраняем его в b
anla, #0FH ;отделяем младший полубайт
movP3, a ;выводим его на индикатор
setbP3.6 ;вкл. Режим вывода данных
setbP3.4 ;импульс записи
clrP3.4
mova, b ;восстанавливаем выводимый код
swapa
anla, #0FH ;отделяем старший полубайт
movP3, a ;выводим его на индикатор
setbP3.6 ;вкл. Режим вывода данных
setbP3.4 ;импульс записи
clrP3.4
popb
popDPH ;восстановление регистров
popDPL
ret
;подпрограмма вывода сообщения на ЖКИ №2
prstr2: pushpsw ;сохранение регистра psw
movpsw, #bank3 ;включаем банк 3
ps1: mova, #0
movca, @a+DPTR ;получение очередного символа
cjnea, #0, ps2 ;если это не последний выводим
poppsw ;завершение подпрограммы
ret
ps2: callprch2 ;вывод символа на экран
incDPTR ;увеличиваем значение указателя
jmpps1
;подпрограмма вывода сообщения об ошибке
prErr: pushacc
calleclr2 ;очистка экрана
mova, #2 ;курсор в позицию 2
call ecur2
mov DPTR, #serr ;вывестинадпись «Error»
call prst2
pop acc
call prch2 ;выводномераошибки
ret
;сообщение «Error»
ORG 0680H
Serr: DB 14, 19, 19, 20, 19, 0 ;сообщение «Error», 0 в конце – признак окончания слова
;подпрограмма вывода Туст на ЖКИ №1
prtmu: mov a, #16
call prch1
mov a, bufLAN2
mov b, #10
div ab
call prch1
mov a, b
call prch1
mov a, #17
call prch
mov a, #0CH
call prch1
ret
;подпрограмма с длительностью выполнения примерно 3 мин. опроса клавиатуры и вывода Тпм
zader: mov R2, #7
za1: mov R1, #255
za2: mov R0, #56;
za3: mov LoopCnt, #255
za4: call Delay
djnz LoopCnt, za4
djnz R0, za3
call inkl ;опросклавиатуры
jnzza5 ;переход при нажатии
calleclr2 ;вывод Тпм
mov a, #2
call ecur2
call sttmp
call rdtmp
call prtmp
djnz R1, za2
djnz R2, za1
mov a, #0
ret
za5: mova, #1
ret
;подпрограмма запуска процесса измерения температуры
sttmp: pushpsw
movpsw, #bank2 ;выбор банка 2 памяти
stm1: callresLAN ;сброс
cjnea, #0, stm6 ;если ошибка переход
mov a, #0CCH ;пропускПЗУ
call wr8LAN
mov a, #44H ;запускпреобразования
call wr8LAN
stm4: callrd1LAN ;запрос об окончании преобразования
jnestm4 ;если не готово / повторить
stm5: poppsw ;выход из подпрограммы
ret
stm6: callprErr ;если ошибка, печать
jmpstm1 ;перейти в начало
;подпрограмма чтения температуры
;выходные параметры – температура в bufLAN - младший байт, в bufLAN+1 - старший байт
rdtmp: pushpsw
movpsw, #bank2 ;выбор банка 2 памяти
callresLAN ;вызов процедуры сброса
cjnea, #0, rtm2 ;если ошибка
mov a, #0CCH ;пропускПЗУ
call wr8LAN
mov a, #0BEH ;выдатькоманду
call wr8LAN
call rd8LAN ;чтениемладшегобайта
mov bufLAN, a ;записьвбуфер
callrd8LAN ;чтение старшего байта
movbufLAN+1, a ;запись в буфер
poppsw ;завершение программы
ret
rtm2: callprErr ;если ошибка, вывести на экран
jmprtm1 ;перейти в начало
;подпрограмма формирования сигнала начального сброса
resLAN:clrP1.1 ;закорачиваем линию
movLoopCnt, #100 ;задержка 700 мкс
rst1: call Delay
djnz LoopCnt, rst1
setb P1.1 ;отпускаемлинию
mov LoopCnt, #9 ;задержка 65 мкс
rst2: call Delay
djnz LoopCnt, rst2
jnbP1.1, rst3 ;проверка сигнала присутствия
mova, #1 ;код ошибки «нет датчика»
ret
rst3: mov LoopCnt, #71 ;задержка 500 мкс
rst4: call Delay
djnz LoopCnt, rst4
jbP1.1, rst5 ;если на линии 1 переход
mova, #2 ;код ошибки «КЗ в линии»
ret
rst5: mova, #0 ;код нормального завершения
ret
;подпрограмма чтения слота (через признак переноса)
mrslot: clrP1.1 ;закоротить линию
nop
setbP1.1 ;отпустить линию
callDelay ;задержка 13 мкс
callDelay
nop
nop
nop
movC, P1.1 ;прочитать и сохранить бит
mov LoopCnt, #8 ;задержка 60 мкс
msl1: call Delay
djnzLoopCnt, msl1
ret
;подпрограмма записи 0 в слот
mwlow: clrP1.1 ;закоротить линию
movLoopCnt, #11 ;задержка 80 мкс
mwl1: call Delay
djnz LoopCnt, mwl1
setbP1.1 ;отпустить линию
ret
;подпрограмма записи 1 в слот
mwhi: clrP1.1 ;закоротить линию
callDelay ;задержка 5 мкс
setbP1.1 ;отпустить линию
movLoopCnt, #11 ;задержка 75 мкс
mwh1: call Delay
djnz LoopCnt, mwh1
ret
;процедура задержки 5 мкс (при тактовой частоте 12МГц)
Delay: nop
ret
;программа записи байта через аккумулятор
wr8LAN:
movR1, #8 ;инициализация счетчика разрядов
wb1: rrcA ;младший бит в C
jcwb2 ;если текущий бит = 0
callmwlow ;запись 0 в слот
jmpwb3
wb2: callmwhi ;запись 1 в слот
wb3: djnzR1, wb1 ;продолжать, если не последний
ret
;подпрограмма записи бита, который передается через С
wr1LAN:
jcwb4 ;если бит = 0
callmwlow ;запись 0 в слот
jmpwb5
wb4: callmwhi ;запись 1 в слот
wb5:
ret
;подпрограмма чтения байта
rd8LAN:
movR1, #8 ;счетчик количества битов
rb1: callmrslot ;чтение очередного бита
rrcA ;сдвиг битов младшим разрядом вперед
djnzR1, rb1 ;продолжать, если не последний
ret
;подпрограмма чтения бита
rd1LAN:
call mrslot
ret
;выводТпмнаЖКИ №2
prtmp: mov a, #16 ;выводпробела
call prch2
mova, bufLAN+1 ;считываем старший байт
swapa ;обмен тетрад
anla, #0F0H ;получили старший полубайт
movR5, a ;временно записываем в R5
mova, bufLAN ;считываем младший байт
swapa ;обмен тетрад
anla, #0FH ;получили младший полубайт
adda, R5 ;складываем полубайты
movb, #10 ;деление на 10
divab
callprch2 ;вывод десятков
mova, b ;берем остаток от деления
callprch2 ;вывод единиц
mova, #17 ;вывод символа «градус»
call prch2
mov a, #0CH ;выводбуквы «С»(Цельсия)
call prch2
ret
;подпрограмма режима охлаждения
reoh: clrP0.2 ;выкл. Нагревательный элемент
setbP0.4 ;вкл. компрессор
setbP0.3 ;вкл. вентелятор
callzader
jzre4 ;переход при нажатой клавише
ret
re4: clrP0.4 ;выкл. компрессор
clrP0.3 ;выкл. вентелятор
callzader
jzre3 ;переход при нажатой клавише
ret
re3: mov a, bufLAN+1
swap a
anl a, #0F0H
mov R5, a
mov a, bufLAN
swap a
anl a, #0FH
adda, R5 ;в аккумуляторе байт Тпм
mov b, bufLAN2
mov b, #b-2
mova, #LE(a, b) ;сравнение Тпм<=Туст-2
cjnea, #0FFFFH, re1 ;переход, если не истина
incbufLAN3 ;счетчик циклов режима увеличить на 1
mova, #GT(bufLAN3, 2)
cjnea, #0FFFFH, re2 ;сравнение «счетчик циклов>=2»
movbufLAN3, #0 ;обнуление счетчика
mova, #4 ;в режим обогрева
ret
re1: movbufLAN3, #0 ;обнуление счетчика
re2: mova, #5 ;режим охлаждения
ret
;конец программы
end