www.mikrocontroller.net

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


Autor: mihailo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.