// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial // void lcd_data(unsigned char temp1); void lcd_string(char *data); void lcd_running_string(char *data,int zeile); void lcd_command(unsigned char temp1); void lcd_enable(void); void lcd_init(void); void lcd_home(void); void lcd_clear(void); void set_cursor(uint8_t x, uint8_t y); // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig! #define F_CPU 8000000 // LCD Befehle #define CLEAR_DISPLAY 0x01 #define CURSOR_HOME 0x02 // Pinbelegung für das LCD, an verwendete Pins anpassen #define LCD_PORT PORTC #define LCD_DDR DDRC #define LCD_RS PC4 #define LCD_EN PC5 // DB4 bis DB7 des LCD sind mit PC0 bis PC3 des AVR verbunden // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial // // Die Pinbelegung ist über defines in lcd-routines.h einstellbar #include #include #include "lcd-routines.h" #include // sendet ein Datenbyte an das LCD void lcd_data(unsigned char temp1) { unsigned char temp2 = temp1; LCD_PORT |= (1<> 4; temp1 = temp1 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } // sendet einen Befehl an das LCD void lcd_command(unsigned char temp1) { unsigned char temp2 = temp1; LCD_PORT &= ~(1<> 4; // oberes Nibble holen temp1 = temp1 & 0x0F; // maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } // erzeugt den Enable-Puls void lcd_enable(void) { // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen // http://www.mikrocontroller.net/topic/81974#685882 LCD_PORT |= (1<=16) { break; } } //Ist der String größer als 16 Zeichen wird der Rest //in Laufschrift angezeigt alle 0,5 Sekunden if(size>16) { _delay_ms(500); for(i=0;i<(size-16);i++) { max=0; lcd_home(); lcd_clear(); data_2++; data=data_2; while(*data) { lcd_data(*data); data++; max++; if(max>=16) { break; } } _delay_ms(500); } } } // Schreibt einen String in Laufschrift auf das LCD void lcd_running_string(char *data,int zeile) { int max,i=0; int pos=16; char *data_2; int size=strlen(data);//gibt die Länge des String ohne 0 ende for(;;) { pos=16; max=0; i=0; data_2=data; set_cursor(pos,zeile); // Schreibt die ersten 16 zeichen des Strings for(i=0;i<=16;i++) { while(*data) { lcd_data(*data); data++; max++; if(max>=16) { break; } } data=data_2; pos--; max=0; _delay_ms(250); lcd_clear(); set_cursor(pos,zeile); } for(i=0;i=16) { break; } } _delay_ms(250); } } } #include #include #include //Für sei(); cli(); ISR() #include "lcd-routines.h" #include int main(void) { DDRD |= (1< $@ size: ${TARGET} @echo @avr-size -C --mcu=${MCU} ${TARGET} ## Clean target .PHONY: clean clean: -rm -rf $(OBJECTS) FirststepAtmega64.elf dep/* FirststepAtmega64.hex FirststepAtmega64.eep FirststepAtmega64.lss FirststepAtmega64.map ## Other dependencies -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)