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