Hallo
ich bastle gerade an nem Programm für ne 7Segment anzeige
Um deine Zahl in ihre Ziffern zu zerlegen.
Dazu hab ich Dei ZAhl in nen char Aray geschrieben und lese jetzt die
enstsprechende stelle wieder aus. Aber wie wandel ich die jetzt gelesene
ZAhl wieder in en int wert um um sie dan anzuzeigen??
Danke
Felix
Felix Geerkens schrieb:> Dazu hab ich Dei ZAhl in nen char Aray geschrieben und lese jetzt die> enstsprechende stelle wieder aus.
und warum?
456 / 100 = 4
(456 % 100) / 10 = 5
(456 % 10 ) = 6
Felix Geerkens schrieb:> Aber wie wandel ich die jetzt gelesene> ZAhl wieder in en int wert um um sie dan anzuzeigen??
Für eine Siebensegmentanzeige brauchst du die Segmentcodes und die
passen in ein Byte rein.
Tag danke für die schnellen antworten.
@Peter geht des Wirklich kommt da dann nicht 4,56 raus??
@Michael danke für den Hinweis ich hatte oben blos int gschreiben um
nicht weiter zu verwirren
Vielen Danke Felix
Jep ich weis danke für die Hilfe
es ist peinlich das ich nicht selbst auf diese lösung gekommen bin und
die frage mit char war auch nur zur absicherung
So AHbs jetzt Reingeschrieben es geht soweit einziges Problem ist wenn
ich eine zahl größer 10 anzeige kommt am der einser Stelle nurnoch sch..
raus
woran könte das liegen hier mal mein code:
1
#include<avr/io.h> //Grundfunktionen
2
#ifndef F_CPU //Vordefinieren für delay.h
3
#define F_CPU 8000000UL //Definition von F_CPU in Herz
4
#endif
5
#include<util/delay.h> //Warteschleifen
6
#include<avr/interrupt.h> //Interruptheader
7
8
typedefunsignedcharbyte;
9
10
//Hier kann man den Code an seine Siebensegment Anzeige anpassen
Das ist jetzt aber nicht die Funktion mit der du die Stelle berechnen
willst oder?
Spielen wir das mal durch mit 213 und Stelle 1
213 / 1 = 213
mit Stelle 2
213 / 2 = 106 (die ,5 wird abgeschnitten)
mit Stelle 3
213 / 3 = auch falsch.
Denk doch mal nach. Du kannst die Stelle ja nicht einfach so berechnen.
Wenndann muss du alle stellen berechnen.
Also 213 / 100 = 2 = hunderter
213 - (2(hunderter)*100) = 13
13 / 10 = 1 = zehner
13 - (1(zehner)*10) = 3
3 = einer
so geht das. Alternativ sind itoa oder sprinft:
http://www.mikrocontroller.net/articles/FAQ#itoa.28.29_.28utoa.28.29.2C_ltoa.28.29.2C_ultoa.28.29.2C_ftoa.28.29_.29
Klar ?
ops daran hab ich garnicht gedacht
dei sache ist die das ich die zentrale berechnung wenn möglich vrmeiden
will und auch nicht wissen muss wie vile stellen meien anzeige bzw meien
zahl hat ich. ich werde also nochmal darüber nachdenken müssen
felix
fals ihr ne ide habt wie ich des lösen kann schreibt es
Ja sagmal klickst du das Zeug nur zusammen? Lies mal ein C Buch oder
zumindest die Referenz zu atoi und itao
1
intBerechnung(byteStelle,intVar)
2
{
3
inty;//y Rückgabewert
4
charBuffer[3];
5
itoa(Var,Buffer,10);
6
y=atoi(Buffer[Stelle]);
7
bytex=y;
8
returnx;
9
}
Was soll das sein? Zuerst machst du aus dem Integer einen String und
dann wieder einen Integer?
itoa ist richtig, macht dir aus dem Integer einen String aber der steht
natürlich im ASCII Format in dem Array:
http://www.asciitable.com/index/asciifull.gif
213 = 2,1,3,0 (binäre Null (\0) am Schluss immer bei Strings!)
abgelegt wird es also:
50,49,51,0
Diese Werte findest du in der Tabelle s.o. 49='1', 50='2', 51='3', ...
Wie kommt man von 49 auf 1? -> 48 Abziehen
Wie kommt man von 50 auf 2? -> 48 Abziehen
Wie kommt man von 51 auf 3? -> 48 Abziehen
....
blüht dir was ?
Zahl = ASCII Char - 48
Buffer[3] ist natürlich zu klein weil die binäre Null immer mit muss.
Also Buffer[4] ist richtig. Mach mal ein C Tutorial - das sind absolute
Basics.
itoa und atoi sind brutalst Speicher- und Geschwindigkeitsfressend.
Darum realisiere lieber die Umrechnung wie ich sie dir oben
vorgeschlagen habe. Die Divisionen brauchen schon lange genug.
Felix Geerkens schrieb:> leider zeigt meine 7segm nur noch 0 an was mache ich falsch
Geh das Programm mal manuell mit Papier und Stift schrittweise durch.
Dann kommst du bestimmt drauf.
Das Programmbeispiel ist nur dafür gedacht, Rekursion zu erklären. In
einer realen Mikrocontroller-Anwendung will man sich den Stack nicht so
vollmüllen ...
Wer nicht iterativ programmieren kann kann es rekursiv schon gleich
dreimal nicht :-D
Also jetzt mal im Ernst - jetzt kann ich echt nicht mehr zuschauen.
1
intBerechnung(unsignedbytedigit,intinp_var)
2
{
3
charbuffer[4];// Buffer for itoa
4
itoa(inp_var,buffer,10);// convert inp_var to char, dec
5
return(Buffer[digit]-48);// convert char to number
Fabian O. schrieb:> Das Programmbeispiel ist nur dafür gedacht, Rekursion zu erklären. In> einer realen Mikrocontroller-Anwendung will man sich den Stack nicht so> vollmüllen ...
Da hast du Recht, wenn der Stack nur klein ist.
Walter S. schrieb:> Michael schrieb:>> Also jetzt mal im Ernst - jetzt kann ich echt nicht mehr zuschauen.>> das mag ja vielleicht funktionieren, schön ist aber was anderes
Ausserdem ziemlich sicher nicht das was er will. Denn die fehlenden
führenden 0-en machen ihm zu schaffen. Das ist bei LCD schon 'ein
Problem', bei 7-Segment Anzeigen will man aber üblicherweise haben, dass
die Einerstelle immer an derselben Stelle steht.
Allerdings stellt Felix sich auch wirklich an.
Man zerlegt nicht die Zahl während der eigentlichen Ausgabe. Die Ausgabe
(in einer ISR) zeigt vorgefertigte Bitmuster an. Wo immer die auch
herkommen. Zb. aus einer Funktion, die eine Zahl in die 3 Stellen
zerlegt und die entsprechend anzuzeigenden Bitmuster in den globalen
Variablen hinterlässt, auf dass die Anzeige-ISR sie regelmässig an die
7-Segment ausgibt.
Karl Heinz Buchegger schrieb:> Das ist bei LCD schon 'ein> Problem', bei 7-Segment Anzeigen will man aber üblicherweise haben, dass> die Einerstelle immer an derselben Stelle steht.
Dann muss er sprintf nehmen oder programmieren lernen ...
Michael schrieb:> Karl Heinz Buchegger schrieb:>> Das ist bei LCD schon 'ein>> Problem', bei 7-Segment Anzeigen will man aber üblicherweise haben, dass>> die Einerstelle immer an derselben Stelle steht.>> Dann muss er sprintf nehmen oder programmieren lernen ...
:-)
Er muss nur durch 10 dividieren lernen und lernen was es mit Modulo auf
sich hat.
Karl Heinz Buchegger schrieb:> Er muss nur durch 10 dividieren lernen und lernen was es mit Modulo auf> sich hat.
*Mathe lernen
*C lernen
*Und Rechtschreibung wären auch noch schön
Da hat er ja noch was zu tun.
Karl Heinz Buchegger schrieb:> Michael schrieb:>> Karl Heinz Buchegger schrieb:>>> Das ist bei LCD schon 'ein>>> Problem', bei 7-Segment Anzeigen will man aber üblicherweise haben, dass>>> die Einerstelle immer an derselben Stelle steht.>>>> Dann muss er sprintf nehmen oder programmieren lernen ...>> :-)> Er muss nur durch 10 dividieren lernen und lernen was es mit Modulo auf> sich hat.
Das hab ich ihm oben auch schon vorgekaut aber das nimmt er ja auch
nicht an.
Michael schrieb:> Also 213 / 100 = 2 = hunderter> 213 - (2(hunderter)*100) = 13> 13 / 10 = 1 = zehner> 13 - (1(zehner)*10) = 3> 3 = einer
Ich weiß echt nicht was daran so schwer ist. Modulo braucht man da ja
nicht mal. Und mit ein paar schnellen if-Abfragen kann man sich die
führenden Nullen oder Vorzeichen spielend holen.
Michael schrieb:> Ich weiß echt nicht was daran so schwer ist.
Na ja..
Er hat sich da in eine dämliche Funktion "Anzeige" verrannt.
Das ist
a) schon mal der grundsätzlich falsche Weg
b) bringt ihn das bei der Zerlegung nicht weiter.
(Man kann schon so eine Funktion benutzen. Aber eigentlich braucht
die kein Mensch.)
Erst mal muss er verstehen, dass er eine Zahl als ganzes auf seine 7_Seg
ausgibt. Dann wird alles ganz einfach. Sein eigentliches Problem ist das
Multiplexen. Wenn er das richtig ansetzt ist der Rest nur noch Pipifax.