Forum: Mikrocontroller und Digitale Elektronik [C] PIND Auslesen und auf Display ausgeben.


von C. H. (hedie)


Lesenswert?

Hallo

Ich möchte den Dezimal Wert der PORTD an ein LCD Senden...

Ich mache das in meinem Prog so:
1
void send_int(int *zahl){
2
       char Buffer[20];          //umwandlung von Dezimal in ASCII
3
       itoa(zahl, Buffer, 10 ); 
4
     
5
       lcd_string(Buffer);
6
    }
7
8
9
10
int main(void){
11
12
    lcd_init();
13
  DDRD = 0;
14
  
15
  
16
 while(1)
17
    { 
18
  set_cursor(0,1);
19
  send_int(PIND);
20
    }
21
}

Wenn ich nun zb. Taster 0 Drücke, dan steht auf dem Display 254
wenn ich Taster 1 Drücke steht 253
wenn ich Taster 1 und 0 Drücke so steht 252

Also alles ok

wenn ich taster 7 Drücke, steht 127
wenn ich taster 6 drücke steht 191
wenn ich jedoch taster 7 und 6 drücke, steht 637

woher kommt das?

Danke schonmal

von hans (Gast)


Lesenswert?

Da steht 63 und das Stimmt auch!!

Die 7 ist wohl vom schreiben davor stehengeblieben (127).

Ausgabe anpassen und fertig.

Gruß hans

von C. H. (hedie)


Lesenswert?

Achjaaaaaaaaaaa

hab ich total vergessen :D

Hmmm.... wie krieg ich den nun die nachfolgenden zeichen gelöscht?

Ich bin noch anfänger in c... sorry

das sowas lcd_sting("         "); gehen würde weis ich schon
aber das erschein mir etwas unsauber....

von fubu1000 (Gast)


Lesenswert?

Hallo mal wieder Claudio,
also ich wette mal du drückst taster 7 und 127 erscheint auf dem 
Display.
danach drückst Taster 6 und 7. Da sollte dann nach deiner 
Anschlussbelegung natürlich 63 erscheinen.
Das Problem ist nur du setzt den Cursor immer auf erstes Zeichen und da 
127 drei Zeichen hat und 63 nur zwei wird von der 127 nur 1 und 2 
überschrieben und die 7 bleibt stehen. Ergebnis = 63 von Taster 6 und 7 
und die 7 von der 127. Also alles Ok.

MAch also am besten bei sowas lcd_clear(); statt set_cursor.

Gruss

von hans (Gast)


Lesenswert?

Einfach den Buffer vorher löschen!

       char Buffer[20]={"                    "};

statt  char Buffer[20];

sollte gehen

gruß hans

von C. H. (hedie)


Lesenswert?

Danke für die Antworten....

letztere Funktioniert leider nicht :(

von fubu1000 (Gast)


Lesenswert?

HAst du denn schon lcd_clear(); probiert ???
DAs sollte gehen, wenn nicht lcd_clear() und set_cursor(0,1);

GRuss

von C. H. (hedie)


Lesenswert?

Hi....

ja hab ich probiert....

Das problem ist, wenn ich lcd_clear() in der while(1) schleife
ausführe, dann sieht man nix mehr auf dem display.....

also müsst ich bei Stellen wechsel clear nur einmal ausführen
doch bevor ich mir den kopf zerbrochen habe wie man das machen könnte,
hab ich gedacht ich warte ab ob es noch ne andere lösung gibt

von fubu1000 (Gast)


Lesenswert?

while(1)
  {
  if(PIND != 0xFF)
  {
     _delay_ms(500);    //billig entprellung der tasten, besser mit 
Timer
     lcd_clear();
     send_int(PIND);
   }
  }

von fubu1000 (Gast)


Lesenswert?

Funktioniert natürlich nur wenn vom PORTD alle Pins auf High liegen.
Ansonsten musste natürlich das if(PIND != 0xFF) anpassen.

GRuss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.