Files
bme280_cpm/bme280_util.z80

216 lines
3.5 KiB
Z80 Assembly

org 100h
siob_data equ 083h
siob_ctrl equ 082h
lcd_data equ 0dbh
lcd_ctrl equ 0dah
celcius_offset equ 08ah
pressure_offset equ 0cah
humid_offset equ 09eh
bdos equ 0005h
conout equ 02h
conin equ 01h
char_idx equ 10h
temperature equ 20h
humidity equ 30h
pressure equ 40h
start:
call init_lcd
call init_siob
call lcd_delay
ld a,celcius_offset ; write celcius label
out (lcd_ctrl),a
call lcd_delay
ld hl,clabel
call print_str_to_lcd
ld a,pressure_offset ; write pressure label
out (lcd_ctrl),a
call lcd_delay
ld hl,plabel
call print_str_to_lcd
ld a,humid_offset ; write humidity label
out (lcd_ctrl),a
call lcd_delay
ld hl,hlabel
call print_str_to_lcd
main:
call read_char_b
call parse_char
;call print_char_to_lcd
ld c,11
call bdos
or a
jr z,main
ret
init_siob:
ld a,018h ; channel reset
out (siob_ctrl),a
ld a,04h
out (siob_ctrl),a ; wr4 baud settings
ld a,0c4h
out (siob_ctrl),a
ld a,03h
out (siob_ctrl),a ; rx enable
ld a,0c1h
out (siob_ctrl),a
ld a,05h
out (siob_ctrl),a ; tx settings
ld a,0eah
out (siob_ctrl),a
ret
init_lcd:
ld a,38h
out (lcd_ctrl),a ; function 8 bit, 2 lines, 5x8 dot font
call lcd_delay
ld a,0ch
out (lcd_ctrl),a ; display on, cursor off, no blink
call lcd_delay
ld a,01h
out (lcd_ctrl),a ; clear display
ret
lcd_delay:
ld bc,500
delay1:
dec bc
ld a,b
or c
jr nz,delay1
ret
convert_to_hpa:
ld a,(pressure)
read_char_b:
wait:
in a,(siob_ctrl)
bit 0,a
jr z,wait
in a,(siob_data)
ret
parse_char: ; char should be in register a
cp a,25h ; percent sign (end of transmission)
jr z,print_telem_to_lcd
cp a,0dh ; carriage return
jr z,null_term
cp a,0ah ; new line
jr z,parse_char_done
cp a,054h ; T character
jr z,set_char_idx_t ; point the char_idx to the temperature buffer
cp a,050h ; P character
jr z,set_char_idx_p ; point the char_idx to the pressure buffer
cp a,048h ; H character
jr z,set_char_idx_h ; point the char_idx to the humidity buffer
ld bc,(char_idx) ; get address stored in char_idx
ld (bc),a ; deref that address and store char
inc bc
ld (char_idx),bc ; store incremented address in char_idx
;out (lcd_data),a
parse_char_done:
ret
print_telem_to_lcd:
call move_to_tempaddr
ld hl,temperature
call print_str_to_lcd
ld a,1h
out (0),a
ret
null_term: ; null terminate end of parsed string in memory
ld a,00h
ld bc,(char_idx)
ld (bc),a
jr parse_char_done
set_char_idx_t:
ld bc,temperature
ld (char_idx),bc
ret
set_char_idx_p:
ld bc,pressure
ld (char_idx),bc
ret
set_char_idx_h:
ld bc,humidity
ld (char_idx),bc
ret
print_char_to_lcd:
cp a,00h ; null byte
jr z,lcd_done
cp a,0dh ; carriage return
jr z,lcd_done
cp a,0ah ; new line
jr z,lcd_done
cp a,054h ; T character
call z,move_to_tempaddr
cp a,050h ; P character
call z,move_to_presaddr
cp a,048h ; H character
call z,move_to_humidaddr
out (lcd_data),a
lcd_done:
ret
print_str_to_lcd: ; place memory address in hl first
ld a,(hl)
or a
jr z,print_done
out (lcd_data),a
call lcd_delay
inc hl
jr print_str_to_lcd
print_done:
ret
move_to_tempaddr:
ld c,a
ld a,85h
out (lcd_ctrl),a
ld a,c
ret
move_to_presaddr:
ld a,0c1h
out (lcd_ctrl),a
ret
move_to_humidaddr:
ld a,99h
out (lcd_ctrl),a
ret
clabel: DB 'degree C',0
plabel: DB 'pascal',0
hlabel: DB '% RH',0
end start