www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED-Würfel per schalter stoppen


Autor: Voodoo D. (pelikano)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab von einem kollegen ein fertig
programmiertes spiel "Kniffel" bekommen das auch so weit funktioniert.
Für meinen zweck will ich aber nur das man mit einem schalter nach und
nach jeden LED- würfel der auf der platine ist anhalten kann, jedoch hab 
ich keine ahung wie ich des anstellen soll. wäre nett
wenn ihr mir dabei helfen könntet!!

hier ist der quellcode:

#include <reg517.h>
/**** globale Konstantendeklaration **********************************/
/**** globale Variablendeklaration ***********************************/

// Ports deklarieren
sfr wurfel = 0x80; // P0
sfr enable = 0x90; // P1
sfr ausgabe = 0xB0; // P3

// Schalter initalisieren
sfr schalter = 0xA0; // P2
sbit s1 = schalter^0;
sbit s2 = schalter^1;
sbit s3 = schalter^2;
sbit s4 = schalter^3;
sbit s5 = schalter^4;


// gewürfelte Werte für Anzeige
// 1 2 3 4 5 6
char ergebnis[6] = { 0xF1, 0xF8, 0xF9, 0xFC, 0xFD, 0xFE };


// Strings um die Anzeige zu aktivieren
char str[5] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF };

// Würfelergebnisse speichern
char save[5]; // Für Würfel
char erg_aus[5]; // Für Anzeige

// ZählVariabeln
char x, j;

/**** Funktionen *****************************************************/

// Timer 0 Service Routine
isr_t0 ( ) interrupt 1
{
// Zähler für die Anzeigenauswahl (1 - 5)
if (x < 4) x++;
else x = 0;

// Anzeige deaktivieren & Würfelwerte auf Anzeige schreiben & Anzeige
aktivieren
enable = 0xFF;
wurfel = save[x];
enable = str[x];

// Wenn alle Schalter gedrückt sind addiere alle Würfelergebnisse und
gebe sie auf der Anzeige aus
if((s1 == 1) && (s2 == 1) && (s3 == 1) && (s4 == 1) && (s5 == 1))
ausgabe = (erg_aus[0] + erg_aus[1] + erg_aus[2] + erg_aus[3] +
erg_aus[4]);

}


// Timer 1 Service Routine
isr_t1 ( ) interrupt 3
{
// Zähler zum Würfeln (1 - 6)
if (j < 5) j++;
else j = 0;

// Wenn kein Schalter gedrückt Werte übernehmen ansonsten immer nur ein
Teil der Werte übernehmen
if(s1 == 0) { save[0] = ergebnis[j]; erg_aus[0] = (j + 1); }
if(s2 == 0) { save[1] = ergebnis[j]; erg_aus[1] = (j + 1); }
if(s3 == 0) { save[2] = ergebnis[j]; erg_aus[2] = (j + 1); }
if(s4 == 0) { save[3] = ergebnis[j]; erg_aus[3] = (j + 1); }
if(s5 == 0) { save[4] = ergebnis[j]; erg_aus[4] = (j + 1); }

}

/**** Hauptprogramm **************************************************/
main()
{
// Timer 1 (16 Bit Modus) && Timer 0 (8 Bit AutoReload Modus)
TMOD = 0x12;

// Timer 0 & 1 aktivieren
EAL = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;

// Variabeln initalisieren
x = 0;
j = 0;

while(1) // Endlosschleife => Programmabbruch mit RESET
{

} // Ende der Endlosschleife
} // END MAIN

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es wenn Du deinen Kollegen bemühen würdest.
Der kennt sich in diesem Programm doch bestens aus.
Außerdem kann er, falls noch Änderungen erwünscht sind, besser und 
schneller das Progi anpassen.

Lade in zum Essen ein oder in die Kneipe auf ein Bier.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchmal diese Zeile
> if((s1 == 1) && (s2 == 1) && (s3 == 1) && (s4 == 1) && (s5 == 1))
So zu ändern.

if( (s1 == 1) )

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab was vergessen, dass hier noch ändern

> // Wenn kein Schalter gedrückt Werte übernehmen ansonsten immer nur ein
> Teil der Werte übernehmen
> if(s1 == 0) { save[0] = ergebnis[j]; erg_aus[0] = (j + 1); }
> if(s2 == 0) { save[1] = ergebnis[j]; erg_aus[1] = (j + 1); }
> if(s3 == 0) { save[2] = ergebnis[j]; erg_aus[2] = (j + 1); }
> if(s4 == 0) { save[3] = ergebnis[j]; erg_aus[3] = (j + 1); }
> if(s5 == 0) { save[4] = ergebnis[j]; erg_aus[4] = (j + 1); }

und zwar so.

// Wenn kein Schalter gedrückt Werte übernehmen ansonsten immer nur ein
Teil der Werte übernehmen
if(s1 == 0)
{ save[0] = ergebnis[j]; erg_aus[0] = (j + 1);
              save[1] = ergebnis[j]; erg_aus[1] = (j + 1);
              save[2] = ergebnis[j]; erg_aus[2] = (j + 1);
              save[3] = ergebnis[j]; erg_aus[3] = (j + 1);
              save[4] = ergebnis[j]; erg_aus[4] = (j + 1);
}

Hoffe ich habe jetzt keinen fehler gemacht.

PS: Bevor Du das Original verhunst bitte zuerst eine Sicherheitskopie 
machen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.