#include <avr/io.h>
#define LCD_CONTROL_PORT PORTA
#define LEDred 0
#define LEDyellow 1
#define LEDgreen 2
#define WR 3 //Write Low-Aktive eigentlich: /WR
#define RD 4 //Read Low-Aktive eigentlich: /RD
#define CE 5 //Chip enable Low-Aktive eigentlich: /CE
#define CTRL_DATA 6 //0=Data 1=Controlcomanndo
#define RESET 7 //RESET Low-Aktive eigentlich: /RESET
#define LCD_READ_PORT PINC
#define LCD_DATA_PORT PORTC
#define STA0 0
#define STA1 1
//#####Deklaration##########
void LCD_write(uint8_t data);
void LCD_SEND_DATA(unsigned char data);
void LCD_SEND_COMMAND(unsigned char command);
void LCD_check_status(void);
void lcd_init(void);
void LCD_SET_ADRESS_POINTER(unsigned char high_nibble, unsigned char
low_nibble);
//#####Hauptprogramm########
int main(void)
{
LCD_CONTROL_PORT = 0xFF; //alles Ausgang
lcd_init();
PORTA=0x05; //green und red an
LCD_write(0x2D); //
while(1)
{
}
}
void LCD_write(uint8_t data)
{
uint8_t command = 0xC0; //Schreibe Displaydaten und erhöhe
Adresspointer um 1
LCD_SEND_DATA(data);
LCD_SEND_COMMAND(command);
}
void LCD_SEND_DATA(unsigned char data)
{
LCD_check_status();
DDRC = 0xFF; //LCD_DATA_PORT ausgang schalten
LCD_CONTROL_PORT &= ~(1<<CTRL_DATA); //DATA aktivieren
LCD_CONTROL_PORT &= ~(1<<WR) | (1<<CE);
LCD_DATA_PORT = data; //Daten zum Eeprom senden
LCD_CONTROL_PORT |= (1<<WR) | (1<<CE);
}
void LCD_SEND_COMMAND(unsigned char command)
{
LCD_check_status();
DDRC = 0xFF; //LCD_DATA_PORT ausgang schalten
LCD_CONTROL_PORT |= (1<<CTRL_DATA); //COMMAND aktivieren
LCD_CONTROL_PORT &= ~(1<<WR) | (1<<CE);
LCD_DATA_PORT = command; //Daten zum Eeprom senden
LCD_CONTROL_PORT |= (1<<WR) | (1<<CE);
}
void LCD_check_status(void)
{
DDRC = 0x00; //LCD_DATA_PORT als Eingang setzen
LCD_CONTROL_PORT &= ~(1<<RD) | (1<<CE); //Bit löschen
LCD_CONTROL_PORT |= (1<<WR) | (1<<CTRL_DATA); //Bit setzen
while(bit_is_clear(LCD_READ_PORT,STA0) |
bit_is_clear(LCD_READ_PORT,STA1) );
//Wiederhole solange mind. einer 0
}
void lcd_init(void)
{
unsigned int t;
LCD_CONTROL_PORT = 0xFF;
DDRC=0xFF;
PORTA=0xFF;
LCD_CONTROL_PORT &= ~(1<<RESET); // Display Reset
for (t=0; t<1000; t++)
{} // Reset
LCD_CONTROL_PORT |= (1<<RESET); // Display Reset fertig
LCD_SEND_COMMAND(0x80); // OR-Mode
LCD_SEND_DATA(0x00); // Text Home Adresse auf 0x0000 setzen
LCD_SEND_DATA(0x00);
LCD_SEND_COMMAND(0x40); // Set Text Home Adress
LCD_SEND_DATA(0x0F); // 0FH = 16 Zeichen
LCD_SEND_DATA(0x00); // Text AREA Adress setzen
LCD_SEND_COMMAND(0x41);
LCD_SEND_DATA(0x03); // Cursor Pointer setzen
LCD_SEND_DATA(0x04);
LCD_SEND_COMMAND(0x21);
LCD_SEND_COMMAND(0x9C); // Text an Grafik aus
LCD_SET_ADRESS_POINTER(0x00,0x00);
}
void LCD_SET_ADRESS_POINTER(unsigned char high_nibble, unsigned char
low_nibble)
{
LCD_SEND_DATA(low_nibble);
LCD_SEND_DATA(high_nibble);
LCD_SEND_COMMAND(0x24); // Set Adresspointer
}