mov c, acc.7 ;сохраняем значение точки
clr acc.7 ;сбрасываем значение бита
movc a, @a+DPTR ;получаем выводимый код
mov acc.4, c ;восстанавливаем значение точки
mov b, a ;сохраняем его в b
anl a, #0FH ;отделяем младший полубайт
mov P2, a ;выводим его на индикатор
setb P2.6 ;вкл. Режим вывода данных
setb P2.4 ;импульс записи
clr P2.4
mov a, b ;восстанавливаем выводимый код
swap a
anl a, #0FH ;отделяем старший полубайт
mov p2, a ;выводим его на индикатор
setb p2.6 ;вкл. Режим вывода данных
pop b
pop DPH ;восстановление регистров
pop DPL
ret
;подпрограмма вывода символа на ЖКИ №2 через аккумулятор
prch2: push DPL ;сохранение регистров в стеке
push DPH
push b
mov DPTR, #ts ;начало таблицы символов
mov P3, a ;выводим его на индикатор
setb P3.6 ;вкл. Режим вывода данных
setb P3.4 ;импульс записи
clr P3.4
;подпрограмма вывода сообщения на ЖКИ №2
prstr2: push psw ;сохранение регистра psw
mov psw, #bank3 ;включаем банк 3
ps1: mov a, #0
movc a, @a+DPTR ;получение очередного символа
cjne a, #0, ps2 ;если это не последний выводим
pop psw ;завершение подпрограммы
ps2: call prch2 ;вывод символа на экран
inc DPTR ;увеличиваем значение указателя
jmp ps1
;подпрограмма вывода сообщения об ошибке
prErr: push acc
call eclr2 ;очистка экрана
mov a, #2 ;курсор в позицию 2
call ecur2
mov DPTR, #serr ;вывести надпись «Error»
call prst2
pop acc
call prch2 ;вывод номера ошибки
;сообщение «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
mov a, b
mov a, #17
call prch
mov a, #0CH
;подпрограмма с длительностью выполнения примерно 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 ;опрос клавиатуры
jnz za5 ;переход при нажатии
call eclr2 ;вывод Тпм
mov a, #2
call sttmp
call rdtmp
call prtmp
djnz R1, za2
djnz R2, za1
mov a, #0
za5: mov a, #1
;подпрограмма запуска процесса измерения температуры
sttmp: push psw
mov psw, #bank2 ;выбор банка 2 памяти
stm1: call resLAN ;сброс
cjne a, #0, stm6 ;если ошибка переход
mov a, #0CCH ;пропуск ПЗУ
call wr8LAN
mov a, #44H ;запуск преобразования
stm4: call rd1LAN ;запрос об окончании преобразования
jne stm4 ;если не готово / повторить
stm5: pop psw ;выход из подпрограммы
stm6: call prErr ;если ошибка, печать
jmp stm1 ;перейти в начало
;подпрограмма чтения температуры
;выходные параметры – температура в bufLAN - младший байт, в bufLAN+1 - старший байт
rdtmp: push psw
call resLAN ;вызов процедуры сброса
cjne a, #0, rtm2 ;если ошибка
mov a, #0BEH ;выдать команду
call rd8LAN ;чтение младшего байта
mov bufLAN, a ;запись в буфер
call rd8LAN ;чтение старшего байта
mov bufLAN+1, a ;запись в буфер
pop psw ;завершение программы
rtm2: call prErr ;если ошибка, вывести на экран
jmp rtm1 ;перейти в начало
;подпрограмма формирования сигнала начального сброса
resLAN:clr P1.1 ;закорачиваем линию
mov LoopCnt, #100 ;задержка 700 мкс
rst1: call Delay
djnz LoopCnt, rst1
setb P1.1 ;отпускаем линию
mov LoopCnt, #9 ;задержка 65 мкс
rst2: call Delay
djnz LoopCnt, rst2
jnb P1.1, rst3 ;проверка сигнала присутствия
mov a, #1 ;код ошибки «нет датчика»
rst3: mov LoopCnt, #71 ;задержка 500 мкс
rst4: call Delay
djnz LoopCnt, rst4
jb P1.1, rst5 ;если на линии 1 переход
mov a, #2 ;код ошибки «КЗ в линии»
rst5: mov a, #0 ;код нормального завершения
;подпрограмма чтения слота (через признак переноса)
mrslot: clr P1.1 ;закоротить линию
nop
setb P1.1 ;отпустить линию
call Delay ;задержка 13 мкс
call Delay
mov C, P1.1 ;прочитать и сохранить бит
mov LoopCnt, #8 ;задержка 60 мкс
msl1: call Delay
djnz LoopCnt, msl1
;подпрограмма записи 0 в слот
mwlow: clr P1.1 ;закоротить линию
mov LoopCnt, #11 ;задержка 80 мкс
mwl1: call Delay
djnz LoopCnt, mwl1
;подпрограмма записи 1 в слот
mwhi: clr P1.1 ;закоротить линию
call Delay ;задержка 5 мкс
mov LoopCnt, #11 ;задержка 75 мкс
mwh1: call Delay
djnz LoopCnt, mwh1
;процедура задержки 5 мкс (при тактовой частоте 12МГц)
Delay: nop
;программа записи байта через аккумулятор
wr8LAN:
mov R1, #8 ;инициализация счетчика разрядов
wb1: rrc A ;младший бит в C
jc wb2 ;если текущий бит = 0
call mwlow ;запись 0 в слот
jmp wb3
wb2: call mwhi ;запись 1 в слот
wb3: djnz R1, wb1 ;продолжать, если не последний
;подпрограмма записи бита, который передается через С
wr1LAN:
jc wb4 ;если бит = 0
jmp wb5
wb4: call mwhi ;запись 1 в слот
wb5:
;подпрограмма чтения байта
rd8LAN:
mov R1, #8 ;счетчик количества битов
rb1: call mrslot ;чтение очередного бита
rrc A ;сдвиг битов младшим разрядом вперед
djnz R1, rb1 ;продолжать, если не последний
;подпрограмма чтения бита
rd1LAN:
call mrslot
;вывод Тпм наЖКИ №2
prtmp: mov a, #16 ;вывод пробела
call prch2
mov a, bufLAN+1 ;считываем старший байт
swap a ;обмен тетрад
anl a, #0F0H ;получили старший полубайт
mov R5, a ;временно записываем в R5
mov a, bufLAN ;считываем младший байт
anl a, #0FH ;получили младший полубайт
add a, R5 ;складываем полубайты
mov b, #10 ;деление на 10
call prch2 ;вывод десятков
mov a, b ;берем остаток от деления
call prch2 ;вывод единиц
mov a, #17 ;вывод символа «градус»
mov a, #0CH ;вывод буквы «С»(Цельсия)
;подпрограмма режима охлаждения
reoh: clr P0.2 ;выкл. Нагревательный элемент
setb P0.4 ;вкл. компрессор
setb P0.3 ;вкл. вентелятор
call zader
jz re4 ;переход при нажатой клавише
re4: clr P0.4 ;выкл. компрессор
clr P0.3 ;выкл. вентелятор
jz re3 ;переход при нажатой клавише
re3: mov a, bufLAN+1
anl a, #0F0H
mov R5, a
mov a, bufLAN
anl a, #0FH
add a, R5 ;в аккумуляторе байт Тпм
mov b, bufLAN2
mov b, #b-2
mov a, #LE(a, b) ;сравнение Тпм<=Туст-2
cjne a, #0FFFFH, re1 ;переход, если не истина
inc bufLAN3 ;счетчик циклов режима увеличить на 1
mov a, #GT(bufLAN3, 2)
cjne a, #0FFFFH, re2 ;сравнение «счетчик циклов>=2»
mov bufLAN3, #0 ;обнуление счетчика
mov a, #4 ;в режим обогрева
re1: mov bufLAN3, #0 ;обнуление счетчика
re2: mov a, #5 ;режим охлаждения
;конец программы
end
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9