8051 LCD 'Hello World' - reemplazando DB con variable
Estoy usando una placa 8051 patentada para aprender la programación de ensamblajes. Actualmente estoy trabajando en un programa de LCD 'Hello World'. Aquí está el código.
lcd_cmd equ 0800h ;Write COMMAND reg address 0800h
lcd_st equ 0801h ;Read STATUS reg address 0801h
lcd_wr equ 0802h ;Write DATA reg address 0802h
lcd_rd equ 0803h ;Read DATA reg address 0803h
ORG 08100h
hello:
mov P2, #(lcd_cmd SHR 8) ;load P2 with high address
mov R0, #(lcd_cmd AND 255) ;load R0 with command reg addr
mov R7, #03h ;set LCD position, line=1, char=3
mov dptr, #mesg1 ;point to mesg1
acall wr_string ;write mesg1 to LCD
mov R7, #41h ;set LCD position, line= 2, char=1
mov dptr, #mesg2 ;point to mesg2
acall wr_string ;write mesg2 to LCD
stop: ajmp stop ;soft halt
wr_string:
acall lcd_busy ;wait until LCD not busy
mov a, R7 ;get LCD position
orl a, #080h ;msb set for LCD RAM address
movx @R0, a ;write lcd_cmd to set line & char
nxt_char:
acall lcd_busy ;wait until LCD not busy
clr a
movc a, @a+dptr
inc dptr ;point to next byte in string
jz str_end ;if 0 then end of string
mov R1, #(lcd_wr AND 255) ;Load R1 with wr_data address
movx @R1, a ;Write char to LCD
sjmp nxt_char ;get next char in string
str_end: ret
lcd_busy:
mov R1, #(lcd_st AND 255) ;Load R1 with status address
movx a, @R1 ;read LCD status
jb acc.7, lcd_busy ;keep checking until busy bit clear
ret
mesg1: db "Hello ",0
mesg2: db "World ",0
END
Todo funciona bien. Sin embargo, estoy teniendo problemas para enviar una variable a la pantalla LCD. Reemplazando # mesg1 con un valor hexadecimal (ascii para mantener las cosas simples) simplemente aparece caracteres revueltos en la pantalla. Lo mismo ocurre al llamar a una subrutina que simplemente incrementa un valor cada vez, por lo que no estoy seguro del formato que deben tener los datos cuando se mueven al dptr.
¿Algo estúpido que me haya perdido?
¡Gracias!