ARGH! Natürlich findet man die Lösung immer erst wenn man schon gepostet hat 
Lösung:
1laaaaaa
- l = Zeilennummer (0 oder 1)
- a = 6-Bit Spaltennummer
( http://www.mikrocontroller.net/artic...im_4-Bit-Modus )
-> LCD.c
Code:
void LCD_POS (unsigned int line, unsigned int column)
{
if(line)
LCD_COMMAND(0b11000000 + column);
else
LCD_COMMAND(0b10000000 + column);
}
Entschuldigung für diesen wohl sehr überflüssigen Thread^^
Naja, dafür gibts die hier als Entschädigung die Lib zum nachbasteln (währe dann soweit fertig)
LCD.c:
Code:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "LCD.h"
void LCD_SETBYTE (char data)
{
LCD_PORT = LCD_PIN & ~(LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3);
if( data & 1<<0 ) LCD_PORT = LCD_PIN | LCD_D0;
if( data & 1<<1 ) LCD_PORT = LCD_PIN | LCD_D1;
if( data & 1<<2 ) LCD_PORT = LCD_PIN | LCD_D2;
if( data & 1<<3 ) LCD_PORT = LCD_PIN | LCD_D3;
}
void LCD_ENABLE (void)
{
LCD_PORT = (LCD_PIN | LCD_EN);
_delay_us(1);
LCD_PORT = (LCD_PIN & ~LCD_EN);
}
void LCD_DATA (char data)
{
char data2 = data;
data = (data>>4);
data = (data & 0b00001111);
LCD_PORT = (LCD_PIN | LCD_RS) & ~(LCD_EN | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3);
LCD_SETBYTE (data);
LCD_ENABLE();
_delay_us(45);
data2 = (data2 & 0b00001111);
LCD_PORT = (LCD_PIN | LCD_RS) & ~(LCD_EN | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3);
LCD_SETBYTE (data2);
LCD_ENABLE();
_delay_ms(2);
}
void LCD_COMMAND (char command)
{
char command2 = command;
command = (command>>4);
command = (command & 0b00001111);
LCD_PORT = LCD_PIN & ~(LCD_RS | LCD_EN | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3);
LCD_SETBYTE (command);
LCD_ENABLE();
_delay_us(45);
command2 = (command2 & 0b00001111);
LCD_PORT = LCD_PIN & ~(LCD_RS | LCD_EN | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3);
LCD_SETBYTE (command2);
LCD_ENABLE();
_delay_ms(2);
}
void LCD_STRING(char *string)
{
while(*string)
{
LCD_DATA(*string++); // zeichen am LC-Display ausgeben
}
}
void LCD_CLEAR (void)
{
LCD_COMMAND(0b00000001);
}
void LCD_HOME (void)
{
LCD_COMMAND(0b00000010);
}
void LCD_POS (unsigned int line, unsigned int column)
{
if(line)
LCD_COMMAND(0b11000000 + column);
else
LCD_COMMAND(0b10000000 + column);
}
void LCD_INT (int number)
{
char string[16];
itoa(number,string, 10);
LCD_STRING(string);
}
void LCD_HEX (int number)
{
char string[16];
itoa(number,string, 16);
LCD_STRING(string);
}
void LCD_BIN (int number)
{
char string[16];
itoa(number,string, 2);
LCD_STRING(string);
}
void LCD_OCT (int number)
{
char string[16];
itoa(number,string, 8);
LCD_STRING(string);
}
void LCD_INIT (void)
{
LCD_DDR = LCD_DDR | LCD_RS | LCD_EN | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3;
for(int inittimes=0; inittimes<3; inittimes++)
{
LCD_PORT = LCD_PIN | LCD_RS | LCD_EN | LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3;
LCD_PORT = LCD_PORT = LCD_PIN & ~(LCD_EN | LCD_RS);
_delay_ms(15);
LCD_SETBYTE (0x30);
LCD_ENABLE();
_delay_ms(5);
LCD_ENABLE();
_delay_us(100);
LCD_ENABLE();
_delay_us(100);
LCD_SETBYTE (0x20);
LCD_ENABLE();
_delay_us(100);
LCD_COMMAND(0x28);
LCD_COMMAND(0x08);
LCD_COMMAND(0x01);
LCD_COMMAND(0x06);
LCD_COMMAND(0x0C);
LCD_COMMAND(0b00000001);
}
}
LCD.h:
Code:
#ifndef _LCD_h_
#define _LCD_h_
void LCD_SETBYTE (char data);
void LCD_ENABLE (void);
void LCD_DATA (char data);
void LCD_COMMAND (char command);
void LCD_STRING(char *string);
void LCD_CLEAR (void);
void LCD_HOME (void);
void LCD_POS (unsigned int line, unsigned int column);
void LCD_INT (int number);
void LCD_HEX (int number);
void LCD_BIN (int number);
void LCD_OCT (int number);
void LCD_INIT (void);
#define LCD_DDR DDRA
#define LCD_PORT PORTA
#define LCD_PIN PINA
#define LCD_EN PIN 6
#define LCD_RS PIN 4
#define LCD_D0 PIN 0
#define LCD_D1 PIN 1
#define LCD_D2 PIN 2
#define LCD_D3 PIN 3
#define PIN 1<<
#endif
Und ein kleines Anwendungsbeispiel (Laufschrift in der ersten Zeile und Counter in der zweiten):
Code:
#include <avr/io.h>
#include <util/delay.h>
#include "LCD.h"
int main(void)
{
LCD_INIT();
char Zeichenstring[] = "LCD-Lib funzt! ";
char temp;
char schleife;
unsigned char counter=0;
while(1)
{
LCD_CLEAR();
LCD_POS(0, 0);
LCD_STRING(Zeichenstring);
LCD_POS(1, 5);
LCD_INT(counter++);
temp = Zeichenstring[0];
for(schleife=0; schleife<14; schleife++)
{
Zeichenstring[schleife] = Zeichenstring[schleife+1];
}
Zeichenstring[14] = temp;
_delay_ms(220);
}
return 0;
}
Gruß
-schumi-
Lesezeichen