Brasilianische Grüße!
Zunächst einmal danke Joby für dein Beispiel. Zweitens hat sein Beispiel nur einen kleinen Fehler. Die Nummer 0x20 ist nicht korrekt. Es sollte 0x04 sein. Außerdem würde ich nur als Vorschlag keine hexadezimalen Zahlen wie 0xFB, 0x20 oder 0x04 im Code verwenden. Ich würde vorschlagen, die PIN-Port-Definitionen in der Datei io.h und andere zu verwenden, auf die in der Header-Datei verwiesen wird. Ich habe das Beispiel von Joby unten mit einigen Kommentaren für die Anfänger umgeschrieben.
# include <avr/io.h>
int main (void)
{
// set all pins on PORTB for output
DDRB = 0xFF;
// set port pin PORTD2 as input and leave the others pins
// in their originally state (inputs or outputs, it doesn't matter)
DDRD &= ~(1 << PD2); // see comment #1
while (1)
{
if (PIND & (1<<PD2)) // see comment #2
PORTB |= (1<<PB2); // see comment #3
else
PORTB &= ~(1<<PB2); // see comment #4
}
return 0;
}
/ *
Kommentare für Anfänger
Kommentar Nr. 1: (1 << PD2) erzeugt die Binärzahl 00000100. Die Operation "~" kippt alle Ziffern, dh die Binärzahl ist jetzt 11111011. Schließlich wendet das & = das logische "AND" zwischen DDRD und 11111011 an und das Ergebnis wird erneut platziert im DDRD-Speicher. Hinweis: Der Operator "AND" vergleicht jedes Bit im DDRD-Speicher mit der obigen Binärzahl. Wenn das Bit in DDRD 0 ist und das Bit in der Binärdatei an derselben Bite-Position 1 ist, ist das resultierende Bit 0, wenn die DDRD 1 ist und das Bit in der Binärdatei 1 ist, ist das resultierende Bit 1, und wenn das Bit in der DDRD ist 1 oder 0 und das Bit in der Binärdatei ist 0, dann ist das resultierende Bit immer 0. Zusammenfassend ändert der Befehl DDRD & = ~ (1 << PD2) nur das Bit PD2 auf Null und lässt die anderen Einsen (Nullen oder Einsen) unberührt. Es scheint ein bisschen kompliziert zu sein, aber nachdem Sie sich daran gewöhnt haben, ist es die beste Möglichkeit, ein bisschen in einem Biss zu ändern, ohne die anderen Teile zu ändern.
Kommentar Nr. 2 : (1 << PD2) erzeugt die Binärdatei 00000100. Mit dem Befehl "PIND & 0000100" wird unter Verwendung der in Kommentar Nr. 1 beschriebenen Logik "AND" nur geprüft, ob die PIND2 (unser Eingangs-Pin, an dem der Taster angeschlossen ist) zu) ist auf hoch gesetzt oder nicht. Alle anderen Pins sind FALSE, da die Binärbits auf 0 gesetzt sind, und da das Binärbit # 2 auf 1 gesetzt ist, ist die IF-Anweisung nur dann TRUE, wenn der PD2-Eingang auf High gesetzt ist, oder FALSE, wenn der PD2-Eingang auf 0 gesetzt ist auf niedrig setzen.
Kommentar Nr. 3 : Gemäß der in Kommentar Nr. 1 erläuterten Logik setzt dieser Befehl den Ausgangspin PINB2 in Port PORTB auf Hochspannung. Wenn Ihre LED korrekt mit einem Widerstand von ~ 300 Ohm an diesen Pin-Port angeschlossen ist und dieser Widerstand mit Masse verbunden ist, sollte die LED aufleuchten.
Kommentar Nr. 4 : Die LED sollte aus den gleichen Gründen, die in den vorherigen Kommentaren erläutert wurden, erlöschen.
Schlussbetrachtungen:
a) Um Spannungsschwankungen im Eingangspin PD2 zu vermeiden, wenn der Druckknopf nicht gedrückt wird (offener Stromkreis), empfehle ich dringend, einen Pull-Down-Widerstand (1 kOhm oder höher) anzubringen, damit die LED nicht versehentlich aufleuchtet zu dieser zufälligen Spannungsschwingung.
b) Hinweis zum Haftungsausschluss: Die hier beschriebenen Ideen dienen nur zu Informationszwecken und sollten NICHT in realen Systemen verwendet werden, bevor Sie einen Experten für Elektronik konsultiert haben.
* /