www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EA DOG-M Display (ST7046) und customchars. ARGH!


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute.

Ich benutze die Initialisation aus der Controllerbeschreibung.
  lcd_cmd4(3);    //3xFunc Set
  lcd_cmd4(3);
  lcd_cmd4(3);
  lcd_cmd4(2);    //Func Set 4Bit

  lcd_cmd8(0b00101001);  //Func Set
  lcd_cmd8(0b01111000);  //Contrast
  lcd_cmd8(0b01011110);  //POWER/Icon/Contrast
  lcd_cmd8(0b01101010);  //Follower Control
  lcd_cmd8(0b00001100);  //Display ON/OFF
  lcd_cmd8(0b00000001);  //Clear Screen
  _delay_ms(2);  
[C]

Das funktioniert sowas von Astrein!

Nun will ich aber meine Customchars draufladen.
Also? Ich dachte folgendes:

[C]
  lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
  lcd_cmd8(0b01000000); //CGRAM Adresse 0

  lcd_cmd8(0b000111111);
  lcd_cmd8(0b000111111);
  lcd_cmd8(0b000111111);
  lcd_cmd8(0b000111111);
  lcd_cmd8(0b000111111);
  lcd_cmd8(0b000111111);  //Daten
  lcd_cmd8(0b000111111);
  lcd_cmd8(0b000111111);

  lcd_cmd8(0b100000000); //DDRAM Adresse 0

Das habe ich nach der Initialisierung eingefügt und es will verdammt
nochmal nicht klappen. Die Customchars werde zwar im Display eingefügt,
sind aber vollkommen leer (wie Leertaste, Also kein Bildpunkt ist
gesetzt). Weiterhin zeigt das Display eine ganz komische Eigenschaft:
Wenn ich den Controller resette und die Routinen oben nochmal
ausgeführt werden, wird der Text am Display an den bestehenden
angefügt. Es wird also nicht der Bildschirm gelöscht, komischerweise...
das ist ohne die zweite Routine definitiv nicht so.

Hat irgndjemand das schonmal gemacht? Das Display ist über den 4Bit Bus
an meinem Controller angeschlossen.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och nö! hier nochmal ordentlich formatiert:


Hi Leute.

Ich benutze die Initialisation aus der Controllerbeschreibung.
      lcd_cmd4(3); //3xFunc Set
      lcd_cmd4(3);
      lcd_cmd4(3);
      lcd_cmd4(2); //Func Set 4Bit
       
      lcd_cmd8(0b00101001); //Func Set
      lcd_cmd8(0b01111000); //Contrast
      lcd_cmd8(0b01011110); //POWER/Icon/Contrast
      lcd_cmd8(0b01101010); //Follower Control
      lcd_cmd8(0b00001100); //Display ON/OFF
      lcd_cmd8(0b00000001); //Clear Screen
      _delay_ms(2);

      Das funktioniert sowas von Astrein!
      Nun will ich aber meine Customchars draufladen.
      Also? Ich dachte folgendes:
      lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
      lcd_cmd8(0b01000000); //CGRAM Adresse 0
       
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111); //Daten
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);

      lcd_cmd8(0b100000000); //DDRAM Adresse 0 

Das habe ich nach der Initialisierung eingefügt und es will verdammt
nochmal nicht klappen. Die Customchars werde zwar im Display
eingefügt,
sind aber vollkommen leer (wie Leertaste, Also kein Bildpunkt ist
gesetzt). Weiterhin zeigt das Display eine ganz komische Eigenschaft:
Wenn ich den Controller resette und die Routinen oben nochmal
ausgeführt werden, wird der Text am Display an den bestehenden
angefügt. Es wird also nicht der Bildschirm gelöscht,
komischerweise...
das ist ohne die zweite Routine definitiv nicht so.

Hat irgndjemand das schonmal gemacht? Das Display ist über den 4Bit
Bus
an meinem Controller angeschlossen.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edit: Ich meine natürlich den ST7036 Controller, nicht ST7046. Bin heute
nicht so ganz auf der Höhe ;)

Autor: Tobias Tetzlaff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei mir in C siehts so aus:

// Declare your global variables here
typedef unsigned char byte;

