;############################################################################ ;Datei "pr_debug.inc": ;Erweiterung der Ausgabe-Funktionalität für LCD für AVR-Assembler (AT-Mega8). ;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. ;Es werden folgende Funktionen bereitgestellt, ;die per Macro aufgerufen werden: ;----------------------------------------------------------------------------- ; printhex Reg ;Gibt den Inhalt des Registers als zweistellige ;Hex-Zahl aus. Enthält das Register eine gepackte ;BCD-Zahl, so werden die beiden Ziffern ausgegeben. ;Somit erübrigt sich eine separate Routine zur ;Ausgabe von Packed-BCD. ;----------------------------------------------------------------------------- ; printbin Reg ;Gibt den Inhalt des Registers als achtstelligen ;Binär-Zahl aus. ;----------------------------------------------------------------------------- .macro printhex ;Register mov tmp,@0 ;Daten übernehmen rcall lcd_printhex ;Aufruf... .endmacro .macro printbin ;Register mov tmp,@0 ;Daten übernehmen rcall lcd_printbin ;Aufruf... .endmacro ;----------------------------------------------------------------------------- lcd_printhex: ;Wird von Makro aufgerufen. Gibt Byte als HEX aus. push tmp ;für zweite Ziffer sichern swap tmp ;oberes Nibble zuerst rcall lcd_printhex1 ;ausgeben... pop tmp ;unteres Nibble lcd_printhex1: ;Nibble ausgeben andi tmp,15 ;nur unteres Nibble interessiert uns ori tmp,'0' ;zur Ascii-Ziffer wandeln cpi tmp,'9'+1 ;Wert über 9? brmi lcd_printhex2 ;nein, so lassen... subi tmp,-39 ;zum Kleinbuchstaben wandeln ; subi tmp,-7 ;zum Großbuchstaben wandeln lcd_printhex2: rjmp lcd_data ;Zeichen ausgeben und zurück... lcd_printbin: ;Wird von Makro aufgerufen. Gibt Byte als 8 BIN-Ziffern aus. push wh ;Reg sichern mov wh,tmp ;Wert nach wh sec ;gesetztes Carry als Ende-Indikator ins Register, rol wh ;oberstes Bit ins Carry schieben lcd_printbin1: ldi tmp,'0' ;erstmal Ziffer "0" adc tmp,null ;Ziffer "1", falls Carry gesetzt war rcall lcd_data ;Ziffer ausgeben lsl wh ;nächstes Bit ins Carry schieben brne lcd_printbin1 ;Indikator-Bit noch im Register? ja... pop wh ;Reg wiederherstellen ret ;zurück... ;----------------------------------------------------------------------------- ;############################################################################ ;Datei "pr_i2a16.inc": ;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) ; wh, zh und zl (wird gesichert) ; SRAM: tmpmath(0,1) ;----------------------------------------------------------------------------- ;Es werden folgende Funktionen bereitgestellt, ;die per Macro aufgerufen werden: ;----------------------------------------------------------------------------- ; print16 H-reg,L-Reg,Komma,[using]+[sig]+[fnul] ;Gibt 16-Bit-Zahl als Ziffern aus ;H-Reg,L-Reg enthält die Zahl ;Komma ist die Anzahl der Nachkommastellen ;using erzwingt formatierte Ausgabe (Print Using) ;sig erzwingt Vorzeichen ;fnul erzwingt Führungsnullen ;----------------------------------------------------------------------------- ; print16s Adr,Komma,[using]+[sig]+[fnul] ;Gibt 16-Bit-Zahl in SRAM als Ziffern aus ;Adr und ADR+1 (SRAM) enthält die Zahl (L:H) ;Komma ist die Anzahl der Nachkommastellen ;using erzwingt formatierte Ausgabe (Print Using) ;sig erzwingt Vorzeichen ;fnul erzwingt Führungsnullen ;----------------------------------------------------------------------------- ; printui H-Reg,L-Reg ;Gibt den Inhalt der Zahl in H-reg:L-Reg 5-stellig aus ;Ist inzwischen dank "print16" überflüssig ;----------------------------------------------------------------------------- .equ using=0b00100000 ;Flag für formatierte Ausgabe (Print Using) .equ sig = 0b01000000 ;Flag für Vorzeichen-Zahl (signed Integer) .equ fnul= 0b10000000 ;Flag für Führungsnullen ;----------------------------------------------------------------------------- .macro print16 ;H-Reg,L-Reg,Kommastellen,using+sign+fnul sts tmpmath,@1 ;Low-Byte und sts tmpmath+1,@0 ;High-Byte ins temp. SRAM (Übergabebereich) ldi tmp,(@3 & $e0)|16|(6-(@2 & 15)) ;Mode-Flags und Komma-Position direkt rcall lcd_print16 ;Aufruf .endmacro .macro print16s ;Adresse,Kommastellen,using+sign+fnul lds tmp,@0 ;Daten sts tmpmath,tmp ;aus SRAM in lds tmp,@0+1 ;Übergabebereich sts tmpmath+1,tmp ;kopieren ldi tmp,(@2 & $e0)|16|(6-(@1 & 15)) ;Mode-Flags und Komma-Position direkt rcall lcd_print16 ;Aufruf .endmacro .macro printui ;H-Register, L-Register ;Gibt u-Integer im Registerpaar H:L 5-stellig an LCD aus. ;Die Parameter geben die Register H und L an. ;Diese Register werden nicht verändert. ;Kopie der Zahl in XH und XL sts tmpmath,@1 ;Low-Byte und sts tmpmath+1,@0 ;High-Byte ins temp. SRAM (Übergabebereich) ldi tmp,sig+fnul ;mit Führungsnullen ausgeben rcall lcd_print16 ;Aufruf .endmacro ;----------------------------------------------------------------------------- lcd_print16: ;Wird von Macro aufgerufen. Gibt Word als Zahl in mehreren Modi aus push xh ;verwendete Register push xl ;sichern push wh mov wh,tmp ;Format-Bitmuster kopieren lds xl,tmpmath ;Wert aus Übergabe- lds xh,tmpmath+1 ;Bereich holen sbrs wh,6 ;Signum-Flag gesetzt? ja... rjmp lcd_printui ;nein, als unsigned-Int behandeln... sbrs xh,7 ;Wert negativ? ja... rjmp lcd_printsig ;nein, positiv... ldi tmp,'-' ;Vorzeichen rcall lcd_data ;ausgeben neg xl ;Zahl positiv com xh ;machen lcd_printui: ; ldi tmp,-1+'0' ;Ziffer für Zehntausender inc tmp ;Zehntausender Stelle hoch und subi xl,low(10000) ;von Zahl 10000 subtrahieren sbci xh,high(10000) ;bis Zahl negativ wird brcc pc-3 ;schon negativ? nein... lcd_print16_a: ;Einsprung aus 24-Bit-Routine rcall lcd_format ;ja, Ziffer ausgeben (Zehntausender) ldi tmp,10+'0' ;Ziffer für Tausender, Zahl ist jetzt negativ dec tmp ;Tausender Stelle verkleinern und subi xl,low(-1000) ;1000 zur (negativen) Zahl addieren, sbci xh,high(-1000) ;bis Zahl wieder positiv wird brcs pc-3 ;noch negativ? ja... rcall lcd_format ;nein, Ziffer ausgeben (Tausender) ldi tmp,-1+'0' ;Ziffer für Hunderter (Zahl ist jetzt positiv) inc tmp ;Hunderter Stelle hoch und subi xl,low(100) ;von Zahl 100 subtrahieren sbci xh,high(100) ;bis Zahl negativ wird brcc pc-3 ;schon negativ? nein... rcall lcd_format ;ja, Ziffer ausgeben (Hunderter) ldi tmp,10+'0' ;Zehner-Stelle als ASCII-Zeichen, Zahl ist negativ dec tmp ;Zehner runter und subi xl,-10 ;10 addieren bis positiv wird brlo pc-2 ;positiv? nein, 2 Zeilen hoch... rcall lcd_format ;ja, Zehner Stelle ausgeben... ldi tmp,'0' ;ASCII-0 add tmp,xl ;Einer addieren (Rest war ja positiv) rcall lcd_format ;Einer ausgeben andi wh,using ;Führungsnullen oder Using aktiv? brne pc+3 ;ja, also konstante Textlänge... ldi tmp,' ' ;nein, variable Textlänge, deshalb rcall lcd_data ;Leerzeichen anhängen um alte Ziffer zu löschen pop wh pop xl ;verwendete Register pop xh ;wiederherstellen ret ;zurück lcd_printsig: ldi tmp,'+' ;Vorzeichen rcall lcd_data ;ausgeben rjmp lcd_printui ;Zahl ausgeben lcd_format: dec wh ;Kommazähler runter push wh ;Mode-Flags sichern andi wh,$0f ;Kommazähler isolieren cpi wh,1 ;Letzte Stelle vor dem Komma? pop wh ;(Mode-Flags wegen Veränderung holen) brne pc+2 ;nein... sbr wh,fnul ;Nullausgabe aktivieren push wh ;geänderte Mode-Flags nochmal sichern andi wh,$0f ;Kommazähler isolieren (wegen Zero-Flag) pop wh ;Mode-Flags wiederherstellen brne lcd_keinkomma ;Kommazähler nicht Null... push tmp ;Ziffer sichern ldi tmp,',' ;Komma rcall lcd_data ;ausgeben pop tmp ;Ziffer wiederherstellen lcd_keinkomma: cpi tmp,'0' ;Ziffer = "0"? breq lcd_format0 ;ja... sbr wh,fnul ;nein, künftige Nullen nicht mehr unterdrücken rcall lcd_data ;Ziffer ausgeben ret ;und zurück... lcd_format0: sbrs wh,7 ;Nullen ausgeben? ja... ldi tmp,' ' ;nein, Null durch Leerzeichen ersetzen sbrc wh,7 ;Nullen ausgeben? nein... rcall lcd_data ;ja, Ziffer "0" ausgeben ret ;und zurück... sbrc wh,5 ;Print Using? nein... rcall lcd_data ;ja, Leerzeichen ausgeben und zurück... ret ;nein, ohne Ausgabe zurück... ;############################################################################ ;Datei "pr_i2a24.inc": ;Erweiterung der Ausgabe-Funktionalität für LCD für AVR-Assembler (AT-Mega). ;Dieser Include-Code ist Bestandteil LCD-Ausgaberoutinensammlung "print.inc". ;Diese Datei braucht die Datei "pr_i2a16.inc" zur Fortsetzung. ;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) ; wh, xh, xl und yl (wird gesichert) ; SRAM: tmpmath(0,1,2) ;----------------------------------------------------------------------------- ;Es werden folgende Funktionen bereitgestellt, ;die per Macro aufgerufen werden: ;----------------------------------------------------------------------------- ; print24 H-reg,M-Reg,L-Reg,Komma,[using]+[sig]+[fnul] ;Gibt 24-Bit-Zahl als Ziffern aus ;H-Reg,M-Reg,L-Reg enthält die Zahl ;Komma ist die Anzahl der Nachkommastellen ;using erzwingt formatierte Ausgabe (Print Using) ;sig erzwingt Vorzeichen ;fnul erzwingt Führungsnullen ;----------------------------------------------------------------------------- ; print24s Adr,Komma,[using]+[sig]+[fnul] ;Gibt 24-Bit-Zahl aus SRAM als Ziffern aus ;Adr, Adr+1 und Adr+2 (SRAM) enthält die Zahl (L:M:H) ;Komma ist die Anzahl der Nachkommastellen ;using erzwingt formatierte Ausgabe (Print Using) ;sig erzwingt Vorzeichen ;fnul erzwingt Führungsnullen ;----------------------------------------------------------------------------- .macro print24 ;H-Reg,M-Reg,L-Reg,Kommastellen,using+sign+fnul sts tmpmath,@2 sts tmpmath+1,@1 sts tmpmath+2,@0 ldi tmp,(@4 & $e0)|16|(9-(@3 & 15)) ;Mode-Flags und Komma-Position rcall lcd_print24 ;Aufruf .endmacro .macro print24s ;Adresse,Kommastellen,using+sign+fnul lds tmp,@0+2 ;Byte3 sts tmpmath+2,tmp ;kopieren lds tmp,@0+1 ;Byte2 sts tmpmath+1,tmp ;kopieren lds tmp,@0 ;Low-Byte sts tmpmath,tmp ;kopieren ldi tmp,(@2 & $e0)|16|(9-(@1 & 15)) ;Mode-Flags und Komma-Position direkt rcall lcd_print24 ;Aufruf .endmacro ;----------------------------------------------------------------------------- lcd_print24: ;Wird von Macro aufgerufen. ;Gibt Word als Zahl in mehreren Modi aus push xh ;verwendete Register push xl ;sichern push wh push yl mov wh,tmp ;direkt übergebenes Format-Bitmuster kopieren lds xl,tmpmath ;Low-Byte lds xh,tmpmath+1 ;Byte2 lds yl,tmpmath+2 ;Byte3 sbrs wh,6 ;Signum-Flag gesetzt? ja... rjmp lcd_print24u ;nein, als unsigned behandeln... sbrs yl,7 ;Wert negativ? ja... rjmp lcd_print24plus ;nein, positiv... ldi tmp,'-' ;Vorzeichen rcall lcd_data ;ausgeben neg xl ;Zahl positiv com xh ;machen rjmp lcd_print24u ;weiter... lcd_print24plus: ;Pluszeichen ausgeben ldi tmp,'+' ;Pluszeichen rcall lcd_data ;an LCD lcd_print24u: ;24-Bit-Zahl zerlegen ldi tmp,-1+'0' ;Ziffer für ZehnMillon inc tmp ;ZehnMio Stelle hoch und subi xl,low(10000000) ;von Zahl 10 Mio subtrahieren sbci xh,high(10000000) ;bis Unterlauf sbci yl,byte3(10000000) ; brcc pc-4 ;Unterlauf? nein... rcall lcd_format ;ja, Ziffer ausgeben (Zehn-Mio) ldi tmp,10+'0' ;Ziffer für Million, Zahl ist jetzt <0 dec tmp ;Mio Stelle verkleinern und subi xl,low(-1000000) ;1 Mio zur (<0) Zahl addieren, sbci xh,high(-1000000) ;bis Überlauf sbci yl,byte3(-1000000) ; brcs pc-4 ;Überlauf? ja... rcall lcd_format ;nein, Ziffer ausgeben (1 Mio) ldi tmp,-1+'0' ;Ziffer für Hunderttausender inc tmp ;Hunderttausender Stelle hoch und subi xl,low(100000) ;von Zahl 100000 subtrahieren sbci xh,high(100000) ;bis Unterlauf sbci yl,byte3(100000) ; brcc pc-4 ;Unterlauf? nein... rcall lcd_format ;ja, Ziffer ausgeben (Hunderttausender) ldi tmp,10+'0' ;Ziffer für Tausender, Zahl ist jetzt <0 dec tmp ;Tausender Stelle verkleinern und subi xl,low(-10000) ;1 Mio zur (negativen) Zahl addieren, sbci xh,high(-10000) ;bis Überlauf sbci yl,byte3(-10000) ; brcs pc-4 ;Überlauf? ja... subi xl,low(10000) ;nein, 10000 von der (>0) Zahl subtrahieren, sbci xh,high(10000) ;Zahl wieder <0 wird und ins Raster der 16-Bit- pop yl ;Routine passt, Variable von Byte3 entsorgen rjmp lcd_print16_a ;16-Bit-Routine zerlegt den Rest... ;############################################################################ ;Datei "pr_i2a8.inc": ;Erweiterung der Ausgabe-Funktionalität für LCD für AVR-Assembler (AT-Mega8). ;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. ;Es werden folgende Funktionen bereitgestellt, ;die per Macro aufgerufen werden: ;----------------------------------------------------------------------------- ; print8 Reg ;Gibt den Inhalt von Reg. zweistellig aus, ;wenn er kleiner als 100 ist. (Uhr) ;Ab 100 erfolgt die Ausgabe dreistellig. ;----------------------------------------------------------------------------- ; print8s Adr ;Gibt den Inhalt von Adr (SRAM) zweistellig aus, ;wenn er kleiner als 100 ist. (Uhr) ;Ab 100 erfolgt die Ausgabe dreistellig. ;----------------------------------------------------------------------------- ;Verwendete Register: ; "xl" (wird gesichert) ; "tmp" (wird nicht gesichert) ;----------------------------------------------------------------------------- .macro print8 ;Registername ;Gibt Zahl im Register 2- oder 3-stellig aus. ;Parameter bestimmt das Register, in dem die Zahl liegt. ;Dieses Register wird nicht verändert. ;Kopie der Zahl temporär in xl, mov tmp,@0 ;Wert aus Register ins temp. SRAM rcall lcd_print8 ;Aufruf... .endmacro ; .macro print8s ;Adresse im SRAM ;Gibt Zahl im SRAM 2- oder 3-stellig aus. ;Parameter bestimmt die Adresse im SRAM, ;in dem die Zahl liegt. ;Dieser Inhalt wird nicht verändert. ;Kopie der Zahl temporär in tmp, lds tmp,@0 ;Wert aus SRAM-Adresse holen rcall lcd_print8 ;Aufruf... .endmacro ; ;----------------------------------------------------------------------------- lcd_print8: ;Wird vom Makro aufgerufen. ;Gibt Byte als 2 oder 3 Ziffern an LCD aus. push xl ;Reg sichern mov xl,tmp ;Datenwert kopieren ldi tmp,-1+'0' ;Hunderter-Stelle als ASCII-Zeichen, Zahl über 0 inc tmp ;Hunderter hoch und subi xl,100 ;100 subtrahieren bis zum Unterlauf brsh pc-2 ;Unterlauf? nein, 2 Zeilen hoch cpi tmp,'0' ;ja, ist Ziffer = "0"? breq pc+2 ;ja, nicht ausgeben... rcall lcd_data ;Hunderter ausgeben... ldi tmp,10+'0' ;Zehner-Stelle als ASCII-Zeichen, Zahl unter 0 dec tmp ;Zehner runter und subi xl,-10 ;10 addieren bis zum Überlauf brlo pc-2 ;Überlauf? nein, 2 Zeilen hoch... rcall lcd_data ;ja, Zehner Stelle ausgeben... ldi tmp,'0' ;ASCII-0 add tmp,xl ;Einer addieren (Rest war ja über 0) rcall lcd_data ;Einer ausgeben... pop xl ;Reg wiederherstellen ret ;zurück ;############################################################################ ;Datei "pr_txt.inc": ;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 ;############################################################################ ;Datei "pr_zeit.inc": ;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 ;############################################################################