Forum: Mikrocontroller und Digitale Elektronik SED1531 Serial LCD Controller


von mihailo (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.