hallo, ich befasse mich wieder mit winavr-c.
habe mal für den anfang zum lernen für mich ein einfaches lcd-programm geschrieben. dazu auch eine eigene delay, die delay ist supergenau, (getestet mit avrstudio).
das lcd programm kann mit diesen befehlen erweitert werden:
http://www.elektronik-projekt.de/inc...atid=18&type=4
im testprogramm wird von a-z und von A-Z hochgezählt und angezeigt.
wenn EN und RS umgelegt werden, brauchen nur diese daten geändert werden: PC4 (EN) und der wert 0x20 in der temp (PC5=RS).
CastleCode:// LCD HD44780 <4BIT> 2x16, PORTC 0-3 Daten, 4=EN, 5=RS, RW=Masse , AVR 16-8MHZ #include <inttypes.h> #include <avr/io.h> #include <avr/signal.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #define delay_us_(us) _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/1500 ) uint8_t temp1, temp2, lcd_daten; static inline void _delayFourCycles_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) asm volatile("nop"); } static inline void delay_ms_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) delay_us_(999); } void lcd_enable() { PORTC|=(1<<PC4); asm volatile("nop"); asm volatile("nop"); PORTC&=~(1<<PC4); } void lcd_char(void) { temp1=lcd_daten; temp2=lcd_daten; temp1= (temp1 << 4) | (temp1 >> 4); temp1= temp1 & 0x0f; temp1=temp1 | 0x20; PORTC=temp1; lcd_enable(); temp2=temp2 & 0x0f; temp2=temp2 | 0x20; PORTC=temp2; lcd_enable(); delay_us_(50); } void lcd_command(void) { temp1=lcd_daten; temp2=lcd_daten; temp1= (temp1 << 4) | (temp1 >> 4); temp1=temp1 & 0x0f; PORTC=temp1; lcd_enable(); temp2=temp2 & 0x0f; PORTC=temp2; lcd_enable(); delay_us_(50); } void lcd_init(void) { PORTC=3; lcd_enable(); delay_ms_(5); lcd_enable(); delay_ms_(5); lcd_enable(); delay_ms_(5); PORTC=2; lcd_enable(); delay_ms_(5); lcd_daten=0x18; lcd_command(); lcd_daten=0x0c; lcd_command(); lcd_daten=4; lcd_command(); } void lcd_clear(void) { lcd_daten=1; lcd_command(); delay_ms_(5); } int main(void) { uint8_t zaehler; DDRC=0xff; PORTC=0; delay_ms_(1000); lcd_init(); lcd_clear(); zaehler=65; while(zaehler<123) { lcd_clear(); lcd_daten=zaehler; lcd_char(); zaehler++; delay_ms_(500); } }
Lesezeichen