title: 8051 LCD 'Hello World' - replacing DB with variable
body: <p>I'm using a proprietary 8051 board to learn assembly programming. I'm currently working on an LCD 'Hello World' program. Here's the code.</p>
  
  <pre><code>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 &amp; 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
  </code></pre>
  
  <p>Everything works fine. However, I'm having trouble outputting a variable to the LCD. Replacing #mesg1 with a hex value (ascii to keep things simple) simply brings up scrambled characters on the screen. So does calling a subroutine which simply increments a value every time, so I'm unsure what format the data should be when it's moved into the dptr.</p>
  
  <p>Anything stupid I've missed?</p>
  
  <p>Thanks!</p>