/* table for the user defined character*/
// Accu voll
flash byte char1[8]={
0b0000110,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b 
0000000};
// Accu ok
flash byte char2[8]={
0b0000110,0b0001001,0b0001001,0b0001111,0b0001111,0b0001111,0b0001111,0b 
0000000};
// Accu leer
flash byte char3[8]={
0b0000110,0b0001001,0b0001001,0b0001001,0b0001001,0b0001001,0b0001111,0b 
0000000};
// Glühkerze defekt
flash byte char4[8]={
0b0000100,0b0000100,0b0001110,0b0011111,0b0011111,0b0001010,0b0001110,0b 
0000000};
// Temperatursensor defekt
flash byte char5[8]={
0b0000100,0b0001010,0b0001010,0b0001110,0b0011111,0b0011111,0b0001110,0b 
0000000};
// Pumpe läuft / Pumpenspannung
flash byte char6[8]={
0b0011100,0b0010100,0b0011100,0b0010000,0b0010101,0b0000101,0b0000111,0b 
0000010};
// Schalterbetrieb
flash byte char7[8]={
0b0010000,0b0010000,0b0011001,0b0000010,0b0000100,0b0001000,0b0010000,0b 
0010000};

/* function used to define user characters */
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}

Aufrufen der Funktion :

// LCD module initialization
    lcd_init(16);
    lcd_clear();
    // Setze LCD Kontrast Zurück zur Tabelle 0:1
    lcd_contrast(contrast);

        // User define Charachters
        define_char(char1,1);
        define_char(char2,2);
        define_char(char3,3);
        define_char(char4,4);
        define_char(char5,5);
        define_char(char6,6);
        define_char(char7,7);

Und anzeigen der Zeichen:

// switch to writing in Display RAM
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("Akku:");

        // display used defined char 0
        lcd_putchar(1);
        lcd_putchar(2);
        lcd_putchar(3);

        // switch to writing in Display RAM
        lcd_gotoxy(0,1);
        lcd_putsf("Glow:   Temp:");

        // display used defined char 0
        lcd_gotoxy(6,1);
        lcd_putchar(4);
        lcd_gotoxy(14,1);
        lcd_putchar(5);

        // switch to writing in Display RAM
        lcd_gotoxy(0,2);
        lcd_putsf("Pump:   Swit:");

        // display used defined char 0
        lcd_gotoxy(6,2);
        lcd_putchar(6);
        lcd_gotoxy(14,2);
        lcd_putchar(7);

        delay_ms( 250 );

Leider ohne Komentar, aber vielleicht hilft es ja.

Gruß Toby

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versteh deinen Code schon, keine Angst.

Aber warum setzt du denn, bevor du die CGRAM Adresse und die Bytes mit
der Funktion define_char schickst, das Display auf die Table 0:1 ?

in Table 0:1 ist der eigentliche 'Set CGRAM Adress' Befehl der
'Contrast Set' Befehl... kratz..

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe die Lib vom Codevision etwas geändert, um das DOGM damit
nutzen zu können.

Der Contrast Befefl ist von mir.
Bei der Inti lade ich einen bestimmten Contrastwert, den ich dann,
falls nötig, ändern kann.
War nur so ein Test.

Den CGRAM beschreibe ich nach der Init.
Dabei muß das Display auf Tabelle 0:1 stehen.

Anliegend ist mal meine LIB, die H und ein kleines Prog.

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
die h.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze kein Codevision AVR..

Wieso schreibst du denn ins CGRAM, bloß wenn du die Tabelle auf 0,1
stellst? Also wenn ich da was schreibe, schreibe ich ins DDRAM und das
wird auf dem Display angezeigt.

Normalerweise muss man ja, bevor man ins CGRAM schreibt, erst die CGRAM
Adresse setzen. Dann weiß der Controller bescheid. Und wenn man wieder
aufs Display schreiben möchte, muss man die DDRAM Adresse setzen. Aber
das machst du ja garnicht.

Diese Doku von dem DOG-M ist so unverständlich... hmpf!

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Prog steht aber nur das interessante fürs LCD.

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Unverständlichkeit habe ich auch gekämpft.

Großes Prob war alleine schon die Init.

Ich habe erst die vom Datenblatt versucht.
Später die vom Controller.
Damit ging es dann auch.

Wegen der Tabellen schaue ich eben noch mal nach.

Aufjeden Fall geht es so, wie ich es habe.

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,

hier ist das Programm, an dem ich grade arbeite, ud auf dem ich eben
die eigenen Zeichen angezeigt bekomme.

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal,

so siehts im Moment aus.

Gruß Toby

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich blick danicht durch. Wo sieht man denn die lcd_init() deklariert?

