Hallo!
Bin noch ein Amateur was C++ und Atmega32 betrifft und hätte da eine
Frage bezüglich des lcd_print(int x,int y, char *t); -
Ich will eine bestimmte Integer-Variable (hier bei mir hat sie den Namen
iDurchlauf) um den Wert 1 hochzählen lassen, sobald ich einen Taster PD2
(meine Anschlussbelegung am Bord) drücke. Drücke ich den Taster nochmal,
zählt es zu der Variable iDurchlauf nochmal 1 dazu und so weiter.Und
iDurchlauf will ich dann jedes Mal am LCD Display ausgeben, doch muss
diesen Wert irgendwie in den Datentyp char *t verwandeln.
Also in einen String. Ich dachte mir, dass über ASCII zu machen, weiter
habe ich es nicht geschafft.
Ich danke Euch für jede Hilfe.
while(1)
{
if (!(PIND & (1<<PD2)))
{
Durchlauf++;
sprintf(StringDurchlauf, "%d", Durchlauf);
lcd_print(1,0,StringDurchlauf);
Wartezeit(1);
}
}
Ich habe die Funktion von egal gleich mal bei mir angewandt. Es
funktioniert einwandfrei. Ich hab zu danken!
(sprintf - habe ich gesucht ;) )
Ich muss mich entschuldigen, nun verzweifle ich jedoch an dem hier:
Ich soll 4 LEDs mir den aktuellen Wert anzeigen - binär - (das geht
natürlich nur bis zur Zahl 15) bei 1 wäre das 0001 - d.h die 4 LED
leuchtet.
Wie geht das ? Es scheint mir unmöglich... Weil müsste ich für jede Zahl
eine eigene IF Funktion haben ? Ich will das alles irgendwie
zusammenfassen, ich will nicht für 15 Zahlen , Fünfzehn IF's in meinem
Programm stehen haben - das wäre nicht schwer , jedoch sehr umständlich
und am Ende auch unübersichtlich. Ihr habt da sicher eine Idee.
if (Durchlauf <= 15)
{
}
Falls die 4 LEDs an einem Port an den Pins 0, 1, 2, 3 hängen, kannst Du
es auch direkt an den Port geben; falls sie an höheren Pins, die aber
trotzdem zusammenhängend sind, vorher entsprechend schieben (wert >> x).
Suchbegriffe um das zu verstehen, was Du brauchst: Bitmasken, bitweise
Operationen.
unten natürlich 0x08
Hint: Der Windows Standard-Taschenrechner kann in der
"Programmierer"-Ansicht Bitmasken, Hexzahlen und Dezimalzahlen
darstellen, das hilft oft.
Ich habe dann nur das Problem, dass wenn ich bei der Zahl 3 bin, nicht
die dritte und vierte LED gleichzeitig zusammen leuchten: 0011
so schaut das zurzeit bei mir aus:
1
if(Durchlauf<=15)
2
{
3
if(Durchlauf&0x01)
4
{
5
PORTD=0x10;
6
}
7
8
if(Durchlauf&0x02)
9
{
10
PORTD=0x20;
11
}
12
13
if(Durchlauf&0x04)
14
{
15
PORTD=0x40;
16
}
17
18
if(Durchlauf&0x08)
19
{
20
PORTD=0x80;
21
}
bei mir sind die oberen 4 Bits die Ausgänge (LEDs) deswegen steht da
0x80 zB 1000 (0000)
das heist die LED ganz links leuchtet. wie mans dreht und wendet kanns
die 4te oder 1te sein.
Stefan S. schrieb:> PORTD = 0x10;
Du willst nicht den ganzen Port beschreiben, sondern du willst genau und
nur das eine Bit auf 1 setzen, an dessen Pin die jeweilige LED hängt!
Bitoperationen um ein einzelnes Bit an einem Port zu setzen wirst du ja
wohl schon gelernt haben.
Stefan S. schrieb:> das heist die LED ganz links leuchtet. wie mans dreht und wendet kanns> die 4te oder 1te sein.
Nein kann es nicht. Wir fangen immer 'unten' zu zählen. Bei der
kleinsten Stelle. In der Zahl 567 ist es auch nicht egal, ob du die 5
jetzt als Einer oder als Hunderter bezeichnest.
1
567
7 ist die Stelle 0, 6 ist die Stelle 1 und 5 ist die Stelle 2 (wir
fangen bei 0 an zu zählen und das aus gutem Grund)
Stefan S. schrieb:> so klappts auch nicht
Irgendwo wirst du eine bereits leuchtende LED auch wieder löschen
müssen. Von alleine geht die nicht aus
IM einfachsten Fall löschr du einfach alle 4 LED, egal ob sie leuchten
oder nicht und setzt dann die Bits, die du benötigst wieder neu. Das
geht so schnell, dass kein Mensch sieht, dass die für ein paar
millionstel Sekunden nicht geleuchtet haben.
Es leuchtet immer nur eine LED, egal ob mehrere LEDs leuchten sollten
wie zB bei 3
die habe ich dort als Kommentar, die Funktion, PORTD &= ~(0xF0);
aber auch mit der klappts nicht :(
Stefan S. schrieb:> Es leuchtet immer nur eine LED, egal ob mehrere LEDs leuchten sollten> wie zB bei 3> die habe ich dort als Kommentar, die Funktion, PORTD &= ~(0xF0);> aber auch mit der klappts nicht :(
Das würde alle 4 LED löschen.
Wenn du das also aktivierst, dann löscht die jeweils 'höchste' LED erst
mal alle 4 LED, ehe sie dann 'ihre' LED aktiviert.
Logisch. Dadurch kann immer nur eine leuchten. Die höchstwertigste
'gewinnt'.
wie war das nochmal mit du sollst nur genau das eine Bit setzen, das du
an dieser Stelle für genau diese LED brauchst?
Wenn an PORTD etwas zuweist, dann veränderst du ALLE Bits. Du setzt hier
1
PORTD=0x10;
nicht nur das Bit PD4 auf 1. Du setzt auch gleichzeitig alle anderen
Bits auf 0!
Und das gilt sinngemäss auch für alle anderen Fälle.
Wenn also hier zum Beispiel
1
PORTD=0x80;
die oberste LED eingeschaltet wird, dann schaltest du mit der Zuweisung
die restlichen 3 LED aus!