EA Dog 162 - 4 Bit- LCD initialisierung mit PIC18F2522 unter MPLAB

OP #2713620
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.
#2713691
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
Gast #2714010
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
Angehängte Dateien:
#2715184
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
Gast #2715939
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 ...

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