;******************************************************************************
;*              LED Thermometer                                               *
;*              Taktfrequenz ~3MHz                                             *
;******************************************************************************

;Programm fr ein LED Thermometer mit Temperatursensor DS1621

.incld cop880.inc
.sect main,rom,abs=0

ASICHER = 00H
BSICHER = 01H
XSICHER = 02H
ZEITZAEHLER	= 03
STATUS		= 04	;0 = Sekunde
			;1 = Halbsekunde
			;2 = 
			;3 = 
			;4 = 
			;5 = 
			;6 = 
			;7 = 
TEMPLOW		= 05
TEMPHIGH	= 06
BUFFER		= 07
PSWSICHER	= 09
ANZEIGE1	= 0AH
ANZEIGE2	= 0BH
ANZEIGE3	= 0CH
ANZEIGE4	= 0DH
BUFFZEIGER	= 0EH

ZAEHLER		= 0F0H
WARTEN1		= 0F1H
WARTEN2		= 0F2H
ZEIT1		= 0F3H

;************************************************
;*              Initialisierung                 *
;************************************************
LAUF:
	LD      B,#0FDH         ;Clear Ram
RAM:    LD      [B],#0          ;
	DRSZ    B               ;
	JP      RAM             ;
	LD      0,#0            ;
	LD      PORTLC,#0FFH    ;Alle L-Pins als Ausgang Low
	LD      PORTLD,#0       ;
	LD      PORTCC,#0FFH    ;Alle C-Pins als Ausgang Low
	LD      PORTCD,#0       ;
	LD      PORTGC,#B'01111111;Alle G-Pins als Ausgang High
	LD	PORTGD,#B'01111111;
	LD      SP,#06FH        ;Stackpointer auf oberste Ramadresse
	LD	BUFFZEIGER,#ANZEIGE1
	JSR	CONFIG_1621	;DS1621 konfigurieren
	LD      B,#TMRLO        ;
	LD      [B+],#0E8H      ;1ms Interrupt
	LD      [B+],#03H       ;
	LD      [B+],#0E8H      ;
	LD      [B],#03H        ;
	SBIT    7,CNTRL         ;Timer Mode
	LD      PSW,#011H       ;Enable Timer-Interrupt
				;Enable General-Interrupt
	LD	ZEIT1,#250	;
	SBIT    4,CNTRL         ;Timer anschalten

;************************************************
;*		Hauptprogramm			*
;************************************************

				;DO FOREVER
LOOP:	JSR	STARTCONVERT	;   Temperaturmessung starten
LOOP2:	JSR	HALBGRAD	;   Halbe Grade anzeigen
	IFBIT	0,STATUS	;   IF Eine Sekunde vergangen
	JP	LOOP1		;
	JP	LOOP2		;
LOOP1:	RBIT	0,STATUS	;
	JSR	AUSLESEN	;   THEN DS1621 auslesen
	JSR	UMRECH		;        Ins LED-Format umrechnen
	JSR	BEREICH		;        Temperaturbereich anzeigen
	JP	LOOP		;   ENDIF
				;END DO FOREVER

;************************************************
;*		Nchste Spalte ansteuern	*
;************************************************

SPALTENSHIFT:
	LD	A,BUFFZEIGER	;
	IFEQ	A,#ANZEIGE4+1	;
	JP	SPA1		;
	JP	SPA2		;
SPA1:	LD	BUFFZEIGER,#ANZEIGE1
				;
				;
SPA2:	LD	PORTLD,#0	;Alle LED's ausschalten
	LD	B,#PORTGD
	SBIT	3,[B]		;
	SBIT	2,[B]		;
	SBIT	1,[B]		;
	SBIT	0,[B]		;
	LD	A,BUFFZEIGER	;
	IFEQ	A,#ANZEIGE1	;
	RBIT	0,[B]		;
	IFEQ	A,#ANZEIGE2	;
	RBIT	1,[B]		;
	IFEQ	A,#ANZEIGE3	;
	RBIT	2,[B]		;
	IFEQ	A,#ANZEIGE4	;
