Разработка термометра с автоматическим контролем температуры на базе микроконтроллера AТ90S2313 с применением термостата DS1620
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
def keyc=r21;Счетчик для прграммы обработки нажатия клавиши
.defTMIN=r22;ячейка с содержимым минимальной температуры термостата
.defTMINL=r22;младший
.defTMINH=r23;старший
.defTMAX=r24;ячейка с содержимым максимальной температуры термостата
.defTMAXL=r24;младший
.defTMAXH=r25;старший
.defTNORM=r26;ячейка с содержимым текущей температуры термостата
.defTNORML=r26;младший
.defTNORMH=r27;старший
.equDLCD=$66;стартовый адрес SRAM для буфера индикатора
;маладшая ячейка соответствует левому символу
;на дисплее
.def fbinL =r16;двоичное значение, младший байт
.def fbinH =r17;двоичное значение, старший байт
;биты портов
.equ K1=3;бит первой кнопки
.equ K2=4;бит второй кнопки
.equ K3=5;бит третьей кнопки
.equ WR1=5;бит WR1
.equ WR2=6;бит WR2
.equ A0=7;бит A0
.equ DQ=0;бит DQ канал данных термостата
.equ CLK=1;бит CLK канал синхронизации данных
;*************************************************************************
;*
;* PROGRAM START - программа начинает выполняться с этого места
;*
;*************************************************************************
.cseg
.org $0000
rjmp RESET;Reset handle
.org $0020
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
;*************************************************************************
; настройка констант
SETCONST:
lditemp,20
movTMINL,temp
lditemp,0
movTMINH,temp
lditemp,25
movTMAXL,temp
lditemp,0
movTMAXH,temp
ret
;*************************************************************************
; передача констант
OUTCONST:
movtemp,TMINl
movtemp1,TMINH
lditemp2,2;запись нижней температуры
rcallTERMOUT2
movtemp,TMAXL
movtemp1,TMAXH
lditemp2,1;запись нижней температуры
rcallTERMOUT2
lditemp1,0xee; инициализация термостата
rcallTERMOUT1
ret
;*************************************************************************
; Натройка портов ввода вывода
port_set:
ldi result,$ff;PORTB настраивается на вывод
out DDRB,result;для работы с индикатором
ldi result,$00;все биты устанавливаются в ноль
out PORTB,result;PORTD настраивается для работы
ldi result,0b01000011; с клавиатурой и
out DDRD,result;микросхемой термометра
ldi result,0b11111001; с клавиатурой и
out PORTD,result;микросхемой термометра
ret
;*************************************************************************
;*очистка буфера ЖКИ
CLRLCD:
ldiramsize,10;очистка буфера индикатора
lditemp,0
ldiZH,high(DLCD)
ldiZL,low(DLCD)
clrlcdloop:
stZ+,temp
decramsize
brneclrlcdloop;если не закончили повторить
rjmpLCDOUT
;*************************************************************************
; Вывод содержимого буфера на индикатор
LCDOUT:
lditemp,low(DLCD);установить Z как указатель на буфер
movZL,temp;индикатора
lditemp,high(DLCD)
movZH,temp
ldiramsize,10
LCDOUT1:
movtemp,ramsize;запись в индикатор адреса символа
anditemp,0b00001111
outPORTB,temp
cbiPORTB,A0
sbiPORTB,WR1
cbiPORTB,WR1
ldtemp1,Z+; получить байт из DLCD
movtemp,temp1
anditemp,0b00001111;получить младшую тетраду
sbrstemp,A0
outPORTB,temp
sbiPORTB,WR1
cbiPORTB,WR1
movtemp,temp1
swaptemp
anditemp,0b00001111;получить старшую тетраду
sbrstemp,A0
outPORTB,temp
sbiPORTB,WR1
cbiPORTB,WR1
decramsize;
brneLCDOUT1;если не закончили повторить
ret
;*************************************************************************
;*вывод готовой строки в буфер и вывод буфера на ЖКИ
;* temp - номер строки
;* ramsize - количество выводимых символов
STRLCDD:
ldiYH,high(tcstr)
ldiYL,low(tcstr)
addtemp,temp
addtemp,temp
addYL,temp
ldiramsize,4
;*************************************************************************
;*вывод готовой строки в буфер и вывод буфера на ЖКИ
;* Y - указатель на строку temp - положение
;* ramsize - количество выводимых символов
STRLCD:
ldiZH,high(DLCD)
ldiZL,low(DLCD)
strtolcdloop:
ldtemp,Y+
stZ+,temp
decramsize
brnestrtolcdloop;если не закончили повторить
rjmpLCDOUT
;*************************************************************************
;* получение данных из термостата
;* temp2 - команда temp - первые 8 бит temp1 - 9-ый бит
TERMIN:
ldiramsize,8
terminloop:
sbiPIND,DQ
sbrctemp2,0
cbiPIND,DQ
sbiPIND,CLK
cbiPIND,CLK
rortemp2
decramsize
brneterminloop;если не закончили повторить
ldiramsize,0x8
sbiDDRD,DQ
termindloop:
sbiPIND,DQ
sbrctemp,0
cbiPIND,DQ
sbiPIND,CLK
cbiPIND,CLK
rortemp2
decramsize
brnetermindloop;если не закончили повторить
sbiPIND,DQ
sbrctemp1,0
cbiPIND,DQ
sbiPIND,CLK
cbiPIND,CLK
cbiDDRD,DQ
ret
;*************************************************************************
;*передача одного байта данных на термостат
;* temp2 - команда
TERMOUT1:
ldiramsize,8
termout1loop:
sbiPIND,DQ
sbrctemp2,0
cbiPIND,DQ
sbiPIND,CLK
cbiPIND,CLK
rortemp2
decramsize
brnetermout1loop;если не закончили повторить
ldiramsize,0x8
ret
;*************************************************************************
;*передача одного байта данных на термостат и 9 бит
;* temp2 - команда temp - первые 8 бит temp1 - 9-ый бит
TERMOUT2:
ldiramsize,8
termout2loop:
sbiPIND,DQ
sbrctemp2,0
cbiPIND,DQ
sbiPIND,CLK
cbiPIND,CLK
rortemp2
decramsize
brnetermout2loop;если не закончили повторить
ldiramsize,0x8
termout2loopdat:
clc
sbiPIND,CLK
sbicPIND,DQ
sec
cbiPIND,CLK
rortemp2
decramsize
brnetermout2loopdat;если не закончили повторить
lditemp1,0
sbiPIND,CLK
sbicPIND,DQ
lditemp1,1
cbiPIND,CLK
cbiDDRD,DQ
ret
;*************************************************************************
;*получение кода нажатой клавиши если она нажата более 20 мс
;* код кнопки находится в регистре key если сброшен бит Z
KEYPRESS:
lditemp1,20;количество попыток для гашения
;дребезга контактов
keyloop:
intemp,PIND
anditemp,0b00111000
breqkeynopress
sbicPIND,K1
ldikey,1
sbicPIND,K2
ldikey,2
sbicPIND,K3
ldikey,3
dectemp1
brnekeyloop;если не закончили повторить
keynopress:
andkey,key
ret
;*************************************************************************
;*ожидание отпускания клавиши
KEYUP:
lditemp1,20;количество попыток для гашения
;дребезга контактов
keyuloop:
intemp,PIND
anditemp,0b001110000
brequnpress
dectemp1
brneKEYUP;если не закончили повторить
unpress:
andkey,key
ret
;**********************************************************