KS0066 mit 4Bit ansteuerung?

OP #672304
Lesenswert?

hey leute,

ich habe das problem das ich in Bascom-AVR ein programm geschrieben 
habe, leider komme ich mit der initialisierung des LCD nicht klar. habe 
mir hier ein paar sachen angesehen aber irgentwie funktioniert nichts.

Benutze folgende sachen:

MC: ATMEGE32-16PU
LCD: conrad lcd best NR. 184748 - 62

Kann mir da jemand ein code geben um das lcd im 4-Bitmodus mithilfe von 
Bascom anzusteuern. mit dem Standartbefehl des Bascom geht es irgentwie 
nicht.

Im anhang mal mein Code. ich weiß ist nicht sehr professionell, möchte 
es aber genau so haben.

danke für eure hilfe.
Angehängte Dateien:
Gast #673243
Lesenswert?

...den gibt es nicht in der "Datenbank"??
Willst Du mich zum Narren halten?
Es macht den Eindruck, daß Du das Programm nicht geschrieben hast.

Staun! :-o

@Bas_ratte
Das Display ist laut  Datenblatte ein 20*2 mit KS0066.

Warum dann das: >Config Lcd = 20 * 4a , Chipset = Ks077 ?


@Peng
Bascom ist nicht für den Programmierer verantwortlich.
Denn: Was kann der Teich dafür, daß die Ente nicht schwimmen kann?

;-)
Paul
OP #673870
Lesenswert?

also ich finde es recht scheiße das man hier so runter gemacht wird.

Ich habe lediglich ein problem und habe um hilfe gebeten. Mir ist 
vollkommen klar das ein besserer programmierer das alles anders gemacht 
habe. aber ich habe das programm so eschrieben verstehe es und bin auch 
stolz darauf das es funktioniert.

Ich benutze bascom aus diesem grund weil wir es in der schule hatten und 
die sprache recht einfach gehandhabt ist.

ich danke allen die mir hilfe angeboten haben und sich auch gedanken zu 
problemen eines anfängers gemacht haben. All die jenigen die gerne in c 
programmieren macht auch weiter. alle die mich nur angemault haben pech 
für euch haltet euch halt einfach hier raus.


MFG
Persönliche Seite #673963
Lesenswert?

Möglicherweise musst du dir das Datenblatt vom KS0066U (*) schnappen und 
die Funktionen zur Ansteuerung selbst schreiben.

Die bequemen LCD Funktionen von Bascom setzen bestimmte Controller 
voraus und deren Befehlssatz und Timing wird dann eingehalten.

Bei anderen sog. "kompatiblen" Controllern wie dem KS0066U können 
Abweichungen insbesondere bei der Initialisierung des Displays notwendig 
sein.

In bestimmten Fällen sind die Abweichungen einstellbar (CHIPSET 
Parameter beim CONFIG LCD Befehl für "gängige" Displays), bei anderen 
nicht.

Ein Ansatzpunkt, um die LCD Ansteuerung selbst zu schreiben kann diese 
Diskussion sein:
Beitrag "LCD EA DOG-M und Bascom"

Diese Quellcodes (für ein anderes Display!) von Robert Mayr und Holger 
Bruns zeigen, wie eine hardwarenähere Ansteuerung mit eigenen Routinen 
statt mit den LCD Befehlen aussehen kann. Wenn du Glück hast, brauchst 
du nur eine andere Initialisierung und kannst die normalen 
LCD-Ausgabebefehle weiter benutzen. Wenn du Pech hast, musst du alles 
selbst machen.

Ein Timing für den KS0066U, allerdings in Assembler, findet sich bei
Beitrag "KS0066U oder Ähnliche --- LCD Treiber"

(*) http://www.mikrocontroller.net/articles/LCD#Weblinks
=> Pacific Display Devices Seite
#1330901
Lesenswert?

Hi Forum!

Ich habe mich die letzten Tage auch mit einem LCD mit einem KS0066 drauf 
beschäftigt. Ich hab auch fast nen Anfall gekriegt, bis ich festgestellt 
hab, daß nicht meine Initialisierung falsch ist, sondern meine 
Verdrahtung :( ...
Naja, aber weil scheinbar einige Leute Probs mit der Initialisierung 
haben möchte ich meinen Code mal zeigen, mit dem es funktioniert.
Zur Hardware: Atmega8 @ 8 MHz, LCD von Pollin, SC1604A.
ein GUTES Datenblatt für das LCD gibts hier: 
http://www.sun-tai.com.tw/cw/DownloadAttachment?attach_id=19175252. Das 
Datenblatt zum KS0066 ist das gängige von Samsung, da steht auch der 
Ablauf der Init drin.

ACHTUNG: ich habe DB4-DB7 vom LCD an Px4-Px7 angeschlossen, weil ich das 
angenehmer fand. EN, RS & RW liegen auf Px0-Px2. Die defines sehen dann 
wie folgt aus:
1
// Pinbelegung für das LCD, an verwendete Pins anpassen
2
#define LCD_PORT      PORTD
3
#define LCD_DDR       DDRD
4
#define LCD_RW        PD2
5
#define LCD_RS        PD1
6
#define LCD_EN        PD0
7
#define LCD_DB4      PD4
8
#define LCD_DB5      PD5
9
#define LCD_DB6      PD6
10
#define LCD_DB7      PD7

Auch die Initialisierungsroutine, die hier im Tutorium zu finden ist, 
hab ich für diese Pinbelegung angepasst (die Shifts und die 
Maskierungen). Die funktionierende Initialisierung mit der obigen 
Pinbelegung, sieht dann so aus:
1
void lcd_init(void)
2
{
3
  LCD_DDR = 0xF7;
4
 
5
  LCD_PORT &= ~(1<<LCD_RS);      // RS auf 0, "Befehl"
6
  LCD_PORT &= ~(1<<LCD_RW);      // RW auf 0, "schreiben"
7

8

9
// Function set
10
  LCD_PORT |= ((1<<LCD_DB5) | (1<<LCD_DB4));
11
  lcd_enable();
12
  LCD_PORT |= ((1<<LCD_DB5) | (1<<LCD_DB4));
13
  lcd_enable();
14
   LCD_PORT |= ((1<<LCD_DB7) | (1<<LCD_DB6));
15
   lcd_enable();
16
   _delay_ms(1);
17
 
18
 // Display on/off control 
19
   LCD_PORT = 0x00;
20
   lcd_enable();
21
   LCD_PORT |= 0xF0;
22
   lcd_enable();
23
   _delay_ms(1);
24

25
// entry mode
26
  LCD_PORT = 0x00;
27
   lcd_enable();
28
   LCD_PORT |= 0x10;
29
   lcd_enable();
30
   _delay_ms(1);
31

32
// entry mode
33
  LCD_PORT = 0x00;
34
   lcd_enable();
35
   LCD_PORT |= 0x70;
36
   lcd_enable();
37
   _delay_ms(1); 
38
 
39

40
   lcd_clear();
41
   lcd_home();
42
}
Das wars auch schon :) ... Der Code ist sicher heir und da noch zu 
optimieren, aber das lasse ich, weil es so ja funktioniert, ne?
Hoffe das kann jemandem helfen.

VG,
Joachim

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren