我正在使用專有的8051板來學習彙編編程。我目前正在研究LCD'Hello World'計劃。這是代碼。8051 LCD'Hello World' - 用變量替換DB
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
一切工作正常。但是,我無法向LCD輸出變量。將#mesg1替換爲十六進制值(ascii以簡化事情)只是在屏幕上顯示亂碼字符。因此,每次調用一個只增加一個值的子程序,所以我不確定數據移入dptr時的數據格式。
我錯過了什麼蠢事?
謝謝!
謝謝,現在的第一點是完全合理的。 但是,我很努力地理解數據應該在哪個寄存器中,以便wr_string可以輸出它。命中率? –
我已經添加了一個代碼示例(以前沒有可用的8051環境,並且不想發佈未經驗證的代碼:-))代碼假定您的主板包含一些外部內存。 (十進制)數據需要在r7中進行轉換。 'wr_string'仍然從@dptr讀取,但需要從XDATA讀取(如果xdata與代碼ram完全相同,但這取決於您的主板,則不需要)。順便說一句:我使用這個IDE,其中包括一個8051模擬器:http://mcu8051ide.sourceforge.net,以防萬一你仍然在尋找一個... –
這是有益的,謝謝!我目前無法進入董事會進行測試,但我認爲我現在可以計算出發生了什麼。 –