Moin moin!
Hab mein LCD-Display zumindest mal initialisiert bekommen. Glaub ich wenigstens. Nach Ablauf dieses Programms
Code:
// Ansteuerung eines 16*2-Zeichen LCDs (44780-kompatibel)
#include <avr\io.h>
#define CPU_CK 8000000
#define LCD PORTB
#define DB4 0
#define DB5 1
#define DB6 2
#define DB7 3
#define ENABLE 4
#define RW 5
#define RS 6
#define CONTRAST 7
void waitus(int d) { // Feste Anzahl von Mikrosekunden warten
int i,a;
for(i=0;i<(d/(CPU_CK/1000));i++) {
a=i; // Eigentlich "asm:nop", Syntax??
}
}
void init(void) {
DDRB = 0xFF;
//-------------------------------------------------------------------------------------------
waitus(15000);
LCD = (1<<ENABLE);
LCD |= (1<<DB4)|(1<<DB5); // DB4 und DB5 setzen
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(5000);
LCD = (1<<ENABLE);
LCD |= (1<<DB4)|(1<<DB5); // DB4 und DB5 setzen
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB4)|(1<<DB5); // DB4 und DB5 setzen
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB5); // DB5 setzen (4bit-Modus aktivieren)
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB5); // DB5 setzen (4bit-Modus)
waitus(1000);
LCD &= ~(1<<ENABLE);
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB7); // DB7 setzen (2-zeiliges Display)
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(1000);
LCD = (1<<ENABLE);
waitus(1000); // Leeres Nibble
LCD &= ~(1<<ENABLE);
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB7)|(1<<DB6)|(1<<DB5); // Display on, Cursor on
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(1000);
LCD = (1<<ENABLE);
waitus(1000); // Leeres Nibble
LCD &= ~(1<<ENABLE);
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB4); // Clear Display
waitus(1000);
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(1000);
LCD = (1<<ENABLE);
waitus(1000); // Leeres Nibble
LCD &= ~(1<<ENABLE);
waitus(1000);
LCD = (1<<ENABLE);
LCD |= (1<<DB6)|(1<<DB5); // Increment Cursor after writing
waitus(1000);
LCD &= ~(1<<ENABLE);
}
int main(void) {
init();
//-------------------------------------------------------------------------------------------
waitus(15000);
LCD = (1<<ENABLE)|(1<<RS);
LCD |= (1<<DB5)|(1<<DB4); // Erstes Nibble=0x3
waitus(1000);
LCD &= ~(1<<ENABLE);
waitus(1000);
LCD = (1<<ENABLE)|(1<<RS);
waitus(1000); // Zweites Nibble=0x0, zusammen "0"
LCD &= ~(1<<ENABLE);
//-------------------------------------------------------------------------------------------
waitus(15000);
LCD = (1<<ENABLE)|(1<<RS);
LCD |= (1<<DB6); // Erstes Nibble=0x4
waitus(1000);
LCD &= ~(1<<ENABLE);
waitus(1000);
LCD = (1<<ENABLE)|(1<<RS);
LCD |= (1<<DB7)|(1<<DB6)|(1<<DB5); // Zweites Nibble=0xE, zusammen "N"
waitus(1000);
LCD &= ~(1<<ENABLE);
}
im ATm16 zeigt mein Display einen Cursor in der ersten Zeile auf Position eins. Von der Initialisierung her sollte das auch stimmen, bloss wird anscheinend der Code in main() nicht ausgefuehrt. Da sollte naemlich eine "0" und ein "N" geschrieben werden, der cursor ruehrt sich aber kein Stueck.
Kann mal jemand drueberschauen? Ich hab schon son leichten Tunnelblick und find den Fehler nich...
Danke,
Nils
Lesezeichen