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);
}
}
Lesezeichen