Forum: Mikrocontroller und Digitale Elektronik EA Dog 162 - 4 Bit- LCD initialisierung mit PIC18F2522 unter MPLAB


von kader K. (microkad)


Lesenswert?

1
 
2
#include <stdio.h>
3
#include <p18f25k22.h>
4
#include <stdlib.h>
5
#include "delays.h"
6
7
#include "string.h"
8
9
#pragma config  FOSC = INTIO7   // Internal oscillator block, CLKOUT function on OSC2, nachzulesen in P18F25K22.INC
10
#pragma config  PWRTEN = ON     // Power up timer enabled
11
#pragma config  BOREN = OFF     // Brown-out Reset disabled in hardware and software
12
#pragma config  WDTEN = OFF     // Watch dog timer is always disabled. SWDTEN has no effect
13
14
#pragma code
15
16
#define LCD_PORT        LATB //LATB datapins are PB0 to PB4 (DB4 to DB7 on the DOG)
17
#define PIN_ENABLE   LATBbits.LATB0
18
#define PIN_RW     LATBbits.LATB3
19
#define PIN_RS     LATBbits.LATB2 // set instruction
20
21
22
//LCD_clock()
23
void LCD_clock (void)
24
{
25
Delay10TCYx(3);
26
PIN_ENABLE = 1;
27
Delay10TCYx(3);
28
PIN_ENABLE = 0;
29
}
30
//writes 8 bit to the ST7036 in 2 nibbles (2 x 4bit)
31
void put_Data_to_Port(char data)
32
{
33
  char port_buffer = LCD_PORT;
34
        
35
  //write the high nibble first...
36
  char nibble = (data & 0xF0);
37
        LCD_PORT |= nibble;
38
  //LCD_PORT |= (1 << PIN_ENABLE);
39
        
40
        Delay100TCYx(10);//_delay_ms(1);
41
        
42
43
44
        //LCD_PORT = port_buffer;
45
  Delay100TCYx(10);//_delay_ms(1);
46
        
47
  //...then the low nibble
48
  nibble = (data & 0x0F )<< 4;
49
        LCD_PORT |= nibble;
50
  //LCD_PORT |= (1 << PIN_ENABLE);
51
  Delay100TCYx(10);//_delay_ms(1);
52
        
53
  //LCD_PORT = port_buffer;
54
}
55
56
void LCD_put_Data_out(unsigned char data)
57
{
58
    PIN_RS = 0;
59
    PIN_RW = 0;
60
    //TRISB = 0x00;
61
    //LCD_PORT &= ~(1 << PIN_RW);
62
    //put_Data_to_Port(data);
63
    //LCD_clock();
64
    put_Data_to_Port(data);
65
    LCD_clock();
66
}
67
68
//brief Char an display senden; param str einzelnes char
69
void LCD_out_char (char str)
70
{
71
    PIN_RS = 1; //RS auf high(Daten)
72
    LCD_PORT |= (1 << PIN_RW);
73
    //PIN_RW = 0;
74
    if (str == 0xE4) str = 0x84; // wenn "ä" geschrieben werden soll, zeichensatz von LCD benutzen
75
    if (str == 0xF6) str = 0x94; // wenn "ö" geschrieben werden soll, zeichensatz von LCD benutzen
76
    if (str == 0xFC) str = 0x81; // wenn "ü" geschrieben werden soll, zeichensatz von LCD benutzen
77
    if (str == 0xC4) str = 0x8E; // wenn "Ä" geschrieben werden soll, zeichensatz von LCD benutzen
78
    if (str == 0xD6) str = 0x99; // wenn "Ö" geschrieben werden soll, zeichensatz von LCD benutzen
79
    if (str == 0xDC) str = 0x9A; // wenn "Ü" geschrieben werden soll, zeichensatz von LCD benutzen
80
    if (str == 0xB0) str = 0xDF; // wenn "°" geschrieben werden soll, zeichensatz von LCD benutzen
81
82
    LCD_put_Data_out(str); //char einfach auf Port legen
83
}
84
85
//brief string an display senden; param string datenstring
86
87
void LCD_out_string(char *string)
88
{
89
    //PIN_RW = 0;
90
    PIN_RS = 1; //RS auf high (Daten)
91
    LCD_PORT |= (1 << PIN_RW);
92
    while (*string !=0)
93
    {
94
        LCD_out_char(*string);
95
        *string++;
96
    }
97
}
98
void LCD_init(void)
99
{
100
101
102
  Delay10KTCYx(50);//ms(250);    // mehr als 40ms warten
103
        
104
        LCD_put_Data_out(0x30);//(0x33)
105
  Delay10TCYx(200);  //(2 ms)
106
        
107
  //ST7036(FUNCTION_SET_INIT_0);  // Function set; 8 bit Datenlänge, 2 Zeilen
108
        LCD_put_Data_out(0x30);//(0x33)
109
  Delay10TCYx(3);    // mehr als 26,3µs warten
110
111
  //ST7036(FUNCTION_SET_INIT_1);  // Function set; 8 bit Datenlänge, 2 Zeilen, Instruction table 1
112
  LCD_put_Data_out(0x30);//(0x32)
113
        Delay10TCYx(3);    // mehr als 26,3µs warten
114
115
        //ST7036(FUNCTION_SET_INIT_2);  // Function set; 8 bit Datenlänge, 2 Zeilen, Instruction table 1
116
        LCD_put_Data_out(0x30);
117
        Delay10TCYx(3);    // mehr als 26,3µs warten
118
119
        //ST7036(INSTRUCTION_SET_0);  // Function set; 8 bit Datenlänge, 2 Zeilen, Instruction table 1
120
  LCD_put_Data_out(0x20);
121
        Delay10TCYx(3);    // mehr als 26,3µs warten
122
123
        //ST7036(INSTRUCTION_SET_1);  // Function set; 8 bit Datenlänge, 2 Zeilen, Instruction table 1
124
  LCD_put_Data_out(0x26);
125
        Delay10TCYx(3);    // mehr als 26,3µs warten
126
127
  //ST7036(BIAS_SET);  // Bias Set; BS 1/5; 3 zeiliges Display /1d
128
  LCD_put_Data_out(0x14);
129
        Delay10TCYx(3);    // mehr als 26,3µs warten
130
131
  //ST7036(CONTRAST_SET);  // Kontrast C3, C2, C1 setzen /7c
132
  LCD_put_Data_out(0x55);//(0x7F)
133
        Delay10TCYx(3);    // mehr als 26,3µs warten
134
135
  //ST7036(POWER_CONTROL);  // Booster aus; Kontrast C5, C4 setzen /50
136
  LCD_put_Data_out(0x6D);// (0x6D)
137
        Delay10TCYx(3);    // mehr als 26,3µs warten
138
139
  //ST7036(FOLLOWER_CONTROL);  // Spannungsfolger und Verstärkung setzen /6c
140
  LCD_put_Data_out(0x78);// (0x6A)
141
        Delay10TCYx(3);  // mehr als 200ms warten !!!
142
143
  //ST7036(DISPLAY_ON);  // Display EIN, Cursor EIN, Cursor BLINKEN /0f
144
  LCD_put_Data_out(0x0F); // (0x0F)
145
        Delay10TCYx(3);    // mehr als 26,3µs warten
146
147
  //ST7036(CLEAR_DISPLAY);  // Display löschen, Cursor Home
148
  LCD_put_Data_out(0x01);
149
        Delay10TCYx(200);  //
150
151
  //ST7036(ENTRY_MODE);  // Cursor Auto-Increment
152
        LCD_put_Data_out(0x06);
153
        //Delay10KTCYx(3);
154
}
155
156
void main(void)
157
{
158
         
159
        PORTB = 0x00;
160
        TRISB = 0x00;
161
        ANSELB = 0x00;
162
        INTCON = 0x00;
163
164
  LCD_init;
165
       
166
        //LCD_put_Data_out(0x43);
167
        
168
//        Delay10TCYx(100);
169
//  LCD_out_char('0xE4');
170
//        while(1)
171
//        {
172
//            Nop();
173
//        }
174
//
175
176
}

