Приложение 1 ;основная программа
bank0 EQU 00000000B;коды банков памяти bank1 EQU 00001000B bank1 EQU 00010000B bank2 EQU 00110000B DSEG ORG 30H LoopCnt: DS 1 ;счетчик задержки bufLAN: DS 8 ;буфер для приема данных из MicroLAN bufLAN2: DS 8 ;буфер для Туст bufLAN3: DS 1 ;счетчик рабочих циклов кондиционера ORG 60H ;начало стека stack: DS 20H ;глубина стека main: mov bufLAN2, #18H ;начальное значение Туст=24 градуса Цельсия call inkl jz in3 ;если клавиши не нажаты переход in1: cjne a, #11B, in2 ;если обе клавиши нажаты переход inc bufLAN ;Туст увеличить на 1 jmp in3 in2: dec bufLAN2 in3: call eclr1 ;вывод Туст mov a, #2 call ecur1 call prtmu ;Туст на ЖКИ №1 call eclr2 mov a, #2 call ecur2 call sttmp ;запуск преобразования Тпм call rdtmp ;чтение Тпм call prtmp ;вывод Тпм на ЖКИ №2 mov a, bufLAN+1 ;записьТпм в аккумулятор swap a anl a, #0F0H mov R5, a mov a, bufLAN swap a anl a, #0FH add a, R5 ;в аккумуляторе байт Тпм mov a, #LE(a, bufLAN2) ;сравнение Тпм<=Туст mov bufLAN3, #0 ;обнуление счетчика циклов работы кондиционера cjne a, #0FFFFH, in5 ;обработкаусловия Тпм<=Туст in4: call reob jmp in6 in5: call reoh in6: mov b, a mov a, EQ(b, #1) cjne a, #0FFFFH, in7 jmp in1 in7: mov a, EQ(b, #4) cjne a, #0FFFFH, in5 jmp in4 ;Подпрограмма ввода с клавиатуры (0 бит аккумулятора – за S2, 1 бит – за S1) inkl: setb P0.0 ;установка 1 на линиях клавиатуры setb P0.1 mov a, P0 ;считывание порта p0 anl a, #00000011B ;обнуление лишних разрядов
xrl a, #00000011B ;инвертирование ret ;подпрограмма сброса ЖКИ №1 eres1: mov P2, #0FH ;засылаем адрес регистра блокировки setb P2.4 clr P2.4 mov P2, #01000001B ;записываем код снятия блокировки setb P2.4 clr P2.4 mov P2, #0 ;устанавливаем адрес на первый разряд setb P2.4 clr P2.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 clr P3.4 ret ;подпрограмма очистки ЖКИ №1 eclr1: call eres1 ;сброс экрана mov P2, #01000000B ;установка управляющего кода mov R0, #20 ;инициализация счетчика разрядов c11: set P2.4 ;импульс записи clr P2.4 djnz R0, c11 ;оператор цикла ret ; подпрограмма очистки ЖКИ №2 eclr2: call eres2 mov P3, #01000000B mov R0, #20 c21: set P3.4 clr P3.4 djnz R0, c21 ret ;подпрограмма установки курсора для ЖКИ №1 по аккумулятору ecur1: anl a, #0FH ;отделяем биты адреса mov P2, a ;устанавливаем адрес на первый разряд setb P2.4 clr P2.4 ret ; подпрограмма установки курсора для ЖКИ №2 по аккумулятору ecur2: anl a, #0FH mov P3,a setb P3.4 clr P3.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: push DPL ;сохранение регистров в стеке push DPH push b mov DPTR, #ts ;начало таблицы символов 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 ;вкл. Режим вывода данных setb P2.4 ;импульс записи clr P2.4 pop b pop DPH ;восстановление регистров pop DPL ret ;подпрограмма вывода символа на ЖКИ №2 через аккумулятор prch2: push DPL ;сохранение регистров в стеке push DPH push b mov DPTR, #ts ;начало таблицы символов mov c, acc.7 ;сохраняем значение точки clr acc.7 ;сбрасываем значение бита movc a, @a+DPTR ;получаем выводимый код mov acc.4, c ;восстанавливаем значение точки mov b, a ;сохраняем его в b anl a, #0FH ;отделяем младший полубайт mov P3, a ;выводим его на индикатор setb P3.6 ;вкл. Режим вывода данных setb P3.4 ;импульс записи clr P3.4 mov a, b ;восстанавливаем выводимый код swap a anl a, #0FH ;отделяем старший полубайт mov P3, a ;выводим его на индикатор setb P3.6 ;вкл. Режим вывода данных setb P3.4 ;импульс записи clr P3.4 pop b pop DPH ;восстановление регистров pop DPL ret ;подпрограмма вывода сообщения на ЖКИ №2 prstr2: push psw ;сохранение регистра psw mov psw, #bank3 ;включаем банк 3 ps1: mov a, #0 movc a, @a+DPTR ;получение очередного символа cjne a, #0, ps2 ;если это не последний выводим pop psw ;завершение подпрограммы ret 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 ;вывод номера ошибки 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 ;опрос клавиатуры jnz za5 ;переход при нажатии call eclr2 ;вывод Тпм mov a, #2 call ecur2 call sttmp call rdtmp call prtmp djnz R1, za2 djnz R2, za1 mov a, #0 ret za5: mov a, #1 ret ;подпрограмма запуска процесса измерения температуры sttmp: push psw mov psw, #bank2 ;выбор банка 2 памяти stm1: call resLAN ;сброс cjne a, #0, stm6 ;если ошибка переход mov a, #0CCH ;пропуск ПЗУ call wr8LAN mov a, #44H ;запуск преобразования call wr8LAN stm4: call rd1LAN ;запрос об окончании преобразования jne stm4 ;если не готово / повторить stm5: pop psw ;выход из подпрограммы ret stm6: call prErr ;если ошибка, печать jmp stm1 ;перейти в начало ;подпрограмма чтения температуры ;выходные параметры – температура в bufLAN - младший байт, в bufLAN+1 - старший байт rdtmp: push psw mov psw, #bank2 ;выбор банка 2 памяти call resLAN ;вызов процедуры сброса cjne a, #0, rtm2 ;если ошибка mov a, #0CCH ;пропуск ПЗУ call wr8LAN mov a, #0BEH ;выдать команду call wr8LAN call rd8LAN ;чтение младшего байта mov bufLAN, a ;запись в буфер call rd8LAN ;чтение старшего байта mov bufLAN+1, a ;запись в буфер
pop psw ;завершение программы ret 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 ;код ошибки «нет датчика» ret rst3: mov LoopCnt, #71 ;задержка 500 мкс rst4: call Delay djnz LoopCnt, rst4 jb P1.1, rst5 ;если на линии 1 переход mov a, #2 ;код ошибки «КЗ в линии» ret rst5: mov a, #0 ;код нормального завершения ret ;подпрограмма чтения слота (через признак переноса) mrslot: clr P1.1 ;закоротить линию nop setb P1.1 ;отпустить линию call Delay ;задержка 13 мкс call Delay nop nop nop mov C, P1.1 ;прочитать и сохранить бит mov LoopCnt, #8 ;задержка 60 мкс msl1: call Delay djnz LoopCnt, msl1 ret ;подпрограмма записи 0 в слот mwlow: clr P1.1 ;закоротить линию mov LoopCnt, #11 ;задержка 80 мкс mwl1: call Delay djnz LoopCnt, mwl1 setb P1.1 ;отпустить линию ret ;подпрограмма записи 1 в слот mwhi: clr P1.1 ;закоротить линию call Delay ;задержка 5 мкс setb P1.1 ;отпустить линию mov LoopCnt, #11 ;задержка 75 мкс mwh1: call Delay djnz LoopCnt, mwh1 ret ;процедура задержки 5 мкс (при тактовой частоте 12МГц) Delay: nop ret ;программа записи байта через аккумулятор wr8LAN: mov R1, #8 ;инициализация счетчика разрядов wb1: rrc A ;младший бит в C jc wb2 ;если текущий бит = 0 call mwlow ;запись 0 в слот jmp wb3 wb2: call mwhi ;запись 1 в слот wb3: djnz R1, wb1 ;продолжать, если не последний ret ;подпрограмма записи бита, который передается через С wr1LAN: jc wb4 ;если бит = 0 call mwlow ;запись 0 в слот jmp wb5 wb4: call mwhi ;запись 1 в слот wb5: ret ;подпрограмма чтения байта rd8LAN: mov R1, #8 ;счетчик количества битов rb1: call mrslot ;чтение очередного бита rrc A ;сдвиг битов младшим разрядом вперед djnz R1, rb1 ;продолжать, если не последний
ret ;подпрограмма чтения бита rd1LAN: call mrslot ret ;вывод Тпм наЖКИ №2 prtmp: mov a, #16 ;вывод пробела call prch2 mov a, bufLAN+1 ;считываем старший байт swap a ;обмен тетрад anl a, #0F0H ;получили старший полубайт mov R5, a ;временно записываем в R5 mov a, bufLAN ;считываем младший байт swap a ;обмен тетрад anl a, #0FH ;получили младший полубайт add a, R5 ;складываем полубайты mov b, #10 ;деление на 10 div ab call prch2 ;вывод десятков mov a, b ;берем остаток от деления call prch2 ;вывод единиц mov a, #17 ;вывод символа «градус» call prch2 mov a, #0CH ;вывод буквы «С»(Цельсия) call prch2 ret ;подпрограмма режима охлаждения reoh: clr P0.2 ;выкл. Нагревательный элемент setb P0.4 ;вкл. компрессор setb P0.3 ;вкл. вентелятор call zader jz re4 ;переход при нажатой клавише ret re4: clr P0.4 ;выкл. компрессор clr P0.3 ;выкл. вентелятор call zader jz re3 ;переход при нажатой клавише ret re3: mov a, bufLAN+1 swap a anl a, #0F0H mov R5, a mov a, bufLAN swap a 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 ;в режим обогрева ret re1: mov bufLAN3, #0 ;обнуление счетчика re2: mov a, #5 ;режим охлаждения ret ;конец программы end
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|