Wo schaltest du denn zwischen den Instruction Tabellen um? Kann mir
irgndwie nicht vorstellen dass das so funktioniert...

Autor: Tobias Tetzlaff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hier das Init :

// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns)
{
#asm
    cbi   __lcd_port,__lcd_enable ;EN=0
    cbi   __lcd_port,__lcd_rs     ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x90;
_base_y[3]=lcd_columns+0xA0;
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x20);
_long_delay();

_lcd_ready(); // RS=0
_lcd_write_data(0x29);

_lcd_ready(); // RS=0
_lcd_write_data(0x14);

_lcd_ready(); // RS=0
_lcd_write_data(0x7A);

_lcd_ready(); // RS=0
_lcd_write_data(0x51);

_lcd_ready(); // RS=0
_lcd_write_data(0x6A);

_lcd_ready(); // RS=0
_lcd_write_data(0x0C);

_lcd_ready(); // RS=0
_lcd_write_data(0x01);

_lcd_ready(); // RS=0
_lcd_write_data(0x06);


Es steht in der Dog_LCD.lib

Zurück in die Tabelle 0:1 geht man durch clear_lcd.
Setze ich einen anderen Contrast oder eine Doppelte Zeilenhöhe,
gehe ich vorher in eine andere Tabelle:

void lcd_high (char high)
{
switch (high) {
    case 1:
        //3 Zeienbetrieb
        _lcd_ready(); // RS=0
        _lcd_write_data(0X28);
    break;
    case 2:
        //unteren beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x10);  //UD auf 1
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    case 3:
         //oberen beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x18);  //UD auf 0
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    };

}

Das ist genau die Init und Beschreibung, die im Datenblatt des
Controllers steht, und sie funktioniert.

Bitte hänge doch mal dein Programm incl. der Init des LCD an,
ich seh es mir mal an.

Gruß Toby
Gruß Toby

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Init schaut so:
  lcd_cmd4(3);    //3xFunc Set
  lcd_cmd4(3);
  lcd_cmd4(3);
  lcd_cmd4(2);    //Func Set 4Bit

  lcd_cmd8(0b00101001);  //Func Set
  lcd_cmd8(0b01111000);  //Contrast
  lcd_cmd8(0b01011110);  //POWER/Icon/Contrast
  lcd_cmd8(0b01101010);  //Follower Control
  lcd_cmd8(0b00001100);  //Display ON/OFF
  lcd_cmd8(0b00000001);  //Clear Screen
  _delay_ms(2);  

Und die Routine, womit ich versucht habe CCs in das Display zu laden
ist folgende:
      lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
      lcd_cmd8(0b01000000); //CGRAM Adresse 0

      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111); //Daten
      lcd_cmd8(0b000111111);
      lcd_cmd8(0b000111111);
       
      lcd_cmd8(0b100000000); //DDRAM Adresse 0 

Und was ist daran jetzt anders als bei dir? Ich schalte auf die Table 0
um an die CGRAM Adressbefehle zu kommen und schreibe eine CGRAM
Adresse.. Danach 8x Daten und anschließend wieder die DDRAM Adresse 0
um wieder ASCII Daten übertragen zu können.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verdammt, ich raffe es nicht. Dieses Display ist so schlecht
dokumentiert, oder ich habe wirklich einen Fehler in meinem Code.

ich hab mal die gesamte lcd.c angehangen. Überhalb von der Funktion
lcd_init sind die nicht-gepufferten Befehle und unterhalb sind die
gepufferten. lcd_init steht irgndwo in der mitte.

da siehst du, wie ich kläglich versuche den CustomChar 0 zu
beschreiben.

Es klappt aber nicht. Das Display verhält sich total komisch und tut
so, als würde es die 8 Zeichen auf mein Display ausgeben. Aber da sind
nur leere Felder.

Das CustomChar gebe ich mit lcd_putc(0); aus.

Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
grummel

Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Halt Stop! Da ist noch ein Fehler drin bei der Customchar-schreibsache.

Hier richtig, aber dennoch unfunktionierend.

Autor: Tobias Tetzlaff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

immer noch dabei?

Nun ja, mit welchem Compiler machst Du das ganze?

Ich würde gerne mal dein Prog bei mir ausprobieren.

Kannst es mir ja mal per Mail schicken.
Aber bitte hab Verständniss dafür, das ich nicht alles schreiben will,
damit es bei mir läuft.
Außerdem könnte es etwas dauern, da ich von einem Jahr mein DOGM zum
laufen gebracht hab, und hatte es bis heute so gelassen.

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

