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


von Simon K. (simon) Benutzerseite


Lesenswert?

Hi Leute.

Ich benutze die Initialisation aus der Controllerbeschreibung.
1
  lcd_cmd4(3);    //3xFunc Set
2
  lcd_cmd4(3);
3
  lcd_cmd4(3);
4
  lcd_cmd4(2);    //Func Set 4Bit
5
6
  lcd_cmd8(0b00101001);  //Func Set
7
  lcd_cmd8(0b01111000);  //Contrast
8
  lcd_cmd8(0b01011110);  //POWER/Icon/Contrast
9
  lcd_cmd8(0b01101010);  //Follower Control
10
  lcd_cmd8(0b00001100);  //Display ON/OFF
11
  lcd_cmd8(0b00000001);  //Clear Screen
12
  _delay_ms(2);  
13
[C]
14
15
Das funktioniert sowas von Astrein!
16
17
Nun will ich aber meine Customchars draufladen.
18
Also? Ich dachte folgendes:
19
20
[C]
21
  lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
22
  lcd_cmd8(0b01000000); //CGRAM Adresse 0
23
24
  lcd_cmd8(0b000111111);
25
  lcd_cmd8(0b000111111);
26
  lcd_cmd8(0b000111111);
27
  lcd_cmd8(0b000111111);
28
  lcd_cmd8(0b000111111);
29
  lcd_cmd8(0b000111111);  //Daten
30
  lcd_cmd8(0b000111111);
31
  lcd_cmd8(0b000111111);
32
33
  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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Och nö! hier nochmal ordentlich formatiert:


Hi Leute.

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

      Das funktioniert sowas von Astrein!
      Nun will ich aber meine Customchars draufladen.
      Also? Ich dachte folgendes:
1
      lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
2
      lcd_cmd8(0b01000000); //CGRAM Adresse 0
3
       
4
      lcd_cmd8(0b000111111);
5
      lcd_cmd8(0b000111111);
6
      lcd_cmd8(0b000111111);
7
      lcd_cmd8(0b000111111);
8
      lcd_cmd8(0b000111111);
9
      lcd_cmd8(0b000111111); //Daten
10
      lcd_cmd8(0b000111111);
11
      lcd_cmd8(0b000111111);
12
13
      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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Tobias Tetzlaff (Gast)


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

von Simon K. (simon) Benutzerseite


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..

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

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

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

die h.

von Simon K. (simon) Benutzerseite


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!

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

Im Prog steht aber nur das interessante fürs LCD.

Gruß Toby

von Tobias Tetzlaff (Gast)


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

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

Sorry,

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

Gruß Toby

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

Hi nochmal,

so siehts im Moment aus.

Gruß Toby

von Simon K. (simon) Benutzerseite


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...

von Tobias Tetzlaff (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Meine Init schaut so:
1
  lcd_cmd4(3);    //3xFunc Set
2
  lcd_cmd4(3);
3
  lcd_cmd4(3);
4
  lcd_cmd4(2);    //Func Set 4Bit
5
6
  lcd_cmd8(0b00101001);  //Func Set
7
  lcd_cmd8(0b01111000);  //Contrast
8
  lcd_cmd8(0b01011110);  //POWER/Icon/Contrast
9
  lcd_cmd8(0b01101010);  //Follower Control
10
  lcd_cmd8(0b00001100);  //Display ON/OFF
11
  lcd_cmd8(0b00000001);  //Clear Screen
12
  _delay_ms(2);

Und die Routine, womit ich versucht habe CCs in das Display zu laden
ist folgende:
1
      lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
2
      lcd_cmd8(0b01000000); //CGRAM Adresse 0
3
4
      lcd_cmd8(0b000111111);
5
      lcd_cmd8(0b000111111);
6
      lcd_cmd8(0b000111111);
7
      lcd_cmd8(0b000111111);
8
      lcd_cmd8(0b000111111);
9
      lcd_cmd8(0b000111111); //Daten
10
      lcd_cmd8(0b000111111);
11
      lcd_cmd8(0b000111111);
12
       
13
      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.

von Simon K. (simon) Benutzerseite


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.

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

grummel

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Halt Stop! Da ist noch ein Fehler drin bei der Customchar-schreibsache.

Hier richtig, aber dennoch unfunktionierend.

von Tobias Tetzlaff (Gast)


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

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

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

von Simon K. (simon) Benutzerseite


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..

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

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

von Tobias Tetzlaff (Gast)


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

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

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

von Simon K. (simon) Benutzerseite


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 ;)

von Simon Küppers (Gast)


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.