TEST:	RBIT	3,[B]		;
	LD	A,BUFFZEIGER	;
	X	A,B		;
	LD	A,[B]		;
	X	A,PORTLD	;
	LD	A,BUFFZEIGER	;
	INCA			;
	X	A,BUFFZEIGER	;
	RET


.=0FFH

;************************************************
;*              Interrupt                       *
;************************************************

	X       A,ASICHER       ;
	LD      A,B             ;
	X       A,BSICHER       ;
	RBIT	TPND,PSW	;Timer Pending Flag lschen
	LD	A,PSW		;
	X	A,PSWSICHER	;
	JSR	SPALTENSHIFT	;CALL 'Spaltenshift'
	DRSZ	ZEIT1		;
	JP	IT1		;
	LD	ZEIT1,#250	;
	SBIT	0,STATUS	;     SBIT Sekunde(0),Status
				;ENDIF
IT1:	LD	A,PSWSICHER	;
	X	A,PSW		;
	LD      A,BSICHER       ;
	X       A,B             ;
	LD      A,ASICHER       ;
	RETI

;************************************************
;*		Temperaturmessung starten	*
;************************************************

STARTCONVERT:
	SBIT	5,PORTGD	;Startbit
	RBIT	4,PORTGD	;
				;Adressbyte ausgeben
	LD	BUFFER,#B'00001001;
	JSR	DATENBYTE	;
	LD	BUFFER,#B'01110111;Command Byte fr 'Start Convert'
	JSR	DATENBYTE	;
	SBIT	5,PORTGD	;Clockpin High
	RBIT	4,PORTGD	;
	SBIT	4,PORTGD	;Datapin High	
	RET
	
;************************************************
;*		DS1621 konfigurieren		*
;************************************************

CONFIG_1621:
	SBIT	5,PORTGD	;Startbit
	RBIT	4,PORTGD	;
				;Adressbyte ausgeben
	LD	BUFFER,#B'00001001;
	JSR	DATENBYTE	;
	LD	BUFFER,#B'00110101;Command Byte fr 'Access Config'
	JSR	DATENBYTE	;
	LD	BUFFER,#B'11000000;Command Byte fr 'Single Conversion'
	JSR	DATENBYTE	;
	SBIT	5,PORTGD	;Clockpin High
	RBIT	4,PORTGD	;
	SBIT	4,PORTGD	;Datapin High	
	RET

;************************************************
;*		0.5C anzeigen			*
;************************************************

HALBGRAD:
	LD	A,ZEIT1		;
	IFGT	A,#125
	JP	BEREICH
	IFBIT	7,TEMPLOW	;
	JP	HALB		;
	JP	BEREICH		;
HALB:	RBIT	5,ANZEIGE4	;
	RBIT	6,ANZEIGE4	;
	RBIT	7,ANZEIGE4	;
	RET

;************************************************
;*	Temperaturbereich anzeigen		*
;************************************************

BEREICH:IFBIT	7,TEMPHIGH	;
	JP	UNTERNULL	;
	LD	A,TEMPHIGH	;
	IFGT	A,#29		;
	JP	UEBERDREISSIG	;
	SBIT	6,ANZEIGE4	;
	JP	BERE		;
UEBERDREISSIG:
	SBIT	7,ANZEIGE4	;
	JP	BERE		;
UNTERNULL:
	SBIT	5,ANZEIGE4	;
BERE:	RET

;************************************************
;*		DS1621 auslesen			*
;************************************************

;Clock = Pin G5
;Data  = Pin G4

AUSLESEN:
	SBIT	5,PORTGD	;Startbit
	RBIT	4,PORTGD	;
				;Adressbyte ausgeben
	LD	BUFFER,#B'00001001;
	JSR	DATENBYTE	;
	LD	BUFFER,#B'01010101;Command Byte fr 'Read Temperature'
	JSR	DATENBYTE	;
	SBIT	4,PORTGD	;Repeated Start Condition
	SBIT	5,PORTGD	;
	RBIT	4,PORTGD	;
	RBIT	5,PORTGD	;
	LD	BUFFER,#B'10001001;Adressbyte mit Read-Bit
	JSR	DATENBYTE	;
	RBIT	4,PORTGC	;Datapin auf Eingabe schalten
	SBIT	4,PORTGD	;
	JSR	EINLESEN	;Msbyte einlesen
	LD	A,BUFFER	;
	X	A,TEMPHIGH	;und in 'Temphigh' abspeichern
	RBIT	4,PORTGD	;Ack ausgeben
	SBIT	4,PORTGC	;
	SBIT	5,PORTGD	;
	RBIT	5,PORTGD	;
	RBIT	4,PORTGC	;Datapin auf Eingabe schalten
	SBIT	4,PORTGD	;
	JSR	EINLESEN	;Lsbyte einlesen
	LD	A,BUFFER	;
	X	A,TEMPLOW	;und in 'Templow' abspeichern
	SBIT	4,PORTGD	;Nack ausgeben
	SBIT	4,PORTGC	;
	SBIT	5,PORTGD	;
	RBIT	5,PORTGD	;
	RBIT	4,PORTGD	;
	SBIT	5,PORTGD	;Stopbedingung
	SBIT	4,PORTGD	;
	RET

;************************************************
;*		Ein Byte einlesen		*
;************************************************

EINLESEN:
	SBIT	5,PORTGD	;
	LD	BUFFER,#0	;
	IFBIT	4,PORTGP	;
	SBIT	7,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	6,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	5,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	4,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	3,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	2,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	1,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	SBIT	5,PORTGD	;
	IFBIT	4,PORTGP	;
	SBIT	0,BUFFER	;
	RBIT	5,PORTGD	;
	NOP			;
	RET			;

;************************************************
;*		Datenbyte ausgeben		*
;************************************************

DATENBYTE:
	LD	ZAEHLER,#8	;Zhler = 8
				;DO UNTIL Zhler = 0
DATEN:	RBIT	5,PORTGD	;   Clock auf Low
	LD	A,BUFFER	;   Schiebe 'Buffer' rechts ins Carry
	RRC	A		;
	X	A,BUFFER	;
	IFNC			;   IF Carry   
	JP	DATLOW		;
DATHIGH:SBIT	4,PORTGD	;   THEN Datapin = High
	JP	CLOCKEN		;
DATLOW:	RBIT	4,PORTGD	;   ELSE Datapin = Low
				;   ENDIF
CLOCKEN:SBIT	5,PORTGD	;   Clockpin = High
	DRSZ	ZAEHLER		;   Zhler = Zhler - 1
	JP	DATEN		;END DO UNTIL
	RBIT	5,PORTGD	;Clockpin = Low
	SBIT	4,PORTGD	;Datapin = High
	SBIT	5,PORTGD	;Clockpin = High
	RBIT	5,PORTGD	;Clockpin = Low
	RBIT	4,PORTGD	;Datapin = Low
	RET
	

;************************************************
;*	Ins LED-Format umrechnen		*
;************************************************