ich habe auch mal die Peter Flurry Lib fürs DOGM umgeschrieben.

Anliegend zeigt mein DOGM 163 ein Copyright Zeichen an.

Vielleicht hilft dir das???

Bei mir läuft es auf jeden Fall!

Gruß Toby

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ich gebs auf. Was soll das denn... Istmir jetzt zu umständlich dir
die relevanten Sachen herauszupflücken.

Naja Danke für die Hilfe..

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey Simon,

ich habe nun was rausgefunden!

Schau Dir nochmal angehängten Code an.

Die Lib ist in dem Zipfile von voher.

Setzt man die Double High auf 1 also 3 Zeilen Betrieb,
wird kein (c) Zeichen angezeigt.
Auf lcd_lines(2) oder (3) gehts.

Da ich immer mein Display beim Startup Bildschirm auf (3) oberen zeilen
zusammen gesetzt habe, ist mir das Problem nie aufgefallen.

Danach habe ich es wieder auf (1) gesetzt, und dann irgendwann mal den
GCRAM beschrieben.

Also, was macht die Funktion lcd_lines(3) anderes, als die
lcd_lines(1)???

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, Fehler,

es geht nur, wenn lcd_lines auf 3 steht!
Stellt man dann um auf (1), wirds immer noch angezeigt.
Auch nach Power on reset.

Gruß Toby

Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal, es lässt mir keine Ruhe!

Also, erst auf Tabelle 0:0 (0x28) stellen, stimmt so.
geht jetzt bei mir auch.

Dann kommts :

Der RS Pin steht zum Init auf 0, richtig.

void lcd_cmd8(unsigned char cmd)
{

  LCD_PORT = (cmd & 0xF0) >> 4;

  LCD_PORT &= ~(1<<LCD_RS);

...
...

Aber beim CGRAM Beschreiben muß er auf 1 stehen.

So stehts in meiner Lib.

/* rs==0 -> write instruction to LCD_IO_FUNCTION */
/* rs==1 -> write data to LCD_IO_DATA */

Steht auch so im Datenblatt auf Seite 26.

Wenns klappt, sag kurz bescheid.

Gruß Toby

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das war der Fehler im ersten Code den ich angehangen habe. Guck mal
in den zweiten (Datum: 06.06.2006 19:51).

Da habe ich das verbessert. Klappt trotzdem noch nicht.
Nett dass du dir meinen Code ansiehst, aber ich glaube ehrlichgesagt,
dass das keinen Sinn mehr hat.. Irgndwo wird da der Wurm sein, aber
mein Programm läuft ohne die Funktion ja einwandfrei.. Gibts halt
keinen Bargraphen auf dem Display ;)

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal. Ich habe da noch eine Differenz zwischen unserern Codes
sehen können.

Vielleicht ist das die Lösung:
Du schreibst vor jedem Byte, dass in den CGRAM geladen wird die CGRAM
Adresse neu. Vielleicht sollte ich das auch mal versuchen, wobei das
Datenblatt das ja eigentlich nicht explizit vorschreibt.

(Da stand doch irgndwas davon, dass der Ram Counter inkrementiert wird,
wenn ein Byte geschrieben wird. Und das Ziel des Schreibens wird durch
ein vorhergehendes Adresssetzen gesetzt..)

Naja ein Versuch ist es allemal wert.

Autor: Dennis Kleine-Beck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe festgestellt, dass die Mitarbeiter bei
http://www.lcd-module.de recht zügig und kompetent auf technische
Anfragen reagieren. Schon mal probiert?

Gruß,
Dennis

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal eine Email geschrieben. Dank dir für den Tipp!

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon ein alter Thread, ich weiß, aber ist das Problem damals gelöst 
worden??
Verzweifle auch gerade an diesem Problem...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, habs in die Ecke geschmissen. Ziemlich frustrierend die 
Dokumentation...

Autor: Philipp Putzer (putzer_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dietmar

Noch daran interessiert? Hatte anfangs auch Probleme damit!


Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert nun endlich auch hier :-)
Keine Ahnung was falsch war.
Bin platt. Auf einmal hats funktioniert.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da krieg ich's Aufstoßen!

