diff --git a/bme280_util.z80 b/bme280_util.z80 index c6d8f95..73b8bea 100644 --- a/bme280_util.z80 +++ b/bme280_util.z80 @@ -1,226 +1,226 @@ -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 - -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 lcd_delay - ;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) - ret - -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 - - call move_to_presaddr - ld hl,pressure - call print_str_to_lcd - - call move_to_humidaddr - ld hl,humidity - 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 - call lcd_delay - ret - -move_to_presaddr: - ld a,0c1h - out (lcd_ctrl),a - call lcd_delay - ret - -move_to_humidaddr: - ld a,99h - out (lcd_ctrl),a - call lcd_delay - ret - -clabel: DB 'degree C',0 -plabel: DB 'pascal',0 -hlabel: DB '% RH',0 - -temperature: DS 16 -humidity: DS 16 -pressure: DS 16 + 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 + +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 lcd_delay + ;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) + ret + +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 + + call move_to_presaddr + ld hl,pressure + call print_str_to_lcd + + call move_to_humidaddr + ld hl,humidity + 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 + call lcd_delay + ret + +move_to_presaddr: + ld a,0c1h + out (lcd_ctrl),a + call lcd_delay + ret + +move_to_humidaddr: + ld a,99h + out (lcd_ctrl),a + call lcd_delay + ret + +clabel: DB 'degree C',0 +plabel: DB 'pascal',0 +hlabel: DB '% RH',0 + +temperature: DS 16 +humidity: DS 16 +pressure: DS 16