Hallo, (ATMEGA8 + 2*16 Display) bin leider noch voll der Anfänger...aber: Ich will eine binärzahl, z.b. 000011001 (also 25(dezimal)) in ein register per : ldi r16, 000011001 ;000011001 in r16 laden laden und dann ans display per rcall lcd_data ;Zeichen in r16 anzeigen ausgeben...leider wird dann ein Sonderzeichen, dass man mit einer binärzahl aufruft, angezeigt. Wie kann ich also eine Binärzahl in eine Dezimalzahl umwandeln und dann als "25" auf dem Display anzeigen?? Danke für eure Antworten
Du musst die Binärzahl in einzelne BCD-Ziffern umwandeln und dann 0x30 addieren, damit es ASCII-Code wird. Diese kannst du dann an das Display senden.
Hi Mal sehen ob ich es aus dem Stehgreif zusammenbekomme push r16 swap r16 andi r16,$0F ;unteres Nibble subi r16,-$30 ;entspricht r16+$30 cpi r16,$3A ;>9 brcs aaa subi r16,-$07 ;'A...F' aaa: rcall lcd_data pop r16 andi ... der folgende Code ist wie oben. MfG HG
Ich mach' das in 2 Etappen... Ein Macro sichert die Inhalte der verwendeten Register und ruft das Unterprogramm zur ASCII-Umwandlung auf. Hier das Macro: .macro print8 ;Registername ;Gibt Zahl im Register 2- oder 3-stellig am LCD aus. ;Parameter bestimmt das Register, in dem die Zahl liegt. ;Dieses Register wird nicht verändert. ;Kopie der Zahl temporär in xl, push xl ;verwendete Register sichern mov xl,@0 ;Kopie vom Quellregister rcall lcd_print8 ;Aufruf... pop xl ;verwendete Register wiederherstellen .endmacro ; Und hier das Unterprogramm: lcd_print8: ;Wird vom Makro aufgerufen. Gibt Byte als 2 oder 3 ;Ziffern an LCD aus. push wl ;Reg sichern ldi wl,-1+'0' ;Hunderter-Stelle als ASCII-Zeichen, Zahl ist positiv inc wl ;Hunderter hoch und subi xl,100 ;100 subtrahieren bis Unterlauf erfolgt brsh pc-2 ;Unterlauf? nein, 2 Zeilen hoch cpi wl,'0' ;ja, ist Ziffer = "0"? breq pc+2 ;ja, nicht ausgeben... rcall lcd_data ;Hunderter ausgeben... ldi wl,10+'0' ;Zehner-Stelle als ASCII-Zeichen, Zahl ist negativ dec wl ;Zehner runter und subi xl,-10 ;10 addieren bis Überlauf erfolgt brlo pc-2 ;Überlauf? nein, 2 Zeilen hoch... rcall lcd_data ;ja, Zehner Stelle ausgeben... ldi wl,'0' ;ASCII-0 add wl,xl ;Einer addieren (Rest war ja positiv) rcall lcd_data ;Einer ausgeben... pop wl ;Reg wiederherstellen ret ;zurück Da man gelegentlich auch andere Zahlenformate in ASCII-Text umwandeln und am LCD ausgeben muss, ist diese Routine Teil einer Sammlung ähnlicher Routinen für andere Formate, die so nach und nach gewachsen ist. Weitere Beispiele findest du in der Codesammlung oder wenn du mal nach "8x24" oder "4x27" suchst und die dort gefundenen Links verfolgst. ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.