;Erweiterung der Ausgabe-Funktionalität für LCD für AVR-Assembler (AT-Mega). ;Dieser Include-Code ist Bestandteil LCD-Ausgaberoutinensammlung "print.inc". ;Die Datenausgaberoutine des LCD-Treibers sollte "lcd_data" heißen. ;Das auszugebende ASCII-Zeichen steht im Register "tmp", das im Hauptprogramm ;eingerichtet werden muss. ;Verwendete Register und SRAM: ; Reg.: tmp (wird nicht gesichert) ; zh und zl (wird gesichert) ; SRAM: tmpmath(0,1) ;----------------------------------------------------------------------------- ;Es werden folgende Funktionen bereitgestellt, ;die per Macro aufgerufen werden: ;----------------------------------------------------------------------------- ; printt adr16,Reg ;Gibt einen Text aus, dessen Adresse in einer ;Indextabelle steht. ;adr16 ist die Basisadresse der Indextabelle, ;Reg ist ein Register, das den Eintrag in ;der Tabelle auswählt. ;Dient zum Ausgeben von indizierten Texten wie ;Menüpunkte, Wochentage usw. ;----------------------------------------------------------------------------- ; printts adr16,Adr ;Gibt einen Text aus, dessen Adresse in einer ;Indextabelle steht. ;adr16 ist die Basisadresse der Indextabelle, ;Adr ist eine SRAM-Zelle, die den Eintrag in ;der Tabelle auswählt. ;Dient zum Ausgeben von indizierten Texten wie ;Menüpunkte, Wochentage usw. ;----------------------------------------------------------------------------- ; printf adr16 ;Gibt den 0-terminierten Text an Adr.16 im Flash aus ;----------------------------------------------------------------------------- ; prints adr16 ;Gibt den 0-terminierten Text an Adr.16 im SRAM aus ;============================================================================= .macro printt ;Adresse der Tabelle, Index auf Tabelle ldi tmp,low(@0*2) ;Basisadresse sts tmpmath,tmp ;der Indexliste ldi tmp,high(@0*2) ;auf Stringadressen sts tmpmath+1,tmp ;in SRAM-Übergabebereich mov tmp,@1 ;Index kopieren und direkt übergeben rcall lcd_printt ;Aufruf .endmacro .macro printts ;Adresse der Tabelle, Index auf Tabelle (SRAM) ldi tmp,low(@0*2) ;Basisadresse sts tmpmath,tmp ;der Indexliste ldi tmp,high(@0*2) ;auf Stringadressen sts tmpmath+1,tmp ;in SRAM-Übergabebereich lds tmp,@1 ;Index holen und direkt übergeben rcall lcd_printt ;Aufruf .endmacro .macro printf ;Startadresse des Strings im Flash ;Gibt einen String aus dem Flash an LCD aus ;Ein Parameter beschreibt die Startadresse, das Ende ist $00 ldi tmp,low(2*@0) ;Adresse sts tmpmath,tmp ;temporär ldi tmp,high(2*@0) ;ins sts tmpmath+1,tmp ;SRAM rcall lcd_printf ;Aufruf... .endmacro .macro prints ;Startadresse des Strings im SRAM ;Gibt einen String aus dem SRAM an LCD aus ;Ein Parameter beschreibt die Startadresse, das Ende ist $00 ldi tmp,low(@0) ;Pointer sts tmpmath,tmp ;temporär ldi tmp,high(@0) ;ins sts tmpmath+1,tmp ;SRAM rcall lcd_prints ;Aufruf... .endmacro ;----------------------------------------------------------------------------- lcd_printt: ;Wird von Makro aufgerufen. Gibt indizierten Text aus push zh ;verwendete Register push zl ;sichern lds zl,tmpmath ;Adresse aus Übergabebereich lds zh,tmpmath+1 ;im SRAM holen lsl tmp ;Index mal 2 (2 Bytes pro Eintrag) add zl,tmp ;Index addieren adc zh,null ;Übertrag auch lpm tmp,z+ ;Low-Byte holen push tmp ;und sichern lpm tmp,z+ ;High-Byte holen mov zh,tmp ;in Z-Pointer pop zl ;kopieren lsl zl ;Index auf Text rol zh ;mal 2 (Byteweise Adressierung) rjmp lcd_printf1 ;Text ausgeben... lcd_printf: ;Wird vom Makro aufgerufen. Gibt Flash-String an LCD aus. push zh ;verwendete Register push zl ;sichern lds zl,tmpmath ;Adresse aus Übergabebereich lds zh,tmpmath+1 ;im SRAM holen lcd_printf1: ;Einsprung von printt... lpm tmp,z+ ;Zeichen holen tst tmp ;Ende-Kennung? breq lcd_printf_e ;ja... cpi tmp,5 ;User-Token? breq lcd_pr_user5 ;ja... cpi tmp,6 ;User-Token? breq lcd_pr_user6 ;ja... cpi tmp,7 ;User-Token? breq lcd_pr_user7 ;ja... rcall lcd_data ;nein, ausgeben rjmp lcd_printf1 ;nochmal lcd_printf_e: pop zl ;verwendete Register pop zh ;wiederherstellen ret lcd_pr_user5: ;User-Token 5 ($05) im Flash-ASCII-Text lds tmp,paraakt ;Parameter L-Wert Wert aus SRAM holen rcall lcd_print8 ;zweistellig ausgeben... rjmp lcd_printf1 ;weiter mit nächstem Zeichen... lcd_pr_user6: ;User-Token 6 ($06) im Flash-ASCII-Text lds tmp,paraakt ;Parameter Low-Byte sts tmpmath,tmp ;und lds tmp,paraakt+1 ;High-Byte in Übergabebereich sts tmpmath+1,tmp ;(SRAM) kopieren rcall lcd_printzt ;im Zeit-Format ausgeben rjmp lcd_printf1 ;weiter mit nächstem Zeichen... lcd_pr_user7: ;User-Token 7 ($07) im Flash-ASCII-Text rjmp lcd_printf1 ;weiter mit nächstem Zeichen... lcd_prints: ;Wird vom Makro aufgerufen. Gibt SRAM-String an LCD aus. push zh ;verwendeten Pointer push zl ;sichern lds zl,tmpmath ;Pointer lds zh,tmpmath+1 ;setzen ld tmp,z+ ;Zeichen holen tst tmp ;Ende-Kennung? breq pc+3 ;ja... rcall lcd_data ;nein, ausgeben rjmp pc-4 ;nochmal pop zl ;verwendete Register pop zh ;wiederherstellen ret