-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Zeilenumbruch Display LCD

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Zeilenumbruch Display LCD

    Anzeige

    Hallo,
    wie programmiert ihr einen Zeilenumbruch?

    LCD: 4*20 Zeichen

    Der Text wird über die serielle Schnittstelle -> UDR empfangen und in einem String*20 geschrieben.

    Nun war die Überlegung den String*80 zu machen und mit MID aufzuteilen. Leider habe ich hier nur einen ATtiny2313 zur Verfügung und der schafft nur String*60 maximal.

    Was mir aufgefallen ist: Wenn ich mehr als 20 Zeichen sende, erscheinen die aber (etwas abgehackt) trotzdem auf dem LCD? wieso? wird der String nicht erst wieder leer gemacht und dann mit LCD auf dem Display überschrieben?

    Tobias

    mein Code bisher...
    Code:
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    
    $regfile = "ATtiny2313.dat"                                 'ATtiny2313-Deklarationen
    
    $hwstack = 32
    $swstack = 8
    $framesize = 24
    
    
    '$crystal = 14745600                                         'Quarz: 14,7456 MHz
    $crystal = 8000000
    $baud = 9600                                                'Baudrate definieren
    '-------------------------------------------------------------------------------
    'Ein / Ausgänge definieren:
    Ddrd = &B1111111                                            'Pin PD5-0 als Eingang / 6 als Ausgang (LCD) konfigurieren
    Ddrb = &B11111111
    
    'PullUps setzen:
    Portd = &B0111100                                           '1 = PullUp AKTIV
    Portb = &B00100000                                          '1 = PullUp AKTIV
    
    '-------------------------------------------------------------------------------
    'LCD konfiguration
    Config Lcd = 20 * 4                                         'LCD größe
    Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.3 , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Portd.6
    Cursor Off Noblink
    
    '-------------------------------------------------------------------------------
    'Alias
    Taster1 Alias Pind.2
    Taster2 Alias Pind.3
    Taster3 Alias Pind.4
    Taster4 Alias Pind.5
    Taster5 Alias Pinb.5
    
    
    '-------------------------------------------------------------------------------
    'Variablen
    Dim Parameter As String * 20                                'max 60
    Dim E_byte As Byte , E_flag As Byte
    
    
    '-------------------------------------------------------------------------------
    Cls
    Locate 1 , 1
    Lcd "RS232 - LCD"
    
    '-------------------------------------------------------------------------------
    'Für RS232:
    On Urxc Onrxd                                               'Interrupt-Routine setzen
    Enable Urxc                                                 'Interrupt URXC einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    
    
    '-------------------------------------------------------------------------------
    
    Do                                                          'Hauptschleife
    
    
    
    'Tasterabfrage:
    If Taster1 = 0 Then
    Print "Taster1"
    Cls
    Lcd "Taster1"
    End If
    
    
    
    'RS232 - Empfang umwandeln
    If E_flag = 1 Then                                          'Empfangsstring komplett
    '  Substring = Mid(String , A , B)
    Print Parameter
    Cls
    Lcd Parameter
    
    Parameter = ""                                              'Parameter löschen
    E_flag = 0                                                  'Empfang neu setzen
    
    End If
    
    
    Loop
    
    
    
    '-------------------------------------------------------------------------------
    Onrxd:
    
    E_byte = Udr
    
    
    If E_byte = 13 Then                                         '13 = CR (Enter)
    E_flag = 1
    Else
    Parameter = Parameter + Chr(e_byte)
    End If
    
    Return
    ...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Wenn ich mehr als 20 Zeichen sende, dann erscheinen die ersten 20 in der 1. Zeile, das 21. Zeichen in der 3.Zeile dann kommt zwei mal "CR" also Zeichen 13. Das 22. Zeichen von meinen gesendeten fehlt und dann gehts mit dem 23.Zeichen weiter:

    12345678901234567890

    1""3456 u.s.w.
    ...

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Also die 4 Zeilen habe ich nun mit MID aufgeteilt. Habe beim probieren gemerkt das man direkt auf das LCD schreiben kann

    Code:
    'RS232 - Empfang umwandeln
    If E_flag = 1 Then                                          'Empfangsstring komplett
    Print Parameter
    Cls
    Locate 1 , 1
    Lcd Mid(Text , 1 , 20)
    Locate 2 , 1
    Lcd Mid(text , 21 , 20)
    Locate 3 , 1
    Lcd Mid(text , 41 , 20)
    Locate 4 , 1
    Lcd Mid(text , 61 , 20)
    
    Text = ""                                                   'Parameter löschen
    E_flag = 0                                                  'Empfang neu setzen
    
    End If
    
    Loop
    
    
    '-------------------------------------------------------------------------------
    Onrxd:
    
    E_byte = Udr
    
    If E_byte = 13 Then                                         '13 = CR (Enter)
    E_flag = 1
    Else
    Text = Text + Chr(e_byte)
    End If
    
    Return
    Leider funktioniert das nur in den 1ten 3 Zeilen und in der zweitenzeile ist immer noch dieser Fehler das ein Zeichen fehlt also 12"4567
    ...

  4. #4
    Wenn Du Texte an das LCD schickst werden diese in das so genannt DDRAM geschrieben. Dieses hat in der Regel eine Größe von 80 Bytes.

    Die einzelnen Zeilen des Displays zeigen nur einen Ausschnitt dieses Speichers. Schreibst du nun Texte in den Speicher werden die ersten 20 Zeichen in der 1. Zeile gezeigt, die nächsten 20 in der 3. Zeile dann 20 Zeichen in der 2. Zeile und die letzten 20 Zeichen erscheinen in der letzten Zeile

    Steuerzeichen wie 'Return' oder 'Zeilenvorschub' kennt das LCD nicht.

    Bei den Zeilen 3 und 4, bei 4 zeiligen Displays gibt es hin und wieder Unterschiede. Da müsstest du einmal ins Datenblatt schauen.

    Evtl. musst du bei der Initialisierung auch einen anderen Chipsatz angeben. Wird nichts angegeben, nimmt Bascom an das du mit einem HD44780 oder kompatible arbeitest.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Wie in vielen anderen Foren auch, führst du Schnellschussselbstgespräche.@Hr Blome

    Grab Dich vorm Texten besser für 10 Minuten im Keller ein um nachzudenken.

    Laserist Gento

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    @Geno: ok

    Tobi
    ...

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    tja anscheinend gibt es keine andere Möglichkeit.
    Die Variable hat 60 Zeichen - mehr Speicher hat der µC nicht - das reicht also nur für 3 statt 4 Zeilen(also 3x20Zeichen). Also werde ich wohl einen größeren µC nehmen.

    Tobias

    Code:
    If E_flag = 1 Then                                          'Empfangsstring komplett
    
    Cls
    Locate 1 , 1
    Lcd Mid(text , 1 , 20)
    Locate 2 , 1
    Lcd Mid(text , 21 , 20)
    Locate 3 , 1
    Lcd Mid(text , 41 , 20)
    Locate 4 , 1
    Lcd Mid(text , 61 , 20)
    Text = ""                                                   'Parameter löschen
    E_flag = 0                                                  'Empfang neu setzen
    
    End If
    ...

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Wieso den ganzen Text speichern?
    Es reicht doch, in 2 Variablen abzulegen, in welcher Zeile und Spalte der Cursor des LCD gerade ist.
    Dann jedes Zeichen einzeln zum Display schieben und dabei die Spaltenvariable um eins erhöhen; erreicht man das Zeilenende (Spalte = 20), dann ab in die nächste Zeile (Spalte = 1, Zeile = Zeile + 1).
    #ifndef MfG
    #define MfG

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    ominöser Doppelpost... entfernt...
    #ifndef MfG
    #define MfG

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Danke Jaecko!!!
    auf die Idee bin ich noch nicht gekommen - super!!! Werde ich am Wochenende testen

    Danke,
    Tobias
    ...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •