⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd24.asm

📁 DS1820 1-wire temp sensor AVR asm Program
💻 ASM
字号:
;************************************************
;* Main Program LCD Temperature & Clock		*
;* Readout Unit					*
;*						*
;* Copyright 2001-2003 Wayne Peacock		*
;* First Revision  19/06/2001			*
;* Second Revision 02/03/2002			*
;*	* Add Upload of Time - Working		*
;*	* Add Toggle to Backlight Button	*
;* Third Revision  01/10/2002			*
;*	* High Resolution conversion fixed for  *
;*        negative temperature values!		*
;*						*
;* Displays temperature in high resolution	*
;* on a 2x24 LCD panel with real time clock.	*
;* RS232 included for temperature output and	* 
;* setting RTC					*
;************************************************
;* See Schematic for Hardware connections	*
;* 						*
;* Disclaimer:					*
;* The Author takes no responsibility for the 	*
;* use of this code. Use at your own risk!	*
;* 						*
;* This code or part there of is licensed only 	*
;* for private use and NOT for commercial use.	*
;* 						*
;* Please contact the author 'Wayne Peacock' 	*
;* <wpeacock@senet.com.au> before using the code*
;* or part there of in a commercial project.	*
;************************************************

; Time / Date string format
; "T20:55:26 15/08/2001"

.Include 	"2313def.inc" 

.def	count1	= r26		
.def	count2	= r27

.def	temp	= r16
.def	data 	= r17
.def	loopcnt = r18

.def	text	= r0
.def	crc	= r1

;	Xreg				; Pointer to Data
;	Zreg				; Pointer to Data

.equ	commpointer	= 0xB0
.equ	commbuffer	= 0xB1

       .org $0000 
       
;************************************************
;* Interrupt Vectors				*
;************************************************
       
        rjmp	reset		; Reset Handler
	reti			; IRQ0 Handler
	reti			; IRQ1 Handler
	reti			; Timer1 Capture Handler
	reti			; Timer1 Compare Handler
	reti			; Timer/Counter1 Overflow
	reti			; Timer/Counter0 Overflow
	;reti
	rjmp	getchar		; UART Rx Complete
	reti			; UART Data Register Empty
	reti			; UART Tx Complete
	reti			; Analog Comparator
	 
;************************************************
;* Initialization 				*
;************************************************

.include "1302sub.asm"
                   
reset:  
	ldi	temp,ramend
	out	spl,temp		; Set lowbyte for stack
	cli
	
	clr	temp
	sts 	commpointer, temp 	; Clear commpointer
	
	rcall	wait_2ms		; Give LCD time to start up!
	rcall	lcdinit			; Set up Port for LCD
	rcall	DS1302_init		; Set up Port for DS1302
	rcall	comm_init		; Set up RS232
	rcall	DS1820_init		; Set up Port for DS1820
	
	sbi	PORTD, 6
	sbi	DDRD, 6			; Backlight off
	
	rcall	wait_2ms		; Give LCD time to start up!
	
	ldi	data, 0x28		; 8 bit mode, 2 lines
	rcall	command
	ldi	data, 0x0C		; Display on, no cursor
	rcall	command
	ldi	data, 0x01		; Clear Display (Requires delay)
	rcall	command
	
	sei				; Enable Interrupts
	
	;rcall	settime			; Set time
	
;************************************************
;* Main loop code				*
;************************************************
		
loophere:

	;rcall	time

	; Reset DS1820
	cli
	rcall	DS1820_reset
	sei
	bld	temp, WIRE
	sbrc	temp, WIRE
	rjmp	error
	
	; Read ROM
	cli
 	rcall	Search
  	sei
  	; Check for errors
  	
  	tst	temp
  	breq	dumpit			; OK, Dump Data
  	; We have errors
  	
  	ldi	data, 0x80
  	rcall	command			; Top Line
  	
  	ldi	ZL,low(text2*2)		;set pointer to the test
	ldi	ZH,high(text2*2)	;*2 as first bit is low/high byte select
	rcall	writedata	
		
  	rcall	dump_search		;Dump results down RS232
  	rjmp	halt
  
;************************************************
;* Dump data from search			*
;************************************************
	
dumpit:
	ldi	data, 0x83
	rcall	command			; First line

  	lds	data,DScount		; Get number of devices
  	ori	data, 0x30
  	rcall	onechar
  	
  	ldi	data, ' '
  	rcall	onechar
  	
  	rcall	dump_search		; Dump serial numbers to RS232
  	
  	cli
	rcall  	DS1820_reset
	rcall	DS1820_conv		; Do Conversion
	sei
	
	ldi	data, 'A'
	rcall	onechar
	;rcall	comm_write
	
	ldi	YH,high(DS1820_0)
	ldi	YL,low(DS1820_0)
	cli
	rcall	LCDtemp
	sei
	ldi	data, 'B'
	rcall	onechar
	;rcall	comm_write
	
	; Check if device exist
 	lds	temp, DScount
 	dec	temp
 	brne	present

	ldi	data, '-'
	rcall 	onechar
	ldi	data, '-'
	rcall 	onechar
	ldi	data, '.'
	rcall 	onechar
	ldi	data, '-'
	rcall 	onechar
	ldi	data, '-'
	rcall 	onechar
	ldi	data, 'C'
	rcall 	onechar
	ldi	data, ' '
	rcall 	onechar
	rjmp	time

