Forum: Compiler & IDEs SED1531 LCD Routine (code angehängt)


von mihailo (Gast)


Lesenswert?

Hallo,

Ich versuche vergeblich ein LCD mit dem SED1531 Controller mit einem 
Atmega16 anzusprechen.

Das ist mein zweites programm (auszug von serdisplib) geht auch nicht, 
viellleicht findet jemand den fehler, oder hat schon eine libary zum 
ansprechen von dem disply,würde mir sehr helfen danke im voraus !!!

#include <avr/io.h>
#include <avr/sfr_defs.h>
#include "font6x8.h"


#ifndef F_CPU
#define F_CPU 1000000UL     /* Quarz mit 1 (intern) Mhz  */
#endif
#include <util/delay.h>



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
  DDRC |= 0xff;
}

/* Schreibt Daten auf den Ports wo das Display Liegt (in dem fall an 
einem Port C)*/
void lcd_SendToLCD(unsigned char data)
{PORTC = data;
_delay_ms(1);
}



/* Erzeugt Display Ausgabe 8 - Bit für direkte Ausgabe an den Display 
Port */
void lcd_Write(unsigned char adr,unsigned char data)
{

    // Variablen für den Programm ablauf
    unsigned char zae;
    unsigned char td;
    char Backlight = 1;

        // Display Optionen ( Direkt als Position im Byte)
      unsigned char cRes = 32;  // -Reset
    unsigned char cNCS = 16;  // -CS
    unsigned char cCS  = 8;   // CS
    unsigned char cA0  = 4;   // A0
    unsigned char cSCL = 2;   // SCL
    unsigned char cSI  = 1;   // SI
    unsigned char cBL  = 128; // Hintergrundbeleuchtung


  /* Alle Display Optionen Abfragen und werte Setzen */

    // Backlight
    if (Backlight == 1)
    {
       td = (cRes | cBL );  // Reset Inaktiv und Backlight an;
    }

    else
    {
       td = (cRes | cBL );    // Reset inaktiv und Backlight aus
    }



    td = td | cCS;   // CS = 1 und /CS = 0  => SED1531 ausgewhäl


     // Command oder Byte
     if (adr>0)
       td = td | cA0;   // A0 hinzu


     // Datenbits rauschieben, MSB zuerst
     for (zae=0;zae <=7;zae++)
     {
       if ((data & 0x80) !=0)
     {
        td = td | cSI;
     }
     else
     {
        td = td & ~cSI;
     }

     // Auf Port Schreiben
     lcd_SendToLCD(td);
     lcd_SendToLCD(td | cSCL); // Takt ausgeben
     lcd_SendToLCD(td);

     // Daten weiterschieben
     data = data << 1;

    }
    // CS Zurücknehmen
    td = td & (~cCS)| cNCS;
    lcd_SendToLCD(td);
}



/* Display Initialiesieren */
void lcd_InitDisplay(){

  unsigned char cRes = 32;   // - Reset

  // Zuerst ein LCD Reset Durchführen
  lcd_SendToLCD(0);
  lcd_SendToLCD(cRes);

  // LCD Init
  lcd_Write(0,64);  // Start Display Line = 0
  lcd_Write(0,161);  // ADC = invers (gespiegelte Anzeigerichtung)
  lcd_Write(0,162);  // LCD-Bias = 1/6
  lcd_Write(0,47);  // LCD-Spannungserzeugung / Regelung ein

  // hier eigentlich contrast regelung aber .... pipi
  lcd_Write(0,0x80 | 31);

  lcd_Write(0,164);  //  Displaytest aus, damit nicht irgendein 
standbymode aktiviert wird
  lcd_Write(0,175);  // Display ein

}


/* Display Contrast Regelung */
void lcd_SetContrast(short nLevel)
{

   if(nLevel < 0)
         nLevel = 0;

   if(nLevel > 31)
         nLevel = 31;

   lcd_Write(0,0x80 | nLevel); // Contrast set 0xF

}


/* Clear SET BMP */
void lcd_ClearDisplay()
{


int page,colum;


  for(page=0;page <=7;page++)
  {

       // Seitenadrese wählen
     lcd_Write(0,0x80 | page);
     // Spaltenadresse = 0 (ganz | links)
     lcd_Write(0,0x10);
     lcd_Write(0,0x00);

     // Daten einer Page setzen
     for (colum=3;colum <=117;colum++)
     {
       lcd_Write(1,0x00);
     }

       for (colum=0;colum <=2;colum++)
     {
       lcd_Write(1,0x00);
     }

       for (colum=118;colum <=120;colum++)
     {
       lcd_Write(1,0x00);
     }

     }

}



/* text ausgeben */
void lcd_WriteSign(unsigned char byte)
{

  int column;

  for(column = 0;column <=5;column++)
  {
    lcd_Write(1,pgm_read_byte(&Font[byte][column]));
  }

}


void lcd_SetPosition(short nCol,short nRow)
{
    int x;

  if(nCol < 1)
        nCol = 1;

  if(nRow < 1)
        nRow = 1;


  x = (nCol-1) * 6 ;


  // x start
  lcd_Write(0,0x10 | ((x & 0xf0)>>4));
  lcd_Write(0,0x00 |  (x & 0x0f)   );

  // y-start
  lcd_Write(0,0xB0 |nRow-1);

}


int main()
{

  init();
  lcd_InitDisplay();
  lcd_SetPosition(1,1);
  lcd_WriteSign(1);

  int i;
  for(i=0;i<100;i++)
  {
   lcd_WriteSign(i+125);
   lcd_SetPosition(1,i);

  }

  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.