Mikrocontroller - Ein Leitfaden für Anfänger - Das Knopfspiel
Teilen
Mikrocontroller - Eine Einführung für Anfänger - Das Knopfspiel
Es ist an der Zeit, ein bisschen von dem Gelernten anzuwenden und ein richtiges Spiel zu erstellen. Dieses Spiel verwendet ein paar Drucktasten, zwei Sätze von LEDs (2 Reihen mit je 7 LEDs). Das Ziel des Spiels ist es, dass zwei Personen versuchen, ihren Knopf in kürzester Zeit am häufigsten zu drücken. Zeit. Wenn der Knopf gedrückt wird, leuchten die LEDs nacheinander auf, bis die letzte LED leuchtet und diese Seite gewinnt. Der Gewinner wird durch das Blinken seiner LEDs angezeigt.
Die Schaltung besteht aus zwei Reihen von LEDs, 7 LEDs in jeder Reihe. Da es 7 LEDs für jede Seite gibt, kann ein einziger Port für jeden Satz verwendet werden, und es bleibt immer noch Platz für einen Druckknopf an jedem Port. Ein Druckknopf und 7 LEDs können an 8 Pins oder einen Port mit Pins angeschlossen werden. Im Video verwende ich Port B für den Knopf und die LEDs eines Spielers und Port D für den Knopf und die LEDs des anderen Spielers.
Drei weitere Programmiergrundlagen wurden im Video ebenfalls demonstriert: Arrays, Kapselung und ein bisschen mehr Informationen über Variablen. Die Arrays werden verwendet, um die für jeden Spieler verwendeten Variablen zu vereinfachen. Anstatt einzigartige Variablen für das Entprellen des Knopfes, das Drücken des Knopfes und die zu beleuchtenden LEDs zu erstellen, wurde eine einzige Variable für jede verwendet, die ein Array von "2" enthielt, eines für jeden Spieler. Dies erleichterte auch die Kapselung und die wiederholte Codeverwendung erheblich. Wenn Code im Programm mehrmals wiederverwendet werden soll, ist es sinnvoll, diesen Code in einen speziellen Bereich, eine Funktion oder eine Methode zu legen, damit er bei Bedarf aufgerufen werden kann. Da es zwei Spieler gab, hatten wir identischen Code, der zweimal verwendet werden sollte, wenn das Drücken und Loslassen des Knopfes getestet wird, und den Code, der zum Aufleuchten der LEDs verwendet wird.
Im Programm werden Sie insbesondere einige neue Dinge sehen. Mit der Erstellung neuer Funktionen können wir im Wesentlichen neue Befehle erstellen, die das Programm verstehen wird. Diese Funktionen heißen ProcessPressedButton und ProcessReleasedbutton. Mit Hilfe der Arrays muss lediglich die Array-Nummer (Spielernummer) an diese Funktionen übergeben werden. Im Programm werden Sie als Erstes feststellen, dass es ein paar Anweisungen gibt, die mit "void" beginnen. Dies sind sogenannte Funktionsprototypen. Die Sprache C oder C++ erfordert diese Funktionsprototypen , um dem Compiler mitzuteilen, dass diese im Programm verwendet werden, bevor sie tatsächlich definiert werden. Beachten Sie, dass die Funktionen im Programm (innerhalb der main-Funktion) vor den eigentlichen Funktionen und dem Code (nach der main-Funktion) verwendet werden. Eine Alternative hierzu wäre, die main-Funktion tatsächlich an das Ende des Programms zu setzen und die Prototypen zu entfernen, aber ich persönlich ziehe es vor, die main-Funktion am Anfang zu belassen, um die Übersichtlichkeit zu gewährleisten. Es gibt sogar eine bessere Alternative: ein paar Bibliotheksdateien zu erstellen, die diese neuen Funktionen enthalten, aber wir sind zu diesem Zeitpunkt der Tutorial-Reihe noch nicht auf diesem Programmierniveau angelangt.
Sie werden auch feststellen, dass es Ganzzahlen (Variablen) außerhalb der Hauptfunktion gibt (ignorieren Sie die Klammern und die Zahl 2 vorerst). Dies zwingt diese Variablen, einen globalen Geltungsbereich zu haben. Okay, ich weiß... ich habe den Geltungsbereich noch nicht besprochen (nicht einmal im Video). Der Geltungsbereich ist der Ort, an dem die deklarierten Variablen verwendet werden. Wenn eine Variable innerhalb eines bestimmten Codeblocks deklariert wird, z. B. in einer Funktion, dann lebt und stirbt die Variable in diesem Codeblock und allen Codeblöcken innerhalb dieses Blocks. Wenn beispielsweise die Variablen innerhalb der Hauptfunktion deklariert werden, können diese Variablen nicht in einer anderen Funktion verwendet werden, die außerhalb der Hauptfunktion liegt. Wenn die Variablen auf der untersten Ebene (außerhalb jedes Blocks) definiert werden, werden sie global, und jeder Codeblock kann sie verwenden.
Nun die Arrays... beachten Sie das [2] am Ende der globalen Variablen. Dies ermöglicht die Erstellung von zwei dieser gleichen Variablen, die durch die Verwendung von [0] oder [1] unterschieden werden. Warum "0"? Die Zahlen werden ab 0 indiziert, nicht ab 1. Nehmen Sie also das Pressed[2] als Beispiel. Dies erstellt eine Variable namens Pressed[0] und eine Pressed[1]. Beachten Sie in den Funktionen, dass ich eine Variable in den Klammern habe. Kapselung und Arrays können einige wirklich coole Funktionen in der Programmierung bieten.
#include
void ProcessPressedButton(int ButtonPressed);
void ProcessReleasedButton(int ButtonReleased);
int Pressed_Confidence_Level[2];
int Released_Confidence_Level[2];
int Pressed[2];
int LEDNumber[2];
int main(void)
{
DDRD = 0b01111111;
PORTB = 0b10000000;
PORTD = 0b10000000;
while (1)
{
{
else
{
if (bit_is_clear(PIND, 7))
{
else
{
void ProcessPressedButton(int ButtonPressed)
{
if (Pressed_Confidence_Level[ButtonPressed] > 500)
{
{
if (ButtonPressed == 0) PORTB |= 1 << LEDNumber[ButtonPressed];
if (ButtonPressed == 1) PORTD |= 1 << LEDNumber[ButtonPressed];
LEDNumber[ButtonPressed] ++;
if (LEDNumber[ButtonPressed] >6)
{
{
if (ButtonPressed == 1) PORTD = 0b11111111;
_delay_ms(10);
if (ButtonPressed == 0) PORTB = 0b10000000;
if (ButtonPressed == 1) PORTD = 0b10000000;
_delay_ms(10);
LEDNumber[0] = 0;
LEDNumber[1] = 0;
PORTB = 0b10000000;
PORTD = 0b10000000;
Pressed_Confidence_Level[ButtonPressed] = 0;
void ProcessReleasedButton(int ButtonReleased)
{
if (Released_Confidence_Level[ButtonReleased] > 500)
{
Released_Confidence_Level[ButtonReleased] = 0;