;Program TERMO.ASM odczytuje temperature z ukladu "DS 1620" oraz umozliwia programowanie tego ukladu
;komunikacja, to klawiatura (3x4) oraz wyswietlacz na "SAA 1064" (dwie cyfry)
;Wyjście ZAMEK steruje klapą pieca CO
AZ1064 equ 70h ;adresy dla SAA 1064
AO1064 equ 71h
R_Termo equ 0aah ;COD odczytu temperatury z DS 1620, 9 bitow
R_TH equ 0a1h
R_TL equ 0a2h
R_CO equ 0ach
W_TH equ 1
W_TL equ 2
JASNO equ 40h
CIEMNO equ 10h
; Funkcje
SETHI equ 11
SETLO equ 10
LCZYN equ 1 ;jeden bajty konwersji
WL equ 20h ;lewy wyswietlacz
WP equ 21h ;prawy wyswietlacz
CONTR equ 22h ;dla SAA 1064
OLDK equ 23h
NEWK equ 5 ;R5
BUFTL equ 24h ;bufor Temperatury
BUFTH equ 25h ;
BufT equ 24h
BufL equ 26h
BufH equ 28h
BCD equ 2ah
RST bit p3.3 ;RST dla DS 1620
SCL bit p3.4
SDA bit p3.5
ZAMEK bit p3.7 ;sterowanie klapa
;=======================
org 0
clr RST
mov CONTR,#CIEMNO
Start:
; call Czyt_CO
call Czyt_TH
mov BufH,r7
mov BufH+1,r6
call Czyt_TL
mov BufL,r7
mov BufL+1,r6
acall Czyt_Termo ;wynik w [r6:r7]
mov BufT,r7
mov BufT+1,r6
call Porownaj
acall Wyswietlij
; mov WP,r7
; mov WL,r6
mov CONTR,#CIEMNO ;Disp ON
acall Ustaw
call KEY
mov a,NEWK
mov OLDK,a
jz Start
call PoFunkcje
jmp Start
call KOD_K
call TabKon
call WRL
mov a,NEWK
call KOD_K
call TabKon
call WRP
mov CONTR,#20h ;0 = Disp OFF
call Ustaw
Stop: ajmp Start
;============================
Porownaj: ;procedura porownuje odczytana temperature z rejestrami TL i TH
;i steruje odpowiednio wyjsciem ZAMEK
mov r0,#BufT
mov r1,#BufL
call R0_R1
jc T_L ;T<L
mov r0,#BufT
inc r1
call R0_R1
jnc T_H ;T>H
ret
R0_R1: clr c
mov a,@r0
subb a,@r1
inc r0
inc r1
mov a,@r0
subb a,@r1
ret
T_L: clr ZAMEK
ret
T_H: setb ZAMEK
ret
;============================
; Wybor Funkcji sterujacej, kod w ACC
PoFunkcje:
call KOD_K
cjne a,#SETHI,Nie1
mov a,#01110110b ;'H
call WRL
mov a,#00010000b ;'i
call WRP
call Ustaw
Po1: call GET_KEY
Po11: cjne a,#SETHI,Nie2
call Czyt_TH
call DoBufora
acall Wyswietlij
mov CONTR,#CIEMNO ;Disp ON
acall Ustaw
call KorBUF
jmp Po11
Nie1: cjne a,#SETLO,Nie2
mov a,#00111000b ;'L
call WRL
mov a,#01011100b ;'o
call WRP
call Ustaw
Po2: call GET_KEY
Po22: cjne a,#SETLO,Nie2
call Czyt_TL
call DoBufora
acall Wyswietlij
mov CONTR,#CIEMNO ;Disp ON
acall Ustaw
call KorBUF
jmp Po22
Nie2: cjne a,#4,NieOt
clr ZAMEK
call OPen
ret
NieOt: cjne a,#6,NieZa
setb ZAMEK
call CLose
NieZa: ret
;=========================
DISP_OFF:
mov CONTR,#0
call Ustaw
jmp GET_KEY
;=========================
OPen: mov a,#00111111b ;'O
call WRL
mov a,#01110011b ;'P
call WRP
call Ustaw
jmp GET_KEY
;=========================
CLose: mov a,#00111001b ;'C
call WRL
mov a,#00111000b ;'L
call WRP
call Ustaw
jmp GET_KEY
;=========================
; Procedura dodaje do bufora. Odejmuje od bufora
; 1 - 0,5 stopnia 7 - 0,5 stopnia
; 2 - 1,0 8 - 1,0
; 3 - 5,0 9 - 5,0
KorBUF: call GET_KEY
cjne a,#2,Nie3
mov a,#2 ;+1
call DodajBUF
KorB1: call OdBufora
acall Wyswietlij
mov CONTR,#JASNO ;Disp ON
acall Ustaw
jmp KorBUF
Nie3: cjne a,#8,Nie4
mov a,#2 ;-1
call MinusBUF
jmp KorB1
Nie4: cjne a,#SETLO,Nie5
mov a,CONTR
cjne a,#JASNO,Nie6 ;czy byla modyfikacja
call OdBufora
call Zap_TL
ret
Nie5: cjne a,#SETHI,Nie6
mov a,CONTR
cjne a,#JASNO,Nie6 ;czy byla modyfikacja
call OdBufora
call Zap_TH
Nie6: cjne a,#3,Nie7
mov a,#10 ;+5
call DodajBUF
jmp KorB1
Nie7: cjne a,#9,Nie8
mov a,#10 ;-5
call MinusBUF
jmp KorB1
Nie8: cjne a,#1,Nie9
mov a,#1 ;+0,5
call DodajBUF
jmp KorB1
Nie9: cjne a,#7,Nie10
mov a,#1 ;-0,5
call MinusBUF
jmp KorB1
Nie10: ret
;=========================
DodajBUF: ;dodaje ACC do BUFTn
add a,BUFTL
mov BUFTL,a
clr a
addc a,BUFTH
anl a,#1
mov BUFTH,a
ret
;=========================
MinusBUF: ;odejmuje od BUFTn ACC
clr c
xch a,BUFTL
subb a,BUFTL
mov BUFTL,a
clr a
xch a,BUFTH
subb a,BUFTH
anl a,#1
mov BUFTH,a
ret
;=========================
OdBufora:
mov r7,BUFTL
mov r6,BUFTH
ret
;=========================
DoBufora:
mov BUFTL,r7
mov BUFTH,r6
ret
;=========================
Wyswietlij:
mov a,r6
jnb acc.0,PLUS
mov a,r7
cpl a
inc a
mov r7,a
PLUS: clr c ;konwersja do calych stopni
mov a,r7
rrc a
mov r7,a
mov BIN,a
acall BBCD
mov a,BCD+1 ;wynik w BCD dwa bajty
swap a
acall TabKon
acall WRL
mov a,r6
mov c,acc.0 ;znak do CARY
mov WL.4,c ;znak do lewego wyswietlacza na "h"
mov a,BCD+1
acall TabKon
acall WRP
clr c
mov a,BCD
jz Normal
setb c
Normal: mov WP.7,c
ret
;============================
Ustaw: acall PStart
mov a,#AZ1064
acall NadAcc
jc POP1
mov a,#0 ;sub adres
acall NadAcc
jc POP1
mov a,CONTR
acall NadAcc
jc POP1
mov a,WP
acall NadAcc
jc POP1
mov a,WL
acall NadAcc
jc POP1
acall PStop
POP1: ret
;=========================
Stat_Disp:
acall PStart
mov a,#AO1064
acall NadAcc
jc POPERR
acall Odczyt
setb c
acall NadPot
mov r0,a
acall PStop
POPERR: ret
;=========================
Czyt_TH: ;odczyt Hi temperatury
setb RST
clr SCL
mov a,#R_TH
jmp Czyt_R
;=========================
Czyt_TL: ;odczyt Lo temperatury
setb RST
clr SCL
mov a,#R_TL
jmp Czyt_R
;=========================
Czyt_CO: ;odczyt Configuracji
setb RST
clr SCL
mov a,#R_CO
jmp Czyt_R
;=========================
Czyt_Termo: ;wynik znajduje sie w [r6:r7]
setb RST
clr SCL
mov a,#R_Termo
Czyt_R: acall Na_Acc
acall Od1620
mov r7,a
acall Od1620
mov r6,a
clr RST
ret
;============================
Zap_TH: ;zapis [r6:r7] do TL DS1620
setb RST
clr SCL
mov a,#W_TH
jmp Zap_R
;============================
Zap_TL: ;zapis [r6:r7] do TL DS1620
setb RST
clr SCL
mov a,#W_TL
Zap_R: call Na_Acc
mov a,r7
call Na_Acc
mov a,r6
call Na_Acc
ret
;============================
$include (Termo.a51)
;============================
end