>:(

Autor: Dietmar (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Hier mein Code:
// LCD-Modul an PortC
#asm
    .equ __lcd_port=0x15
#endasm
// LCD-Functions
#include <dog_lcd.h>

typedef unsigned char byte;
// Test Pfeil aus Hilfe   
flash byte char0[8]={
0b0000000,0b0001111,0b0000011,0b0000101,0b0001001,0b0010000,0b0100000,0b1000000};
// Accu voll
flash byte char1[8]={
0b0000110,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0000000};
// Accu ok
flash byte char2[8]={
0b0000110,0b0001001,0b0001001,0b0001111,0b0001111,0b0001111,0b0001111,0b0000000};
// Accu leer
flash byte char3[8]={
0b0000110,0b0001001,0b0001001,0b0001001,0b0001001,0b0001001,0b0001111,0b0000000};
// Glühkerze defekt
flash byte char4[8]={
0b0000100,0b0000100,0b0001110,0b0011111,0b0011111,0b0001010,0b0001110,0b0000000};
// Temperatursensor defekt
flash byte char5[8]={
0b0000100,0b0001010,0b0001010,0b0001110,0b0011111,0b0011111,0b0001110,0b0000000};
// Pumpe läuft / Pumpenspannung
flash byte char6[8]={
0b0011100,0b0010100,0b0011100,0b0010000,0b0010101,0b0000101,0b0000111,0b0000010};
// Schalterbetrieb
flash byte char7[8]={
0b0010000,0b0010000,0b0011001,0b0000010,0b0000100,0b0001000,0b0010000,0b0010000};

/* function used to define user characters */
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}

Und dieser Codeteil dann im Main:
// LCD module initialization (16 Zeichen pro Zeile)
lcd_init(16);
lcd_clear();
lcd_contrast(10);
define_char(char0,0);
define_char(char1,1);
define_char(char2,2);
define_char(char3,3);
define_char(char4,4);
define_char(char5,5);
define_char(char6,6);
define_char(char7,7);
lcd_clear();

lcd_putchar(0x00);
lcd_putchar(0x01);
lcd_putchar(0x02);
lcd_putchar(0x03);
lcd_putchar(0x04);
lcd_putchar(0x05);
lcd_putchar(0x06);
lcd_putchar(0x07);

Die Library ist im Anhang!
Damit funzt es prima.

Autor: Jim Deery (linuxmarine)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I am new to this forum.  Please excuse me I do not understand german.
I am trying create a character with the ST7036 lcd driver.  I am looking 
at the aboce example, but I do not know Atmel assembly.  I do know ATmel 
C.

Are there any more examples out there on how to create speacial 
characters in C?

Thank you!

Autor: Basti M. (counterfeiter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da ich auch rumprobiert habe und das ganze ohne die lib von ea...

hier mal meine Lösung für nachfolgende Suchanfragen:
void Vertikale_Balken(void) 
{
  for(uint8_t i=0;i<8;i++) {
    if(i>6)
      SPDR = 0b00011111;
    else
      SPDR = 0b00000000;
    _delay_ms(0.03);
    CONTROLPORT &= ~_BV(CTRL_RS);
    CONTROLPORT |= _BV(CTRL_RS);
  }

  //hier
        //noch
        //balken...

  for(uint8_t i=0;i<8;i++) {
    SPDR = 0b00011111;
    _delay_ms(0.03);
    CONTROLPORT &= ~_BV(CTRL_RS);
    CONTROLPORT |= _BV(CTRL_RS);
  }
}
//bedingung ist, dass instruction tabel 0 0 aktiviert ist
void define_char(void)
{ 

    CONTROLPORT &= ~_BV(CTRL_RS);
                //auf erstes freies Zeichen zeigen
    SPDR = 0b01000000;
    _delay_ms(0.1);
    CONTROLPORT |= _BV(CTRL_RS);
          CONTROLPORT &= ~_BV(CTRL_RS);  
    CONTROLPORT |= _BV(CTRL_RS);
    _delay_ms(0.1);

    //Aussehen
    Vertikale_Balken();

                //wieder in Displayspeicher zeigen
    CONTROLPORT &= ~_BV(CTRL_RS);
    SPDR = 0b10000000;
    _delay_ms(0.1);
    
}

noch irgendwo define_char() aufrufen und zeichen sind geschrieben...

grüße

Basti

Autor: Tino Kühn (blumengiesser)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich habe auch ewig mit der doku des display gehadert und schließlich 
eine umfassende lib für den spi mode geschrieben. da klappt alles. für 
den 4/8bit mode muss halt nur die Funktion dazugeschrieben werden. 
vielleicht werdet ihr daraus ja schlau. ist im anhang. würde mich über 
feedback freuen.

tino

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.