📄 lcd24.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 + -