Hallo zusammen, mit dem oben beschriebenen C-code versuche ich 
verzweifelt das EA Dogm 162 LCD-Display mit ST7036 controller zu 
initialisieren.
ich benutze den PIC18F25K22 unter MPLAB von Microchip. Ich hatte den 
C-Code online gefunden, und habe versucht ihn anzupassen,...klappt 
nicht.

Nach der Compilierung gibt es keine Fehler, aber die Initialisierung 
funktioniert immer nicht.
Unter Assembler, funktioniert die Initialisierung hervorragen, aber mit 
dem C-code nicht.

Über jede Hilfe bin ich dankbar,

Mfg, kader.

von Oliver J. (skriptkiddy)


Lesenswert?

Wie ist dein Display angeschlossen?
Stimmt diese Anschlussbelegung mit dem Quellcode überein?
Hast du mal versuch die delays zu vergrößern?


Gruß Oliver

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

1) LCD_Clock() gehört 2x in put_Data_to_Port()
2) bei der Anfangsinitialisierung (0x30 & 0x20) wird immer nur das obere 
Nibble ausgegeben (0x3 & 0x2 auf den Datenleitungen) und kein Byte!

3) 0x26 = einzeilig; IS2 ??
  >>0x29 = zweizeilig; IS1

4) vor 0x0F musst du mit 0x28 wieder auf IS0 umschalten


