OLED RS0010 library Arduino

  • Hallo Peter,


    ich versuche noch eine Methode des LCD Updates zu beschreiben.


    Angenommen den LCD hat 2 Zeilen * 16 Zeichen = 32 Zeichen und das Programm läuft im 1ms Zeitintervall.

    Das bedeute jeder Thread wird genau alle 1ms ausgeführt.


    Neu: ein Thread ist der LCD Update, er arbeitet laufend und gibt nacheinander (alle 1ms) ein Zeichen aus.

    Die Zeichen stehen im SRAM und bilden das LCD virtuell im SRAM, hier 2 Zeilen x 16 Zeichen, ab.


    Diese sind als Array mit 2 Zeilen x 16 Spalten als vLCD(x,y) organisiert und auf diese ist der Zugriff sehr einfach.


    Alle LCD Ausgaben über ein Programm erfolgen dann nur noch in das virtuelle LCD!


    Über ein LCD Update muss man sich keine Gedanken mehr machen, denn 32 ms sind alle Zeichen ausgegeben.

    Auch ist für das normale Schreiben eines Zeichen auf das reale LCD keine Wartezeit mehr einzuhalten, das sind i.A. ca 50µs, da das nächste Zeichen im diesem Beispiel erst nach weiteren 1ms erfolgt.


    Wie dargestellt, schreiben die neue LCD Ausgaberoutinen nur noch in das SRAM und das erfolgt immer mit maximaler Geschwindigkeit.


    Einige LCD Funktionen, wie .SetCursor(y,x), .ClearScreen() oder .Home() werden einfach Simuliert und schreiben weiterhin nun noch in das SRAM LCD_virtuell(x,y).


    .SetCursor(y_new,x_new) verändert den Schreibzeigervektor (x_current,y_current) = (x_new, y_new)

    .ClearScreen() schreibt 0x20 in alle Speicherzellen und verändert den Schreibzeigervektor (x,y) nicht.

    .Home() hingegen ruft .ClearScreen() auf und verändert den Schreibzeigervektor (x_current,y_current)=(0,0).


    Beim Schreiben der Zeichen vom SRAM auf das LCD, muss man nur die Überläufe der Zeilen- und Spaltenadressierung beachten.

    Zeile: x E {0,..,15} und Spalte: y E {0,1}


    Anm.: Pseudo C.


    Bsp. Vektorschreibweise:

    byte x_write = 0, y_write = 0;

    byte x_read= 0, y_read = 0;


    set_Cursor(y, x) {

    x_write = x;

    y_write = y;

    }


    write_vLCD(ch) {

    vLCD(x_write, y_write) = ch;

    if(++ x_write > 15) {

    x_write = 0;

    if (++ y_write > 1) {

    y_write = 0;

    }

    }

    }


    byte read_vLCD() {

    byte ch;

    ch = vLCD(x_read, y_read);

    if(++ x_read > 15) {

    x_read = 0;


    if (++ y_read > 1) {

    y_read = 0;

    }

    }

    return ch;

    }


    write_to_LCD(y, x, ch) {

    LCD.setCurosr(y, x);

    LCD.writeChar_noWait( ch );

    }

    Ein Mensch kann maximal 3 - 4 LCD Updates pro Sekunden wahrnehmen, also 333 ms bis 250 ms für den gesamten LCD Inhalt.