ANSPRINGEN:
	IFEQ	A,#0
	JP	A0
	IFEQ	A,#1
	JP	A1
	IFEQ	A,#2
	JP	A2
	IFEQ	A,#3
	JP	A3
	IFEQ	A,#4
	JP	A4
	IFEQ	A,#5
	JP	A5
	IFEQ	A,#6
	JP	A6
	IFEQ	A,#7
	JP	A7
	IFEQ	A,#8
	JP	A8
	IFEQ	A,#9
	JP	A9
	IFEQ	A,#10
	JP	A10
	IFEQ	A,#11
	JP	A11
	IFEQ	A,#12
	JP	A12
	IFEQ	A,#13
	JP	A13
	IFEQ	A,#14
	JP	A14
	IFEQ	A,#15
	JP	A15
	IFEQ	A,#16
	JP	A16
	IFEQ	A,#17
	JP	A17
	IFEQ	A,#18
	JP	A18
	IFEQ	A,#19
	JP	A19
	IFEQ	A,#20
	JP	A20
	IFEQ	A,#21
	JP	A21
	IFEQ	A,#22
	JP	A22
	IFEQ	A,#23
	JP	A23
	IFEQ	A,#24
	JP	A24
	IFEQ	A,#25
	JP	A25
	IFEQ	A,#26
	JP	A26
	IFEQ	A,#27
	JP	A27
	IFEQ	A,#28
	JP	A28
	JP	A29

A29:	LD	[B-],#B'00011111
	LD	[B-],#B'11111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A28:	LD	[B-],#B'00001111
	LD	[B-],#B'11111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A27:	LD	[B-],#B'00000111
	LD	[B-],#B'11111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A26:	LD	[B-],#B'00000011
	LD	[B-],#B'11111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A25:	LD	[B-],#B'00000001
	LD	[B-],#B'11111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A24:	LD	[B-],#B'00000000
	LD	[B-],#B'11111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A23:	LD	[B-],#B'00000000
	LD	[B-],#B'01111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A22:	LD	[B-],#B'00000000
	LD	[B-],#B'00111111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A21:	LD	[B-],#B'00000000
	LD	[B-],#B'00011111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A20:	LD	[B-],#B'00000000
	LD	[B-],#B'00001111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A19:	LD	[B-],#B'00000000
	LD	[B-],#B'00000111	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A18:	LD	[B-],#B'00000000
	LD	[B-],#B'00000011	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A17:	LD	[B-],#B'00000000
	LD	[B-],#B'00000001	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A16:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'11111111
	LD	[B],#B'11111111
	RET
A15:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'01111111
	LD	[B],#B'11111111
	RET
A14:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00111111
	LD	[B],#B'11111111
	RET
A13:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00011111
	LD	[B],#B'11111111
	RET
A12:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00001111
	LD	[B],#B'11111111
	RET
A11:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000111
	LD	[B],#B'11111111
	RET
A10:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000011
	LD	[B],#B'11111111
	RET
A9:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000001
	LD	[B],#B'11111111
	RET
A8:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'11111111
	RET
A7:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'01111111
	RET
A6:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00111111
	RET
A5:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00011111
	RET
A4:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00001111
	RET
A3:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00000111
	RET
A2:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00000011
	RET
A1:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00000001
	RET
A0:	LD	[B-],#B'00000000
	LD	[B-],#B'00000000	
	LD	[B-],#B'00000000
	LD	[B],#B'00000000
	RET


UMRECH:	LD	B,#ANZEIGE4
	IFBIT	7,TEMPHIGH
	JP	MINUSGRADE
	LD	A,TEMPHIGH
	IFGT	A,#59
	JP	TEMPERROR
	IFGT	A,#29
	JP	MINUS30
	JP	ANSPRINGEN
MINUS30:SC
	SUBC	A,#30
	JP	ANSPRINGEN

MINUSGRADE:
	LD	A,TEMPHIGH
	XOR	A,#0FFH
	IFBIT	7,TEMPLOW
	JP	MINU1
	ADD	A,#1
MINU1:	IFGT	A,#29
	JP	TEMPERROR
	JP	ANSPRINGEN


TEMPERROR:
	RET


;************************************************
;*		Eine Sekunde warten		*
;************************************************

WARTEN:	LD	WARTEN2,#66
	LD	WARTEN1,#0FFH
WA1:	DRSZ	WARTEN1
	JP	WA1
	DRSZ	WARTEN2
	JP	WA1
	RET

.end LAUF


