Ich benutze einen ATmega 32...mit einer Taktfrequenz von 3,6864 MHz
main.c:
lcd.h:Code:#include<avr/io.h> #include<avr/delay.h> #include "lcd.h" // eigene lcd lib getester mit atm16 alle ports int main (void) { char text[]="Keb"; char text2[]="Keb"; init(); boot('.',1,1,1); // zeichen'a' / wie oft0-255 / nur zeile 1 (bug)/ pos spalte 1-24 run(2); boot('.',1,1,1); // zeichen'a' / wie oft0-255 / pos zeile 1 (bug)/ pos spalte 1-24 run(2); boot('.',1,1,1); // zeichen'a' / wie oft0-255 / pos zeile 1 (bug)/ pos spalte 1-24 clear(); // löscht aktuelle eingabe / pos 1,1 pos(1,1); print(text); //drucken(text, 1,1); // ausgabe string pos(2,1); run(20); //drucken(text, 2,1); // ausgabe string run(20); for(;;){ } //endlosschleife }
Problem:Code:#include<avr/io.h> #include<avr/delay.h> #include<string.h> #define ddrx DDRA #define portx PORTA #define db4 PINA0 #define db5 PINA1 #define db6 PINA2 #define db7 PINA3 #define rs PINA4 #define rw PINA5 #define en PINA6 #define led PINA7 void delay(void); // 3 takte verzvgerung void delay5ms(void); // 5 ms verzögerung void enable(void); // erzeugen des enable puls void buisy(void); // warten bis bereit(nur durch zeitverzvgerung) void comm(unsigned char comm); // schreibt commando void data(unsigned char data); // schreibt daten void init(void); // initialisiert display void clear(void); // löscht display void pos(unsigned char l,unsigned char p); // zeile spalte 1/2 1-24 void print(char buffer []); // gibt string aus void drucken(char buffer2 [],int x,int y); void boot(unsigned char zeichen,unsigned char zahl ,unsigned char zeile,unsigned char sp); //zeichen /anzahl durchgänge / zeile / spalte) void run(char ms100); // drei takte warten void delay(void) { asm volatile( "nop\n\t" "nop\n\t" "nop\n\t"::);} //enable ein aus void enable(void) { portx |= (1 << en); // setzt bit delay(); portx &= ~(1 << en); // lvscht Bit } void delay5ms(void) { // inline asm warteschleife asm volatile( "push R16" "\n\t" "push R17" "\n\t" "ldi R16, 0x25" "\n\t" "WGLOOP0:""\n\t" "ldi R17, 0xA5" "\n\t" "WGLOOP1:""\n\t" "dec R17" "\n\t" "brne WGLOOP1" "\n\t" "dec R16" "\n\t" "brne WGLOOP0" "\n\t" "pop R16" "\n\t" "pop R17" "\n\t"::);} // wartet bis lcd bereit void buisy(void) { _delay_ms(15); } // sendet comando --- rs nicht gesetzt void comm(unsigned char comm) { buisy(); unsigned char comm1 = comm; portx = (0x0f & (comm>>4)); enable(); portx = (0x0f & (comm1)); enable(); } // sendet daten -- rs gesetzt void data(unsigned char data) { buisy(); unsigned char data1 = data; // daten geseichert portx = (0x1f & (data>>4)|(1 << rs)); // rechtschieben enable(); portx = (0x1f & ((data1))|(1 << rs)); // ausgabe sicherung enable(); } void init(void){ ddrx = 0xff; portx = 0xff; // 15 ms warten unsigned char d= 10; do{ --d; delay5ms(); }while(d != 0 ); // drei mal 8 bit initialisieren portx = (0b00000011); enable(); delay5ms(); enable(); delay5ms(); enable(); // 4 bit modus aktivieren delay5ms(); portx = (0b00000010); enable(); delay5ms(); // sachen einstellen comm(0b00101000); //2zeilig 5*8 delay(); comm(0b00001000); delay(); comm(0b00000001); delay(); comm(0b00000010); delay(); comm(0b00001100); // display lvschen } void clear(void) { comm(0b00000001); pos(1,1); } void pos(unsigned char l,unsigned char p) { unsigned char pos = 0b10000000; if(l==1){ pos |= p-1; } if(l==2){ p =+40; pos |= p; } comm(pos); } // void print(char buffer []) { for ( int i = 0; buffer [i] !='\0'; i++) data(buffer[i]); } void boot( unsigned char zeichen,unsigned char zahl, unsigned char zeile,unsigned char sp) { do{ unsigned char spalte= sp; zahl = zahl-1; _delay_ms(100); pos(zeile, spalte); print(" "); pos(zeile,spalte); _delay_ms(100); data(zeichen); _delay_ms(100); data(zeichen); _delay_ms(100); data(zeichen); _delay_ms(100); data(zeichen); _delay_ms(100); data(zeichen); }while(zahl != 0); } void drucken(char buffer2 [],int x,int y) { pos(x,y); int i=0; while(i<=strlen(buffer2)) { print(buffer2[i]); y=y+1; pos(x,y); i=i+1; } } /*void drucken(unsigned char *p) { do { data(*p); p++; } while (*p!='\0'); } */ void run(char ms100) { unsigned char d= ms100; do{ --d; _delay_ms(100); }while(d != 0 ); portx |= (1 << led); // setzt bit d= ms100; do{ --d; _delay_ms(100); }while(d != 0 ); portx &= ~(1 << led); // löscht Bit }
Ich kann mit diesem Programm nur Strings die 3 Symbole lang sind ausgeben. Will ich mehr als 3 ausgeben gibt das Display nur Blödsinn aus.
Schreibe ich den Text hingegen direkt in die print funktion hinein gibt er den ganzen Text aus. z.B: print("Test");
Um dem Problem aus dem Weg zu gehen habe ich eine Funktion geschrieben die den String auf dessen einzelnen Symbole aufspalltet und einzel ausgibt.
mit:
char text[5];
text[0]='T';
text[1]='e';
text[2]='s';
text[3]='t';
text[0]='\0';
Habe auch schon versucht den String in die oben stehende Form umgewandelt und dann ausgegeben.
Das führte aber auch zu keinem Ergebnis
EDIT:
Kollege, ich hab' dir ein paar CODE-Tags spendiert. Die kosten nix
Dein Moddy







Zitieren
Lesezeichen