nabend
ich hab den halben tag damit verbracht, die AssemblerLCDroutinen von mikrocontroller.net in C zu "übersetzen". das klingt vllt blödsinnig, aber ich möchte keine vorgefertigten funktionen nehmen, um das ganze besser zu verstehen. ich weiß, das programm was ich geschrieben hab, ist programmiertechnisch ziemlicher schrott, aber ich versteh einfach nicht, wieso es nicht funktioniert. hängt es damit zusammen, wie ich die nibbles "vertausche" (ich versteh nich ganz wie das mit dem inline assembler läuft, deshalbt hab ich mir diese "methode" ausgedacht)
kann mir irgendjemand helfen ???
MfG maddin
EDIT verwende 4*20 zeichen, Hitachi HD44irgendwas oder zumindest kompatibel dazu.Code:#include <avr/io.h> //EVALUATION BOARD #define Taster1 2 #define Taster2 3 #define Taster3 4 #define LED1 5 #define LED2 6 //LCD #define LCD_PORT PORTB #define LCD_E 5 #define LCD_RS 4 #define LCD_CLEAR 0b00000001 // //Prototypen void delay_ms(unsigned int); void io_init(void); //LCD void lcd_data(unsigned char); void lcd_command(unsigned char); void lcd_enable(void); void lcd_init(void); void lcd_clear(void); // // void main(void) { ioinit(); lcd_init(); lcd_data("T"); lcd_data("e"); lcd_data("s"); lcd_data("t"); } } // Initialisierung void ioinit(void){//0EINGANG 1AUSGANG DDRD=0b11100011; DDRB=0b00111111; } void delay_ms(unsigned int ms){ unsigned int zaehler; while (ms) { zaehler = F_CPU / 5000; while (zaehler) { asm volatile("nop"); zaehler--; } ms--; } } void lcd_init(){ LCD_PORT=0xFF; delay_ms(31); LCD_PORT=0b00000011;//zur initialisierung lcd_enable(); delay_ms(5); lcd_enable(); delay_ms(5); lcd_enable(); delay_ms(5); LCD_PORT=0b00000010;//4bit lcd_enable(); delay_ms(5); lcd_command(0b00101000);//4bit,2Zeilen delay_ms(5); lcd_command(0b00001100);//Display on, Cursor off delay_ms(5); lcd_command(0b00000100); } void lcd_enable(){ LCD_PORT |= (1 << LCD_E);//1 delay_ms(1); LCD_PORT &=~(1 << LCD_E);//0 delay_ms(1); } void lcd_data(unsigned char data){ unsigned char nibble; nibble=data/0b00010000; //ersatz für "swap" LCD_PORT=nibble&&00001111; LCD_PORT |= (1 << LCD_RS);//1 lcd_enable(); LCD_PORT=data&&00001111; LCD_PORT |= (1 << LCD_RS);//1 lcd_enable(); delay_ms(1); } void lcd_command(unsigned char data){ unsigned char nibble; nibble=data/0b00010000; LCD_PORT=nibble&&00001111; lcd_enable(); LCD_PORT=data&&00001111; lcd_enable(); delay_ms(1); }







Zitieren


Lesezeichen