• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

tablice znaków w C

Object Storage Arubacloud
0 głosów
245 wizyt
pytanie zadane 8 lutego 2019 w C i C++ przez Kacper.bat Nowicjusz (180 p.)

A więc problem jest taki: piszę sobie program w C na mikrokontroler ATmega8A. Mam taki wyświetlacz 5x8 i nie wiem jak napisać kod, żeby wygodnie dostać się do każdego LED'a. Początkowo zrobiłem to tak, że napisałem 40 #define'ów dla każdego LED'a np.

#define led11 "D6C5" / 11 oznacza 1 rząd i 1 kolumnę, a D6C5 to tak naprawdę porty PD6 i PC5 które muszą być ustawione, żeby dany LED zaświecił.

no i mam też funkcję:

void high(char ports[4])
{
	switch(ports[0])
	{
	   case 'B': PORTB |= (1<<(ports[1]-'0')); break;
	   case 'C': PORTC |= (1<<(ports[1]-'0')); break;
	   case 'D': PORTD |= (1<<(ports[1]-'0')); break;
	}
	switch(ports[2])
	{
           case 'B': PORTB &= ~(1<<(ports[3]-'0')); break;
	   case 'C': PORTC &= ~(1<<(ports[3]-'0')); break;
	   case 'D': PORTD &= ~(1<<(ports[3]-'0')); break;
	}
}

Ta funkcja patrzy po tych literkach i cyferkach i ustawia odpowiedni port na 1, a inny na 0.

OK, działa, ale nie mogę (albo po prostu nie umiem smiley )  zrobić na przykład prostej gry Pong, bo trzeba by było zmieniać o jeden coś w stylu led11+01, a tak raczej się nie da przy define'ach. Ktoś coś?

1 odpowiedź

0 głosów
odpowiedź 8 lutego 2019 przez j23 Mędrzec (194,920 p.)
wybrane 8 lutego 2019 przez Kacper.bat
 
Najlepsza

Zrób sobie tablicę dwuwymiarową z tymi 40 definicjami, dzięki której łatwiej Ci będzie mapować pozycję x i y do odpowiedniej wartości podawanej funkcji high.

komentarz 8 lutego 2019 przez Kacper.bat Nowicjusz (180 p.)
Ok, tablicę dwuwymiarową umiem zrobić, ale napis w C też jest tablicą, to mam zrobić tablicę tablicy? Albo trójwymiarową? Próbowałem, ale jakoś nie szło. Czy może zrobić tablicę define'ów? Tylko jak zinitalizować zmienną, jako co?
komentarz 8 lutego 2019 przez j23 Mędrzec (194,920 p.)
const char* tab[8][5] = { 
        { led11, led12, led13, led14, led15 }, 
        { led21, led22, led23, led24, led25 }, 
        { led31, led32, led33, led34, led35 }, 

        /* itd. */ 
};


...
void high(tab[y][x]);

Zastanowiłbym się, czy nie lepiej użyć wartości 8-bitowych zamiast tekstu (2 bity na indeks portu, 6 na wartość przypisywaną do tego portu).

komentarz 8 lutego 2019 przez Kacper.bat Nowicjusz (180 p.)
O widzisz, muszę koniecznie jeszcze kilka razy o tych wskaźnikach obejrzeć u pana Zelenta filmik, bo widzę, że dalej nie ogarniam :D. No nic, zaraz sprawdzę.
komentarz 8 lutego 2019 przez j23 Mędrzec (194,920 p.)
Może lepiej poszukaj jakiejś dobrej książki do C/C++.
komentarz 8 lutego 2019 przez Kacper.bat Nowicjusz (180 p.)
edycja 8 lutego 2019 przez Kacper.bat
Dobra, eureka! Haha, fajnie, że działa. Ja już się w bity nie będę pchał, bo doświadczony zbytnio nie jestem w programowaniu, to mi wystarczy. Ciekawi mnie jednak, jak to widzisz. Jak Ci się chce, to możesz napisać. A, i to nie jest wartość przypisywana do portu, bo do portu przypisuję jedynie 0 albo 1. To jest zwykła liczba w nazwie, każdy port składa się z trzech znaków, pierwsza jest zawsze - w moim przypadku - literka P, potem rejestr, czyli B, C albo D i cyferka od 0 do 7 :). (Chyba, że o to ci chodziło, to sorki)

PS: No, koniecznie jakąś książkę muszę nabyć, ale nie wiem, czy jest taka, co mnie nauczy i języka i jego zastosowania w AVR, bo to mnie teraz najbardziej interesuje. Mam wrażenie, że w tych typowo dla mikrokontrolerów będzie tylko ich obsługa.

EDIT: PSS: domyślam się, że te bity to wartości typu uint8_t, bo one mają maks 8bitów. Domyślam się również, jak to zrobić :). I już chyba wiem, o co ci chodzi. dla B, C i D wystarczą dwa bity, bo może być 0,0 0,1 i 1,1 więc idealnie 3, a dla 8 cyfr 3 bity, tylko braknie nam chyba 2 w sumie bo po 2 porty na jedną zmienną to będzie trzeba uint16_t. Coś pewnie poplątałem :).

Podobne pytania

0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 20 stycznia 2018 w Assembler przez proszeopomoc Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 139 wizyt
0 głosów
0 odpowiedzi 207 wizyt
pytanie zadane 17 grudnia 2017 w C i C++ przez Kamillo112 Nowicjusz (120 p.)

92,565 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...