mihailo
30.12.2006, 19:37
Hallo,
Ich hab ein GLCD Display mit einem SED1531 Controller (Pollin).
Das display muss seriel angesteuert werden, hab troz langem suchen keine
beispiel programm gefunden, deswegen hab ich es mal selber probier :
geht leider nicht, hab keine idee was falsch sein könnte am Parallel
port funktioniert das display ohne probleme, deswegen müsste es am
atmega16 doch auch gehn ;-(
also fals jemand zeit hat und sich den code kurz anschaut und nen fehler
findet wäre ich sehr dankbar ;-)
----------------------------------------------------
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include "font6x8.h"
#ifndef F_CPU
#define F_CPU 1000000UL /* Quarz mit 3.6864 Mhz */
#endif
#include <util/delay.h>
// Definiton der Ausgänge zum LCD
#define SI PC0
#define SCL PC1
#define AO PC2
#define CS PC3
#define NCS PC4
#define RES PC5
#define BL PC6
// Ports
#define LCD PORTC
#define LCDD DDRC
uint8_t myByte;
void init()
{
//JTAG Port beim ATmega16 disablen. Standardmaessig sind Ports
PC2..PC5 durch JTAG-Schnittstelle belegt!
MCUCSR |= JTD; //Dazu Bit 'JTAG Disable' in Register MCUCSR setzen -
gemaess Datenblatt 2x !!
MCUCSR |= JTD; //alternativ koennte auch per Programmer das Fusebit
JTAGEN in 'hfuse' auf 0 programmiert werden
//Initialize Port C als Ausgange
LCDD |= 0xff;
}
// Funtkionen Überträgt Command an das Display
void lcd_WriteCom(unsigned char byte){
/* Command muss ins Steueregiste d.h */
LCD &= ~(1<<AO);
/* Jetzt alle Bits durchgehen und Flanke von SCL Wechseln */
volatile int i;
for(i=0 ; i<8 ; i++)
{
// Erst das DataOut Bit Löschen
LCD &= ~(1<<SI);
if (byte & (1 << i)){ // Wenn in übergebenen Byte an Stelle=1
dann übertragen
LCD = LCD | ( 1 <<SI);}
// Flashen des SCL Bits, datenübernahme für das Display
LCD = LCD | ( 1 <<SCL);
_delay_ms(10);
LCD &= ~(1<<SCL);
_delay_ms(10);
}
/* Das DatenOutBit wieder zurücksetzen */
LCD &= ~(1<<SI);
}
// Funtkionen Überträgt Dispaly Inhalt an das Display
void lcd_WriteData(unsigned char byte){
/* Byte muss ins Bildregister d.h */
LCD = LCD | ( 1 <<AO);
/* Jetzt alle Bits durchgehen und Flanke von SCL Wechseln */
volatile int i;
for(i=0 ; i<8 ; i++)
{
// Erst das DataOut Bit Löschen
LCD &= ~(1<<SI);
if (byte & (1 << i)){ // Wenn in übergebenen Byte an Stelle=1
dann übertragen
LCD = LCD | ( 1 <<SI);}
// Flashen des SCL Bits, datenübernahme für das Display
LCD = LCD | ( 1 <<SCL);
_delay_ms(1000);
LCD &= ~(1<<SCL);
_delay_ms(1000);
}
/* Das DatenOutBit wieder zurücksetzen */
LCD &= ~(1<<SI);
}
// Funtkiom zum Initialisieren des Displays
void lcd_Init(void){
/* als Erstes muss Reset auf HIGH gelegt Werden */
LCD = LCD | ( 1 <<RES);
LCD = LCD | ( 1 <<BL);
/* CS auf High und /CS auf LOW ( nur daten zum Display senden ) */
LCD = LCD | ( 1 <<CS);
LCD &= ~(1<<NCS);
/* Init Rotine Senden */
lcd_WriteCom(64); // Start Display Zeile 0
lcd_WriteCom(161); // Gespiegelte Anzeige
lcd_WriteCom(162); // LCD BIAS 1/6
lcd_WriteCom(47); // Intigrierter Spannungsregler Ein
lcd_WriteCom(175); // Display Ein
}
// Den LCD Pointer an ein Stelle Setzen
void lcd_setadress(unsigned char Spalte,unsigned char Zeile){
lcd_WriteCom(0xB0|Zeile);
lcd_WriteCom(0x10|(Spalte/16));
lcd_WriteCom(Spalte&15);
}
// Ein Zeichen auf das Display Schreiben
void lcd_WriteSign(unsigned char byte){
unsigned char i;
for (i=0;i<6;i++)
{
lcd_WriteData(pgm_read_byte(&Font[byte][i]));
}
}
// Main ---------------------------
int main(void)
{
init();
myByte = 170;
lcd_Init();
lcd_WriteSign(1);
return 1;
}
---------------------------------------------------
Ich hab ein GLCD Display mit einem SED1531 Controller (Pollin).
Das display muss seriel angesteuert werden, hab troz langem suchen keine
beispiel programm gefunden, deswegen hab ich es mal selber probier :
geht leider nicht, hab keine idee was falsch sein könnte am Parallel
port funktioniert das display ohne probleme, deswegen müsste es am
atmega16 doch auch gehn ;-(
also fals jemand zeit hat und sich den code kurz anschaut und nen fehler
findet wäre ich sehr dankbar ;-)
----------------------------------------------------
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include "font6x8.h"
#ifndef F_CPU
#define F_CPU 1000000UL /* Quarz mit 3.6864 Mhz */
#endif
#include <util/delay.h>
// Definiton der Ausgänge zum LCD
#define SI PC0
#define SCL PC1
#define AO PC2
#define CS PC3
#define NCS PC4
#define RES PC5
#define BL PC6
// Ports
#define LCD PORTC
#define LCDD DDRC
uint8_t myByte;
void init()
{
//JTAG Port beim ATmega16 disablen. Standardmaessig sind Ports
PC2..PC5 durch JTAG-Schnittstelle belegt!
MCUCSR |= JTD; //Dazu Bit 'JTAG Disable' in Register MCUCSR setzen -
gemaess Datenblatt 2x !!
MCUCSR |= JTD; //alternativ koennte auch per Programmer das Fusebit
JTAGEN in 'hfuse' auf 0 programmiert werden
//Initialize Port C als Ausgange
LCDD |= 0xff;
}
// Funtkionen Überträgt Command an das Display
void lcd_WriteCom(unsigned char byte){
/* Command muss ins Steueregiste d.h */
LCD &= ~(1<<AO);
/* Jetzt alle Bits durchgehen und Flanke von SCL Wechseln */
volatile int i;
for(i=0 ; i<8 ; i++)
{
// Erst das DataOut Bit Löschen
LCD &= ~(1<<SI);
if (byte & (1 << i)){ // Wenn in übergebenen Byte an Stelle=1
dann übertragen
LCD = LCD | ( 1 <<SI);}
// Flashen des SCL Bits, datenübernahme für das Display
LCD = LCD | ( 1 <<SCL);
_delay_ms(10);
LCD &= ~(1<<SCL);
_delay_ms(10);
}
/* Das DatenOutBit wieder zurücksetzen */
LCD &= ~(1<<SI);
}
// Funtkionen Überträgt Dispaly Inhalt an das Display
void lcd_WriteData(unsigned char byte){
/* Byte muss ins Bildregister d.h */
LCD = LCD | ( 1 <<AO);
/* Jetzt alle Bits durchgehen und Flanke von SCL Wechseln */
volatile int i;
for(i=0 ; i<8 ; i++)
{
// Erst das DataOut Bit Löschen
LCD &= ~(1<<SI);
if (byte & (1 << i)){ // Wenn in übergebenen Byte an Stelle=1
dann übertragen
LCD = LCD | ( 1 <<SI);}
// Flashen des SCL Bits, datenübernahme für das Display
LCD = LCD | ( 1 <<SCL);
_delay_ms(1000);
LCD &= ~(1<<SCL);
_delay_ms(1000);
}
/* Das DatenOutBit wieder zurücksetzen */
LCD &= ~(1<<SI);
}
// Funtkiom zum Initialisieren des Displays
void lcd_Init(void){
/* als Erstes muss Reset auf HIGH gelegt Werden */
LCD = LCD | ( 1 <<RES);
LCD = LCD | ( 1 <<BL);
/* CS auf High und /CS auf LOW ( nur daten zum Display senden ) */
LCD = LCD | ( 1 <<CS);
LCD &= ~(1<<NCS);
/* Init Rotine Senden */
lcd_WriteCom(64); // Start Display Zeile 0
lcd_WriteCom(161); // Gespiegelte Anzeige
lcd_WriteCom(162); // LCD BIAS 1/6
lcd_WriteCom(47); // Intigrierter Spannungsregler Ein
lcd_WriteCom(175); // Display Ein
}
// Den LCD Pointer an ein Stelle Setzen
void lcd_setadress(unsigned char Spalte,unsigned char Zeile){
lcd_WriteCom(0xB0|Zeile);
lcd_WriteCom(0x10|(Spalte/16));
lcd_WriteCom(Spalte&15);
}
// Ein Zeichen auf das Display Schreiben
void lcd_WriteSign(unsigned char byte){
unsigned char i;
for (i=0;i<6;i++)
{
lcd_WriteData(pgm_read_byte(&Font[byte][i]));
}
}
// Main ---------------------------
int main(void)
{
init();
myByte = 170;
lcd_Init();
lcd_WriteSign(1);
return 1;
}
---------------------------------------------------