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; } ---------------------------------------------------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.