present:
  	ldi	YH,high(DS1820_1)
	ldi	YL,low(DS1820_1)	;init Y-pointer
	cli
	rcall	LCDTemp
	sei

time:	
	ldi	data, 0x0d
	rcall	comm_write		; New Line for RS232
	cli
	rcall	DS1302_read_ck		; Read clock bytes 
	rcall	DS1302_dump_time	; Display Time / Date
	sei
	
	
	ldi	temp, 0x05
del:	ldi	count1, 0xff
	rcall	delay
	dec	temp
	brne	del
	
	
	; Check for button and Toggle when button released
	
Button:
	sbic	PIND, 2
	rjmp	end_but			; Button not pressed
	
	; Button is Pressed
	; Wait until released
	
But_down:
	sbis	PIND, 2
	rjmp	But_down
	; Button Released
	; Toggle Pin D6
	
	sbis	PIND, 6
	rjmp	Clear_Back
	sbic	PIND, 6
	rjmp	Set_Back

Set_Back:
	cbi	PORTD, 6		; Back light on
	rjmp	end_but
	
Clear_Back:
	sbi	PORTD, 6		; Back light off
	
end_but:   	
	rjmp	loophere	
	
halt:	rjmp	halt	
			
error:	
	ldi	data, 'e'
	rcall	comm_write
        ldi	data, 'r'
	rcall	comm_write
	ldi	data, 'r'
	rcall	comm_write
	rjmp	halt

;************************************************************************
;*									*
;* Get String from RS232 (Interrupt)					*		
;*									*
;************************************************************************

getchar:

	; Disable all interrupts
	cli
	
	; Store registers used
	push	temp
	push	data
	push	ZH
	push	ZL
	push	text

	; setup commpointer
	lds	temp, commpointer		; Get Bytes read
	
	; Read  Byte for RS-232
	in	data,UDR			; Get char
	
	; Store Char in Commbuffer
	
	ldi	ZH,high(commbuffer)
	ldi	ZL,low(commbuffer)		;init Y-pointer
	add	r30 ,temp			;add offset
	st	Z, data				;Store it!
	
	; Increment commpointer
	inc	temp				; One more character in buffer
	sts	commpointer, temp
	
	; Check for end of string (0x0d = CR)
	
	cpi	data, 0x0d
	breq	process				; Process data!
	
	; Check for overflow of buffer
	
	cpi	temp, 32				; Max 32 char's
	breq	fixit	
	
endgetchar:
	; Restore registers
	pop	text
	pop	ZL
	pop	ZH
	pop	data
	pop	temp	
	
	; Re-enable interrupts
	sei
	reti
	
process:
	; Set Clock
	rcall	settime2
			
fixit:
	ldi	temp, 0x00
	sts	commpointer, temp
	rjmp	endgetchar			
	 
;********************************						
;* TEST CONSTANTS		*
;********************************


text2:	.db	"No DS1820's ?",00
text3:	.db	"  ",00

.include "lcd4.asm"
.include "delay.asm"			
.include "serial.asm"

;********************************						
;* Set Time 2			*
;* Use Data from RS232		*
;********************************

settime2:

	; Check for Valid String 
	; Only check first byte for a 'T'
	
	lds	data, commbuffer
	cpi	data, 'T'
	breq	OKtoset
	ret
		
OKtoset:

	rcall	DS1302_notwp		; Un Write protect		
	
	rcall	DS1302_ck_start		; Start Clock if not running!
	rcall	DS1302_charge		; Start Charging of SuperCap
	
	DS1302_start
	ldi	data, 0b10111110	; Cmd: Burst Write
	rcall	DS1302_Write
	
	lds	data, commbuffer+8
	andi	data,0x0f
	lds	temp, commbuffer+7
	swap	temp
	andi	temp,0xf0
	or	data, temp
	rcall	DS1302_Write		; Seconds
	
	lds	data, commbuffer+5
	andi	data,0x0f
	lds	temp, commbuffer+4
	swap	temp
	andi	temp,0xf0
	or	data, temp
	rcall	DS1302_Write		; Minutes
	
	lds	data, commbuffer+2
	andi	data,0x0f
	lds	temp, commbuffer+1
	swap	temp
	andi	temp,0xf0
	or	data, temp
	rcall	DS1302_Write		; Hours
	
	lds	data, commbuffer+11
	andi	data,0x0f
	lds	temp, commbuffer+10
	swap	temp
	andi	temp,0xf0
	or	data, temp
	rcall	DS1302_Write		; Day of Month
	
	lds	data, commbuffer+14
	andi	data,0x0f
	lds	temp, commbuffer+13
	swap	temp
	andi	temp,0xf0
	or	data, temp
	rcall	DS1302_Write		; Month
	
	ldi	data, 0x00		; Day Unused!!
	rcall	DS1302_Write
	
	lds	data, commbuffer+19
	andi	data,0x0f
	lds	temp, commbuffer+18
	swap	temp
	andi	temp,0xf0
	or	data, temp
	rcall	DS1302_Write		; Year
	
	ldi	data, 0x80		; Write Protect on
	rcall	DS1302_Write	
	
	DS1302_stop	
	
	ret


.Include "convert.asm"
.Include "DS1820sub.asm"
.Include "DS1820search.asm"

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -