Hallo, wollte ein Programm zur Ansteuerung eines LCD Displays. Habe mir
dazu was abgetippt, bekom aber keine gescheite ausgabe ins display.
vielleicht kann wer helfen würd mich freuen.
Hier mein Code in c:
#define F_CPU 3686400
#include <avr\io.h>
#include <util\delay.h>
void wait_ms (int miliSec)
{
_delay_loop_2(1*(F_CPU/(1000/4))*miliSec);
}
void wait_us (int mikroSec)
{
_delay_loop_2(1*(F_CPU/(1000000/4))*mikroSec);
}
void lcd_init()
{
DDRD=0x0ff;
PORTD=0;
wait_ms(50);
PORTD=0x30;
PORTD|=(1<<3);
PORTD&=~(1<<3);
wait_ms(5);
PORTD=0x30;
PORTD|=(1<<3);
PORTD&=~(1<<3);
for (int i=0;i<100;i++);
PORTD=0x30;
PORTD|=(1<<3);
PORTD&=~(1<<3);
wait_ms(5);
PORTD=0x20;
PORTD|=(1<<3);
PORTD&=~(1<<3);
wait_ms(5);
lcd_cmd(0x28);
lcd_off();
lcd_clear();
lcd_cmd(0x06);
lcd_on();
}
void lcd_send(char data)
{
char rs=PORTD;
rs&=4;
char tmp=data;
tmp&=0xf0;
tmp|=rs;
PORTD=tmp;
PORTD|=(1<<3);
PORTD&=~(1<<3);
tmp=data;
tmp&=0x0f;
tmp*=16;
tmp|=rs;
PORTD=tmp;
PORTD|=(1<<3);
PORTD&=~(1<<3);
wait_ms(2);
}
void lcd_cmd(char cmd)
{
PORTD&=~(1<<2);
lcd_send(cmd);
}
void lcd_clear()
{
lcd_cmd(0x01);
wait_ms(2);
}
void lcd_home()
{
lcd_cmd(0x02);
wait_ms(2);
}
void lcd_on()
{
lcd_cmd(0x0E);
}
void lcd_off()
{
lcd_cmd(0x08);
}
void lcd_goto(int row, int col)
{
row--;
row&=0x01;
row*=40;
col--;
col&=0x0f;
char tmp=row|col;
tmp|=0x08;
lcd_cmd(tmp);
}
void lcd_write(char text)
{
PORTD|=(1<<2);
lcd_send(text);
}
int main (void)
{
wait_ms(200);
lcd_init();
wait_ms(100);
while(1)
{
lcd_write("hallo");
wait_ms(100);
//lcd_clear();
//lcd_home();
}
return 0;}
danke
Achsooo, DAS DISPLAY. Ja dann ist die ganze Initialisierung natürlich falsch! Tut mir leid. Und so wie deine Beschaltung aussieht, passt das auch alles nicht. Mehr Infos mensch. Wie soll man dir so helfen?
Die Initialisierung geht soweit. Doch als Ausgabe schreibt mir das LCD Display nur ein Komma. Bin totaler Anfänger bitte nachsicht. Hab den Code aus dem AVR Lernheft LCD.
Naja was mir so gleich auffällt ist dass du "lcd_write("hallo");" eine
Zeichenkette an eine Funktion sendest, die einen char erwartet welche
wiederum nichts anderes macht als den "char" in irgendeiner Form an das
Display sendet.
Ohne mir jetzt genau alles angesehen zu haben müsste meiner Meinung nach
deine lcd_write routine eher so aussehen1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Gast
#3134348
Bin nun auch kein Profi, meine aber das void wait_ms (int miliSec) und
void wait_us (int mikroSec) nicht richtig funktionieren.
Was hast du denn für einen Quarz an deinem Atmega8 und was für Fuses
sind gesetzt ?
void lcd_write(char text) erwartet ein Char Zeichen ('a') , keinen
String("string").
Woher weißt du das die Initialisierung funktioniert ?
Wozu eine eigene delay() Funktion, wenn es die delay.h gibt?
vielen dank an masterfix deine Antwort funst mercie.
Gast
#3134394
Ist bei mir, jedem? am Anfang durchaus auch vorgekommen. Wenn man nur mit einem Lernheft arbeitet, ist das auch nachvollziehbar. Die Befehle lauten : _delay_ms() _delay_us() Die delay.h ist ja bereits eingebunden.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.