kann man doch, ich weiss nicht was ihr wollt.
unten ist eine eigene auf meine bedürfnisse angepasste lcd-routine mit winavr-c und rw auf masse.
port c0-c5. (daten 0-3, 5 rs, 4 en), lcd 2x16, AVR16 8mhz
die adressen können mit leichtigkeit für andere lcd ausgetauscht werden, so lernt man auch die lcd kennen, mit dem datenblatt.
Code:#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #define delay_us_(us) _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/2005 ) void _delayFourCycles_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) asm volatile("nop"); } void delay_ms_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) delay_us_(999); } void lcd_flash_e (void) { PORTC|=(1<<DDC4); delay_us_(5); PORTC&=~(1<<DDC4); delay_us_(50); } void lcd_write (uint8_t data, uint8_t rs) { uint8_t dataBits ; if (rs) dataBits=0x20; else dataBits=0; PORTC=dataBits |(data>>4); lcd_flash_e (); PORTC=dataBits | (data&0x0F); lcd_flash_e(); delay_ms_(2); } void lcd_cls (void) { lcd_write(0x02,0); delay_ms_(2); lcd_write(0x01,0); delay_ms_(2); } void lcd_writechar(char zeichen) { lcd_write (zeichen,1); } void lcd_writetext(char *text) { uint8_t i = 0; while (text[i]!=0) { lcd_writechar(text[i]); i++; } } void lcd_gotoline(uint8_t zeile) { if (zeile == 1)lcd_write(0x80,0); if (zeile == 2)lcd_write(0xC0,0); } void lcd_gotopos (uint8_t zeile, uint8_t spalte) { if (zeile == 1)lcd_write(0x80+spalte-1,0); if (zeile == 2)lcd_write(0xC0+spalte-1,0); } void lcd_ini (void) { DDRC = 0x3F; PORTC=0x00; delay_ms_(5); lcd_write(0x2,0); lcd_flash_e (); delay_ms_(5); lcd_write(0x28,0); lcd_write(0x0C,0); lcd_write(0x06,0); lcd_cls(); } int main(void) { char text_ausgabe[]="hallo"; DDRC=0xff; PORTC=0; delay_ms_(100); lcd_ini(); lcd_cls(); while(1) { lcd_cls(); lcd_gotopos (1, 3); lcd_writetext(text_ausgabe); delay_ms_(500); } }






Zitieren


Lesezeichen