Werte an LCD ausgeben

Diskutiere Werte an LCD ausgeben im Developer Network Forum im Bereich Hardware & Software Forum; Hallo Powerforumler, ich habe ein Assembler-Programm, mit dem ich einen Atmel 89C51 programmiert habe. Das Programm soll die Werte des Potis auf...
  • Werte an LCD ausgeben Beitrag #1
M

Maxl

Neues Mitglied
Dabei seit
08.03.2008
Beiträge
1
Reaktionspunkte
0
Hallo Powerforumler, ich habe ein Assembler-Programm, mit dem ich einen Atmel 89C51 programmiert habe. Das Programm soll die Werte des Potis auf dem Board an der LCd ausgeben. Das Poti ist an Ain0 angeschlossen. Nun muß noch die Werte eines zweiten Potis über die LCD ausgeben, welches an Ain1 angeschlossen ist. Ich bekomm einfach kein funktionierendes Programm hin. Der erste Teil für ein Poti funktioniert und sieht so aus
Code:
code at 0
include c51rd2.inc
extern code ain0
extern code dezaus
extern code initLCD
extern code cursorpos
extern code loeschen   
   
        orl pcon,#80h
        mov th1,#243
        mov tl1,#243
        anl tmod,#00001111b
        orl tmod,#00100000b
        setb tr1
        mov scon,#01010000b
   
   
    call initLCD
   call loeschen
anf:   
    mov A,#0
   call cursorpos
    call ain0 ;Daten stehen in A
   
   mov R3,A        ;save A
   mov B,#100
   div AB        ;1 steht in A,27 in B
   ADD A,#30h    ;Zahl->ASCII
   lcall seraus
   mov A,B
   mov B,#10
   div AB        ;2 im Akku, 7 in B
   ADD A,#30h
   lcall seraus
   mov A,B
   ADD A,#30h
   lcall seraus
   mov A,#10
   lcall seraus
   mov A,#13
   lcall seraus
   mov A,R3        ; restore A

    mov p2, A
   
    call dezaus
    jmp anf
   
    seraus:
    mov sbuf,A
warte:
    jnb ti, warte
    clr ti
   ret
. Danke schon mal für eure Hilfe. Gruß Maxl
 
  • Werte an LCD ausgeben Beitrag #2
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Hi! Ich hab mir dein Programm jetzt zwar nicht angesehen, weil ich von ASM auf der Controller-Serie keine Ahnung habe.
Aber ein paar allgemeine Tipps zu den Displays (ich geh jetzt mal davon aus, dass du von einem gewöhnlichen HD44780-Textdisplay sprichst):
Das Hauptproblem bei den gewöhnlichen Text-LCDs ist das richtige Timing. Man muss genau auf die Wartezeiten speziell bei der Initialisierung achten, und auch darauf, bei welcher Flanke des Enable-Signals das Display RS und RW, bzw. D0-7 übernimmt.
Das kann sonst mitunter ziemlich abenteuerliche Fehler geben.
 
  • Werte an LCD ausgeben Beitrag #3
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Wenn der erste Teil, den Du gepostet hast, funktioniert, dann sollte der Rest einfach zu bewerkstelligen sein.
Die wichtigsten Teile liegen ja schon als Unterprogramme vor, so daß Du Dich nicht mit mir der Displayansteuerung herumplagen mußt.

Ohne jetzt den Assemblercode und den Prozessor genauer zu kennen, sollte das funktionieren oder zumindest ein Ansatz sein:

Code:
code at 0
include c51rd2.inc
extern code ain0
extern code ain1        ; Existiert diese Funktion?
extern code dezaus
extern code initLCD
extern code cursorpos
extern code loeschen   
   
        orl pcon,#80h
        mov th1,#243
        mov tl1,#243
        anl tmod,#00001111b
        orl tmod,#00100000b
        setb tr1
        mov scon,#01010000b
   
   
    call initLCD
   call loeschen
anf:   
    mov A,#0
   call cursorpos
    call ain0 ;Daten stehen in A
   
   mov R3,A        ;save A
   mov B,#100
   div AB        ;1 steht in A,27 in B
   ADD A,#30h    ;Zahl->ASCII
   lcall seraus
   mov A,B
   mov B,#10
   div AB        ;2 im Akku, 7 in B
   ADD A,#30h
   lcall seraus
   mov A,B
   ADD A,#30h
   lcall seraus
   mov A,#10
   lcall seraus
   mov A,#13
   lcall seraus
   mov A,R3        ; restore A

    mov p2, A
   
    call dezaus

   ; ab hier der Code fürs 2.te Poti
   call ain1 ;Daten stehen in A
   
   mov R3,A        ;save A
   mov B,#100
   div AB        ;1 steht in A,27 in B
   ADD A,#30h    ;Zahl->ASCII
   lcall seraus
   mov A,B
   mov B,#10
   div AB        ;2 im Akku, 7 in B
   ADD A,#30h
   lcall seraus
   mov A,B
   ADD A,#30h
   lcall seraus
   mov A,#10
   lcall seraus
   mov A,#13
   lcall seraus
   mov A,R3        ; restore A

    mov p2, A
   
    call dezaus



    jmp anf
   
    seraus:
    mov sbuf,A
warte:
    jnb ti, warte
    clr ti
   ret
Im Prinzip habe ich den entscheidenden Code nur verdoppelt. Das setzen der Cursorposition habe ich weggelassen und muß evtl. bei einem einzeiligen Display wieder eingefügt werden. Vorrausgesetzt habe ich, daß es - analog zu ain0 - eine externe Funktion ain1 gibt. Falls nicht, mußt Du die programmieren. Sollte aber in Großem und Ganzen auch nur Copy&Paste von ain0 zzgl. der Anpassung einiger Register/Ports sein.

Evtl. mußt Du den zweiten Wert statt in p2 noch wo anders abspeichern. Es ginge auch noch eleganter, in dem man den doppelten Code in ein Unterprogramm packt, aber zum Testen sollte das erstmal reichen.
 
Thema:

Werte an LCD ausgeben

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben