; ADLM34.ASM
; READ AN LM34 AT THE ANALOG INPUT AND DISPLAY THE TEMPERATURE IN FAHRENHEIT
	ORG	8000H		;MUST ALWAYS BE ORG'ED AT 8000H FOR SBC-1
ADLM34:	CLR	C		;(C3 HEX) NEEDED ONLY IF USING AUTOBOOT
REPEAT:	CALL	57H		;ANALOG TO DIGITAL ROUTINE IN JUMP TABLE
	CALL	CONVERT		;CONVERT ANALOG VALUE TO TEMPERATURE IN TABLE
	CALL	TXDEC		;SEND VALUE IN ACC TO THE TERMINAL
	CALL	42H		;SEND CR/LF ROUTINE IN JUMP TABLE
	JMP	REPEAT		;KEEP READING AND DISPLAYING


CONVERT:
	MOV	DPTR,#LM34TBL	;POINT TO TABLE OF CONVERSION VALUES
	MOVC	A,@A+DPTR	;GET TEMPERATURE INTO ACC
	RET

; TABLE OF 8 BIT ANALOG VALUE AND LM34 TEMPERATURES
; TABLE MUST START AT ZERO EVEN IF TEMPERATURE WILL NEVER BE THAT LOW
; TEMPERATURES CAN BE REMOVED FROM THE END IF THEY WILL NEVER BE THAT HIGH
LM34TBL:
DB	0,1,2,4,6,8,10,12,14,16,18,20,22,24,25,27,29,31,33,35,37,39
DB	41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,74,76,78
DB	80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112
DB	114,116,118,120,122,123,125,127,129,131,133,135,137,139,141
DB	143,145,147,149,151,153,155,157,159,161,163,165,167,169,171,172
DB	174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204
DB	206,208,210,212,214,216,218,220,221,223,225,227,229,231,233,235
DB	237,239,241,243,245,247,249,251,253,255


	; SEND DECIMAL VALUE IN ACC TO THE TERMINAL AS 3 ASCII DIGITS
TXDEC:	MOV	B,A		;SAVE VALUE IN B
	ADD	A,#56D		;256-200=56
	JNC	TXDL2		;VALUE <200 IF NO CARRY
	MOV	A,B		;GET VALUE AGAIN
	CLR	C		;NEEDED FOR SUBTRACTION
	SUBB	A,#200		;SUBTRACT 200 FROM REAL VALUE
	MOV	B,A		;SAVE VALUE IN B
	MOV	A,#'2'		;SEND A TWO FOR HUNDREDS
	JMP	TXDL0

TXDL2:	MOV	A,B		;GET VALUE AGAIN
	ADD	A,#156D		;256-100=56
	JNC	TXDL1		;VALUE <100 IF NO CARRY
	MOV	A,B		;GET VALUE AGAIN
	CLR	C		;NEEDED FOR SUBTRACTION
	SUBB	A,#100		;SUBTRACT 100 FROM REAL VALUE
	MOV	B,A		;SAVE VALUE IN B
	MOV	A,#'1'		;SEND A ONE FOR HUNDREDS
	JMP	TXDL0

TXDL1:	MOV	A,#'0'		;SEND A ZERO FOR HUNDREDS

TXDL0:	CALL	3CH		;DISPLAY CHARACTER ROUTINE IN JUMP TABLE
	MOV	A,B		;GET VALUE AGAIN
	MOV	B,#10		;DIVIDE BY VALUE BY 10
	DIV	AB		;ONES IN B, TENS IN A
	PUSH	B		;SAVE ONES DIGIT
	ADD	A,#30H		;ADD THE ASCII CHARACTER OFFSET
	CALL	3CH		;DISPLAY CHARACTER ROUTINE IN JUMP TABLE
	POP	ACC		;RESTORE ONES DIGIT
	ADD	A,#30H		;ADD THE ASCII CHARACTER OFFSET
	CALL	3CH		;DISPLAY CHARACTER ROUTINE IN JUMP TABLE
	RET

	END			;NEEDED BY MANY ASSEMBLER PROGRAMS
