Skocz do zawartości

Gra punktowa dla początkujących programistów


Johny94

Pomocna odpowiedź

Witam, 

chciałem stworzyć sobie urządzenie, które będzie mi zliczało punkty za wciśnięcie jednego z trzech przycisków. Ogólnie chodzi o to, że są trzy przyciski i np. jeden przycisk daje 1pkt, drugi 2pkt, trzeci 10pkt. Kiedy suma punktów będzie większa lub równa 10 ma się zapalić jakiś LED sygnalizujący wygraną. Zrobiłem taki program, natomiast nie do końca poprawnie działa, ponieważ nie zlicza poprawnie punktów. 

Proszę o pomoc w rozwiązaniu problemu.

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

// WYJŚCIA
#define WY1 (1<<PD5)
#define WY1_TOG PORTD ^= WY1 //ZMIANA STANU LED1, 10 IMPULSÓW, SYGNAŁ WYJŚCIOWY
#define LED2 (1<<PD6)
#define LED2_TOG PORTD ^= LED2 //ZMIANA STANU LED2, 2 IMPULS
#define LED3 (1<<PD7)
#define LED3_TOG PORTD ^= LED3 //ZMIANA STANU LED3, 1 IMPULSY
#define LED4 (1<<PB0)
#define LED4_TOG PORTB ^= LED4 //ZMIANA STANU LED4
#define LED5 (1<<PB1)
#define LED5_TOG PORTB ^= LED5 //ZMIANA STANU LED5

// WEJŚCIA
#define IMPULS_1 (1<<PC0)
#define IMPULS_2 (1<<PC1)
#define IMPULS_10 (1<<PC2)

uint8_t impuls(uint8_t impuls);

int main(void)
{
	DDRD = 0b11100000; // PD5-PD7 WYJŚCIA
	PORTD &= ~WY1;
	PORTD &= ~LED2;
	PORTD &= ~LED3; // STAN NISKI PD5-PD7
	DDRB = 0b00000011; // PB0, PB1 WYJŚCIA
	PORTB &= ~LED4;
	PORTB &= ~LED5; // STAN NISKI PB0, PB1

	uint16_t im1 = 0;
	uint16_t im2 = 0;
	uint16_t im10 = 0;
	uint16_t reszta = 0;
	uint16_t suma = 0;
 
    while (1) 
    {
		if (impuls(IMPULS_1))
		{
			LED3_TOG;
			_delay_ms(500);
			LED3_TOG;
			im1 = 1;
		}
		if (impuls(IMPULS_2))
		{
			LED2_TOG;
			_delay_ms(500);
			LED2_TOG;
			im2 = 2;
		}
		if (impuls(IMPULS_10)) im10=10;
		
		suma = reszta + im5 + im2 + im1;
		
		if (suma >= 2)
		{
			WY1_TOG;
			_delay_ms(1000);
			WY1_TOG;
			reszta = 5 - im5 - im2 - im1;
			im1 = 0;
			im2 = 0;
			im5 = 0;
		}
	}
}



uint8_t impuls(uint8_t impuls)
{
	if( !(PINC & impuls)) // JEŚLI KLAWISZ WCIŚNIETY
	{
		_delay_ms(80);
		if(!(PINC & impuls)) return 1;
	}
	return 0; // JEŚLI NIE MA IMPULSU ZAKOŃCZ FUNKCJE
}

 

Link do komentarza
Share on other sites

3 godziny temu, Johny94 napisał:

suma = reszta + im5 + im2 + im1;

 

Na początek: gdzie masz definicję zmiennej im5? Kompilator się nie buntował?

Zakładając, że to pomyłka i w miejscu im5 miało być im10

3 godziny temu, Johny94 napisał:

Kiedy suma punktów będzie większa lub równa 10 ma się zapalić jakiś LED sygnalizujący wygraną.

....


		if (impuls(IMPULS_1))
		{
			LED3_TOG;
			_delay_ms(500);
			LED3_TOG;
			im1 = 1;
		}

 

Jeśli zostanie naciśnięty 3 razy np. IMPULS_1 to zmienna im1 nadal będzie równa 1, bo za każdym razem przypisujesz jej wartość 1. Jeśli chcesz sumować punkty, to spróbuj może tak:

		if (impuls(IMPULS_1))
		{
			LED3_TOG;
			_delay_ms(500);
			LED3_TOG;
			im1 += 1;
		}

Oczywiście dla IMPULS_2 powinno być im2 += 2;

Nie wiem też, czy to zamierzone działanie, ale przy takim kodzie wciśnięcie przycisku na dłużej niż 500ms spowoduje ponowne naliczenie punktów.


Poza tym nie rozumiem, skoro suma punktów ma być większa równa 10, to dlaczego piszesz:

Cytat



if (suma >= 2)

 

 

 

Istnieje też duże prawdopodobieństwo, że wynik tego działania będzie ujemny:

Cytat

reszta = 5 - im5 - im2 - im1;

 

a zmienną reszta masz zadeklarowaną jako unsigned.

Ogólnie niezbyt rozumiem z Twojego opisu, jaki dokładnie ma być algorytm działania programu, więc trudno mi tu coś konkretnego doradzić. Może tymczasem przemyśl to, o czym napisałem.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dziękuje za odpowiedź, pomogło mi to bardzo dużo.

Te liczby, były zmieniane do testowania programu, natomiast nie zmieniłem ich tak jak powinno być, jak dodawałem tutaj program.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.