oderlachs
28.01.2019, 18:12
Hallo Freunde !
Nun ist es wieder an der Zeit bei mir etwas "Programmiertechnisches" zu machen, doch wieder komme ich nicht weiter.
Ich habe versucht an meinen "EasyPIC-40 v.2" Entwicklerboard ein GLCD 128x64 anzuschliessen. Die Buchenleiste ist dafür schon auf dem Board.
Wie auch bei dem mitgeliefertem Beispiel für das LCD 1602 funzt auch das Beispile für diese LCd nicht.
Nun habe ich mich im Web "belesen" recherchiert und Datenblätter durchstöbert. Auch einige Beispiele aus dem Web versucht, aber leider kein Ergebnis.
Vielleicht gehe ich auch total falsch an die Sache ran, aber vielleicht weis ja wer einen Rat ?
Ich merke das was passiert, wenn ich den MCU-Chip beschreibe, habe auch die entsprechende PortPins aus der Schaltung vom Board rausgesucht und das im Code entsprechend geändert.
Nur ein sichtbares Ergebnis , irgendwelche Zeichen auf dem Display erreiche ich nicht :(
Hier mal mein Code :
/*
* File: lcd_128x64_test1.c
* Author: gerhard
*
* Created on 28. Januar 2019, 17:23
*/
// Config für "Easy-PIC 40" mit PIC16F877A
#include <xc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 // aktuelle Oszillatorfrequenz(für delay )
//#define _XTAL_FREQ 3686400
//#define _XTAL_FREQ 8000000
#endif
// CONFIG
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#pragma config DEBUG = OFF
// End config
// Display :
// 128x64 GLCD
// Controller ST7920
// LCD Pin Connection in 8-bit mode
#define LCD_RS RA0
#define LCD_RW RA1
#define LCD_EN RA2
#define LCD_PSB RA3
#define LCD_RST RA4
#define LCD_DB PORTD //Datenbus/-port
// LCD Functions
void LCD_Init(void);
void LCD_TextDisplayString(unsigned char line, char* string);
void LCD_WriteData(unsigned char data);
void LCD_WriteCommand(unsigned char command);
/* ================================================== ================ */
/* */
/* I/O initalisieren */
/* */
/* ================================================== ================ */
void init()
{
ADCON1 = 0x07; // Port A digital I/O
TRISA = 0x00; // Port A Output
TRISD = 0x00; // PORT D Output
__delay_ms(200); // etwas warten
}
/* ================================================== ================ */
/* */
/* LCD initialisieren */
/* */
/* ================================================== ================ */
void LCD_Init(void)
{
__delay_ms(150);
LCD_RST= 0;
__delay_us(2);
LCD_RST= 1;
LCD_PSB = 1; // Parallelmodus Datenbus
__delay_ms(50);
LCD_WriteCommand(0x30); //
__delay_ms(5);
LCD_WriteCommand(0x30);
__delay_ms(1);
LCD_WriteCommand(0x30);
__delay_ms(10);
LCD_WriteCommand(0x38);
__delay_ms(1);
LCD_WriteCommand(0x0C);
__delay_ms(1);
LCD_WriteCommand(0x06);
__delay_ms(1);
LCD_WriteCommand(0x01); // clear display
__delay_ms(10);
}
/* ================================================== ================ */
/* */
/* ein Byte über den Datenbus schreiben */
/* */
/* ================================================== ================ */
// 8 Bit
void LCD_WriteByte(unsigned char command)
{
LCD_DB = command;
LCD_EN = 1; //Daten übernemen
__delay_us(2);
LCD_EN = 0;
__delay_us(20); //Wert variiert nach oben
}
/* ================================================== ================ */
/* */
/* ein Byte Daten schreiben */
/* */
/* ================================================== ================ */
void LCD_WriteData(unsigned char data) //write data
{
LCD_RS=1;
LCD_WriteByte(data);
}
/* ================================================== ================ */
/* */
/* ein Byte Commando schreiben */
/* */
/* ================================================== ================ */
void LCD_WriteCommand(unsigned char command) //write command
{
LCD_RS=0;
LCD_WriteByte(command);
}
/* ================================================== ================ */
/* */
/* eine Textzeile schreiben */
/* */
/* ================================================== ================ */
void LCD_TextDisplayString(unsigned char line, char* string)
{
unsigned char addr,i;
if(line==1)
addr=0x80; // Adresse 1.Zeile
else if(line==2)
addr=0x90; // Adresse 2.Zeile
else if(line==3)
addr=0x88; // Adresse 3.Zeile
else if(line==4)
addr=0x98; // Adresse 4.Zeile
LCD_WriteCommand(addr);
for(i=0;i<16;i++)
LCD_WriteData(*string++);
}
/* ================================================== ================ */
/* */
/* Main Routine */
/* */
/* ================================================== ================ */
void main(void)
{
init();
LCD_Init();
// Schreibe in die 1. Zeile
LCD_TextDisplayString( 1, "LCD-TEST");
while(1);
}
Über eine kleine Hilfestellung wäre ich sehr dankbar!!!
Gerhard
Nun ist es wieder an der Zeit bei mir etwas "Programmiertechnisches" zu machen, doch wieder komme ich nicht weiter.
Ich habe versucht an meinen "EasyPIC-40 v.2" Entwicklerboard ein GLCD 128x64 anzuschliessen. Die Buchenleiste ist dafür schon auf dem Board.
Wie auch bei dem mitgeliefertem Beispiel für das LCD 1602 funzt auch das Beispile für diese LCd nicht.
Nun habe ich mich im Web "belesen" recherchiert und Datenblätter durchstöbert. Auch einige Beispiele aus dem Web versucht, aber leider kein Ergebnis.
Vielleicht gehe ich auch total falsch an die Sache ran, aber vielleicht weis ja wer einen Rat ?
Ich merke das was passiert, wenn ich den MCU-Chip beschreibe, habe auch die entsprechende PortPins aus der Schaltung vom Board rausgesucht und das im Code entsprechend geändert.
Nur ein sichtbares Ergebnis , irgendwelche Zeichen auf dem Display erreiche ich nicht :(
Hier mal mein Code :
/*
* File: lcd_128x64_test1.c
* Author: gerhard
*
* Created on 28. Januar 2019, 17:23
*/
// Config für "Easy-PIC 40" mit PIC16F877A
#include <xc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000 // aktuelle Oszillatorfrequenz(für delay )
//#define _XTAL_FREQ 3686400
//#define _XTAL_FREQ 8000000
#endif
// CONFIG
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#pragma config DEBUG = OFF
// End config
// Display :
// 128x64 GLCD
// Controller ST7920
// LCD Pin Connection in 8-bit mode
#define LCD_RS RA0
#define LCD_RW RA1
#define LCD_EN RA2
#define LCD_PSB RA3
#define LCD_RST RA4
#define LCD_DB PORTD //Datenbus/-port
// LCD Functions
void LCD_Init(void);
void LCD_TextDisplayString(unsigned char line, char* string);
void LCD_WriteData(unsigned char data);
void LCD_WriteCommand(unsigned char command);
/* ================================================== ================ */
/* */
/* I/O initalisieren */
/* */
/* ================================================== ================ */
void init()
{
ADCON1 = 0x07; // Port A digital I/O
TRISA = 0x00; // Port A Output
TRISD = 0x00; // PORT D Output
__delay_ms(200); // etwas warten
}
/* ================================================== ================ */
/* */
/* LCD initialisieren */
/* */
/* ================================================== ================ */
void LCD_Init(void)
{
__delay_ms(150);
LCD_RST= 0;
__delay_us(2);
LCD_RST= 1;
LCD_PSB = 1; // Parallelmodus Datenbus
__delay_ms(50);
LCD_WriteCommand(0x30); //
__delay_ms(5);
LCD_WriteCommand(0x30);
__delay_ms(1);
LCD_WriteCommand(0x30);
__delay_ms(10);
LCD_WriteCommand(0x38);
__delay_ms(1);
LCD_WriteCommand(0x0C);
__delay_ms(1);
LCD_WriteCommand(0x06);
__delay_ms(1);
LCD_WriteCommand(0x01); // clear display
__delay_ms(10);
}
/* ================================================== ================ */
/* */
/* ein Byte über den Datenbus schreiben */
/* */
/* ================================================== ================ */
// 8 Bit
void LCD_WriteByte(unsigned char command)
{
LCD_DB = command;
LCD_EN = 1; //Daten übernemen
__delay_us(2);
LCD_EN = 0;
__delay_us(20); //Wert variiert nach oben
}
/* ================================================== ================ */
/* */
/* ein Byte Daten schreiben */
/* */
/* ================================================== ================ */
void LCD_WriteData(unsigned char data) //write data
{
LCD_RS=1;
LCD_WriteByte(data);
}
/* ================================================== ================ */
/* */
/* ein Byte Commando schreiben */
/* */
/* ================================================== ================ */
void LCD_WriteCommand(unsigned char command) //write command
{
LCD_RS=0;
LCD_WriteByte(command);
}
/* ================================================== ================ */
/* */
/* eine Textzeile schreiben */
/* */
/* ================================================== ================ */
void LCD_TextDisplayString(unsigned char line, char* string)
{
unsigned char addr,i;
if(line==1)
addr=0x80; // Adresse 1.Zeile
else if(line==2)
addr=0x90; // Adresse 2.Zeile
else if(line==3)
addr=0x88; // Adresse 3.Zeile
else if(line==4)
addr=0x98; // Adresse 4.Zeile
LCD_WriteCommand(addr);
for(i=0;i<16;i++)
LCD_WriteData(*string++);
}
/* ================================================== ================ */
/* */
/* Main Routine */
/* */
/* ================================================== ================ */
void main(void)
{
init();
LCD_Init();
// Schreibe in die 1. Zeile
LCD_TextDisplayString( 1, "LCD-TEST");
while(1);
}
Über eine kleine Hilfestellung wäre ich sehr dankbar!!!
Gerhard