Jag kan skriva ut en sträng som är sparad i Program-minnet(Anna är SNYGG!). Hela programmet är inte med(så det kanske inte funkar som det är nu)men det viktiga(för frågeställningen) är med.
Kod: Markera allt
.NOLIST
.INCLUDE "m168def.inc"
.LIST
;-----------------------------------------------------------------------------------------------
.DEF LPMdata = r0 ;Register för data som läses med "lpm"
.DEF temp = r16 ;Temporärt register
.EQU EOL = 0 ;End Off Line
;-----------------------------------------------------------------------------------------------
.MACRO PRINT_TEXT
ldi ZL, LOW(@0*2)
ldi ZH, HIGH(@0*2)
rcall Print_data
.ENDMACRO
;-----------------------------------------------------------------------------------------------
.DSEG
.ORG 0x100
Val: .BYTE 70
;-----------------------------------------------------------------------------------------------
.ORG PMSTART
Text1: .DB" Anna ", 0b11100001, "r SNYGG!", EOL ; 16 bytes
;-----------------------------------------------------------------------------------------------
Main:
rcall Print_init
PRINT_TEXT Text1
rcall Delay
rjmp Main ;Börja om på Main
;-----------------------------------------------------------------------------------------------
Print_Data:
ldi temp, WRITE_DATA ;Sätt 3-ledningsbussen för sändning
out LCD_set, temp ;
Print_Next:
lpm ;Hämta tecken från PM (r0 <- @Z)
mov temp, LPMdata
out LCD_data,temp
cpi temp, EOL ;Om detta tecken är lika med EOL...
breq Print_Done ;...hoppa till "Print_Done...
rcall SEND ;...annars, sänd LCD_data till Displayen
adiw ZL, 1 ;Addera registerpar med direktdata (flyttar Z-pekare)
rjmp Print_Next ;Skicka nästa tecken
Print_Done:
ret ;EOL(End Off Line), Returnera
Jag kan ju inte bara skriva "PRINT_TEXT Val" för då laddas väl Z med adressen till "Val" i SRAM och sedan läser LPM den adressen, fast i Flash-minnet.
Sen en liten fråga till: Varför måste man ladda Z med adressen Text1 och sedan ta det gånger två"(@0*2)"? Är är själva "Text1" en byte också eller hur ligger det till?