von Dennis Kleine-Beck (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich habe mal eine Email geschrieben. Dank dir für den Tipp!

von Dietmar (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Nö, habs in die Ecke geschmissen. Ziemlich frustrierend die 
Dokumentation...

von Philipp P. (putzer_philipp)


Lesenswert?

@Dietmar

Noch daran interessiert? Hatte anfangs auch Probleme damit!


von Dietmar (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Da krieg ich's Aufstoßen!

>:(

von Dietmar (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Hier mein Code:
1
// LCD-Modul an PortC
2
#asm
3
    .equ __lcd_port=0x15
4
#endasm
5
// LCD-Functions
6
#include <dog_lcd.h>
7
8
typedef unsigned char byte;
9
// Test Pfeil aus Hilfe   
10
flash byte char0[8]={
11
0b0000000,0b0001111,0b0000011,0b0000101,0b0001001,0b0010000,0b0100000,0b1000000};
12
// Accu voll
13
flash byte char1[8]={
14
0b0000110,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0000000};
15
// Accu ok
16
flash byte char2[8]={
17
0b0000110,0b0001001,0b0001001,0b0001111,0b0001111,0b0001111,0b0001111,0b0000000};
18
// Accu leer
19
flash byte char3[8]={
20
0b0000110,0b0001001,0b0001001,0b0001001,0b0001001,0b0001001,0b0001111,0b0000000};
21
// Glühkerze defekt
22
flash byte char4[8]={
23
0b0000100,0b0000100,0b0001110,0b0011111,0b0011111,0b0001010,0b0001110,0b0000000};
24
// Temperatursensor defekt
25
flash byte char5[8]={
26
0b0000100,0b0001010,0b0001010,0b0001110,0b0011111,0b0011111,0b0001110,0b0000000};
27
// Pumpe läuft / Pumpenspannung
28
flash byte char6[8]={
29
0b0011100,0b0010100,0b0011100,0b0010000,0b0010101,0b0000101,0b0000111,0b0000010};
30
// Schalterbetrieb
31
flash byte char7[8]={
32
0b0010000,0b0010000,0b0011001,0b0000010,0b0000100,0b0001000,0b0010000,0b0010000};
33
34
/* function used to define user characters */
35
void define_char(byte flash *pc,byte char_code)
36
{
37
byte i,a;
38
a=(char_code<<3) | 0x40;
39
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
40
}

Und dieser Codeteil dann im Main:
1
// LCD module initialization (16 Zeichen pro Zeile)
2
lcd_init(16);
3
lcd_clear();
4
lcd_contrast(10);
5
define_char(char0,0);
6
define_char(char1,1);
7
define_char(char2,2);
8
define_char(char3,3);
9
define_char(char4,4);
10
define_char(char5,5);
11
define_char(char6,6);
12
define_char(char7,7);
13
lcd_clear();
14
15
lcd_putchar(0x00);
16
lcd_putchar(0x01);
17
lcd_putchar(0x02);
18
lcd_putchar(0x03);
19
lcd_putchar(0x04);
20
lcd_putchar(0x05);
21
lcd_putchar(0x06);
22
lcd_putchar(0x07);

Die Library ist im Anhang!
Damit funzt es prima.

von Jim D. (linuxmarine)


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!

von Basti M. (counterfeiter)


Lesenswert?

Hallo,

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

hier mal meine Lösung für nachfolgende Suchanfragen:
1
void Vertikale_Balken(void) 
2
{
3
  for(uint8_t i=0;i<8;i++) {
4
    if(i>6)
5
      SPDR = 0b00011111;
6
    else
7
      SPDR = 0b00000000;
8
    _delay_ms(0.03);
9
    CONTROLPORT &= ~_BV(CTRL_RS);
10
    CONTROLPORT |= _BV(CTRL_RS);
11
  }
12
13
  //hier
14
        //noch
15
        //balken...
16
17
  for(uint8_t i=0;i<8;i++) {
18
    SPDR = 0b00011111;
19
    _delay_ms(0.03);
20
    CONTROLPORT &= ~_BV(CTRL_RS);
21
    CONTROLPORT |= _BV(CTRL_RS);
22
  }
23
}
24
//bedingung ist, dass instruction tabel 0 0 aktiviert ist
25
void define_char(void)
26
{ 
27
28
    CONTROLPORT &= ~_BV(CTRL_RS);
29
                //auf erstes freies Zeichen zeigen
30
    SPDR = 0b01000000;
31
    _delay_ms(0.1);
32
    CONTROLPORT |= _BV(CTRL_RS);
33
          CONTROLPORT &= ~_BV(CTRL_RS);  
34
    CONTROLPORT |= _BV(CTRL_RS);
35
    _delay_ms(0.1);
36
37
    //Aussehen
38
    Vertikale_Balken();
39
40
                //wieder in Displayspeicher zeigen
41
    CONTROLPORT &= ~_BV(CTRL_RS);
42
    SPDR = 0b10000000;
43
    _delay_ms(0.1);
44
    
45
}

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

grüße

Basti

von Tino K. (blumengiesser)


Angehängte Dateien:

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

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
Noch kein Account? Hier anmelden.