LCDm8.c


1
#include <avr/io.h>            //standart AVR io header
2
3
#define TAKT 1                 //Hier den Takt in MHz einsetzen
4
5
char alphabet[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
6
char zahlen[10] = {'0','1','2','3','4','5','6','7','8','9'};
7
char leer[1] = {' '};
8
9
void init_lcd(void);             //funktion zum LCD initialsieren
10
void write_lcd(void);            //funktion um auf LCD zu schreiben
11
void warte(int zeit);            //einfach warte funktion mit ASM "nop"
12
13
int main (void)
14
{
15
DDRC=0xff;                       //PortC als ausgang
16
DDRB=0xff;                       //PortB als Ausgang
17
  
18
  write_lcd();                   //schreibe auf lcd
19
  while(1);                     
20
21
}
22
23
24
void init_lcd(void)
25
{
26
  warte(1500);                  //warten um power-on-reset abzuwarten
27
28
  PORTC = PORTC & 0xfc;;        //RS&RW Befehlsregister auswählen & Schreiben auf das Display
29
   
30
  PORTC = PORTC | 0x04;         //enable flanke vorbereiten
31
  PORTB = 0x38;                 //Function Set: 8bit, 2 zeilen, 5*7dot
32
  warte(40);
33
  PORTC = PORTC & 0xfb;         //enable abfallende Flanke erzeugen
34
35
  
36
  PORTC = PORTC | 0x04;         //enable flanke vorbereiten
37
  PORTB = 0x0f;                 //Display ON/OFF: Display ein, Cursoer ein, Cursor blinken
38
  warte(40);
39
  PORTC = PORTC & 0xfb;         //enable abfallende Flanke erzeugen
40
  
41
  PORTC = PORTC | 0x04;         //enable flanke vorbereiten
42
  PORTB = 0x01;                 //Clear Display: Display löschen, Cursor auf 1.Spalte;1.Zeile
43
  warte(160);
44
  PORTC = PORTC & 0xfb;         //enable abfallende Flanke erzeugen
45
  
46
  PORTC = PORTC | 0x04;         //enable flanke vorbereiten
47
  PORTB = 0x06;                 //Entry mode set: Cursor autoincrement
48
  warte(40);
49
  PORTC = PORTC & 0xfb;         //enable abfallende Flanke erzeugen
50
51
  PORTC = PORTC | 0x04;         //enable flanke vorbereiten
52
  PORTB = 0x02;                 //Cursor @ home
53
  warte(160);
54
  PORTC = PORTC & 0xfb;         //enable abfallende Flanke erzeugen
55
  
56
}
57
58
59
void write_lcd(void)
60
{
61
int i;
62
  init_lcd();
63
  
64
  PORTC=PORTC|0x01;             //RS=1 zum schreiben
65
  
66
  //Alphabet ausgeben
67
  for(i=0;i<=25;i++)
68
    {
69
    warte(10);
70
  PORTC = PORTC | 0x04;       //enable flanke vorbereiten
71
  PORTB=alphabet[i];          //daten an Display senden   
72
  PORTC = PORTC & 0xfb;       //enable abfallende Flanke erzeugen
73
  }
74
 
75
    //Leerzeichen ausgeben
76
  warte(10);
77
    PORTC = PORTC | 0x04;       //enable flanke vorbereiten
78
    PORTB = leer[0];            //leerzeichen senden, damit alles angeigt wird
79
    PORTC = PORTC & 0xfb;       //enable abfallende Flanke erzeugen   
80
81
  //Zahlen ausgeben
82
  for(i=0;i<=9;i++)
83
    {
84
    warte(10);
85
  PORTC = PORTC | 0x04;       //enable flanke vorbereiten
86
  PORTB=zahlen[i];            //daten an Display senden   
87
  PORTC = PORTC & 0xfb;       //enable abfallende Flanke erzeugen
88
  }
89
}
90
91
void warte(int zeit)
92
{
93
int i,j;
94
  
95
  for(i=0;i<=zeit;i++)
96
    for(j=0;j<=(TAKT*47);j++)  
97
    {
98
    asm volatile("nop");     //tue nichts
99
    }
100
}