Sascha

von kader K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Sascha,

ich habe alles verändert, wie du es meintest, aber klappt immer nicht!!

ich weiß nicht, was ich noch ändern muss!!!

ich habe auch die delays vergrößern, .....klappt auch nicht.

Angeheftet habe ich der modifizierte C-code, und der assembler-code, der 
einwandfrei funktioniert.

was mache ich falsch?

Mfg

von spess53 (Gast)


Lesenswert?

Hi

Wenn du Pins sparen willst, warum nimmst du nicht gleich SPI?

MfG Spess

von Holger W. (holgerw)


Lesenswert?

Simuliere das doch mal im MPLab und schau dir die Register an.
Ich denke hier wird ein Fehler sein, du setzt ja nur Bits und löschst 
keine mit dem 'oder':
LCD_PORT |= nibble;

Holger

von Sascha W. (sascha-w)


Lesenswert?

hmm,

#define LCD_PORT        LATB //LATB datapins are PB0 to PB4 (DB4 to DB7 
on the DOG)
#define PIN_ENABLE   LATBbits.LATB0
#define PIN_RW     LATBbits.LATB3
#define PIN_RS     LATBbits.LATB2 // set instruction

beim PIC hing das Display noch an den oberen 4 Bits vom Port, wenns 
jetzt die unteren sind, musst du die Berechnung der Nibbles auch 
anpassen!
UND dann würde sich das aber offenbar mit Enable, RW und RS 
überschneiden?!

Sag mal wie es denn nun angeschlossen ist.

Sascha

von kader K. (Gast)


Lesenswert?

hallo,

was ich nicht verstehe ist, warum den die gleiche Pinbelegung, die ich 
in Assembler verwende, in C nicht mehr funktionieren würde.

so sieht meine pin belegung aus:
1
 //Pinbelegung PORTB:  
2
//0 LCD Display E             selektiert das Display. Die Leitung muss aktiv sein, damit das Display auf andere Signale reagiert
3
//  1 Masse /CSBnicht
4
//    2 LCD Display RS            sagt dem Display, ob das nun auf dem Datenbus eintreffende Byte ein Steuerkommando oder ein darzustellendes Zeichen ist
5
//    3 LCD Display R / Wnicht    gibt an, ob in das Display geschrieben oder aus dem Display gelesen wird
6
//    4-7 LCD Display D4 .. D7    4-Bit-Datenbus

die subfunktion, die mir probleme bereitet, ist
1
void put_Data_to_Port(char data)

es funktioniert einfach nicht ...

von HolgerW (Gast)


Lesenswert?

Dann räum die doch mal auf und schaue mit dem Simulator was wirklich am 
LCD_PORT anliegt. Wie gesagt das LCD_PORT |= nibble; wird wohl nicht 
passen.

Holger

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.