logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega32][C/AVRStudio] Wyświetlanie stringów z odwołaniem

cezik 29 Gru 2008 20:25 1906 3
REKLAMA
  • #1 5920335
    cezik
    Poziom 11  
    Witam!

    W programie mam dwie funkcje wypluwające tekst na LCD. Pierwsza z nich to LCD_WyslijDane(dana), która wysyła odpowiednie hexy do sterownika LCD, a druga to LCD_WyslijLitery(char *x), która wysyła stringi zapisane w cudzysłowiu.

    Pierwsza funkcja wyświetla literki po kolei tak, że widać na bieżąco jak się produkują. Druga natomiast działa błyskawicznie tak, że nie widać wysyłania po kolei, a od razu gotowy tekst.

    W związku z powyższym chcę użyć funkcji LCD_WyslijLitery. Problem w tym, że nie umiem sobie poradzić i nawet nie wiem czy jest to możliwe, aby odwołać się do jakiegoś tekstu z tablicy charów (wpisanie tekstu na sztywno w cudzysłowia jako argumentu funkcji LCD_WyslijLitery nie wchodzi w grę, gdyż tekst ma się zmieniać w trakcie działania programu). Przykładowo:

    Normalnie działa tak:
    
    LCD_WyslijLitery("HELLO") // LCD daje: HELLO
    

    Ma działać tak:
    
    char *napis[10] = {"HELLO"};
    LCD_WyslijLitery(*napis); // LCD daje: HELLO
    

    ... ale nie działa :)


    Nie mam pomysłu jak inaczej się odwołać do zdeklarowanej tablicy charów i czy w ogóle ta funkcja może to zrobić. Jakieś złote rady?
  • REKLAMA
  • Pomocny post
    #2 5920378
    Freddie Chopin
    Specjalista - Mikrokontrolery
    bez gwiazdek

    char *napis[10] = {"HELLO"}; -> to jakies ufo - wskaznik na tablice ewentualnie tablica wskaznikow [; powinno byc:

    char napis[]="HELLO";

    LCD_WyslijLitery(*napis); -> kolejne ufo (podstawy c), do funkcji powinienes przekazac adres pierwszego elementu, a tak sie sklada, ze nazwa tablicy jest wskaznikiem na pierwszy element, czyli:

    LCD_WyslijLitery(napis);

    albo

    LCD_WyslijLitery(&napis[0]);

    4\/3!!
  • REKLAMA
  • #3 5920558
    cezik
    Poziom 11  
    Jednak ludzka głupota nie zna granic. Ten wariant też już wcześniej próbowałem, jednak przeoczyłem głupi fakt, że wyświetlałem ten napis po za widocznym obszarem LCD, więc tak czy siak nic nie widziałem... w każdym razie dzięki za pomoc, działa! :]

    Dodano po 4 [godziny] 57 [minuty]:

    Mam jeszcze jeden problem z tablicą charów. Aktualnie chcę wpisywać do tablicy NAPIS, elementy z tablicy LCD_Bufor. Tablica LCD_Bufor jest typu uint8_t, a NAPIS typu char. Wpisywanie wygląda tak:

    
    LCD_Bufor[LCD_Licznik] = 0x00;
    
    			do 
    			{
    				napis[LCD_LicznikHistorii] = LCD_Bufor[y];
    				LCD_LicznikHistorii++;
    				y++;
    			}
    			while(LCD_Bufor[y] != 0x00);
    


    Natomiast wypisanie charów na LCD tak:
    
    if (PS2_Dane == F1)
    		{	
    			for (jest = 0; jest < LCD_Enter[0]; jest++)
    			{	
    		             LCD_WyslijLitery(&napis[jest]);	
    			}
    		} 
    

    LCD_Enter to tablica która zawiera informacje ile znaków zawiera wpisany string. Przykład:
    Wpisuję słowo KINKI. Wyświetla się INKINKIKII.
    Sprawdzając kolejne elementy tablicy NAPIS okazuje się że przedstawiają się następująco:
    [,inki,nki,ki,i] // pierwszy element pusty

    Zastanawia mnie dlaczego te literki nie wpisują się pojedynczo i w ogóle skąd ta dziwna losowość wpisywania? Czy źle wpisuję dane z jednej tablicy do drugiej?
  • #4 5923980
    Sledge
    Poziom 11  
    Zapewne funkcja wyglada +/- tak
    LCD_WyslijLitery(char * text)
    {
    while(*text)
            {
               LCD_WyslijDane(*text++);
            }
    }
    


    To co ci się wyswietla wynika ze skladni jezyka C, jesli znasz wskazniki bedzie latwo jesli nie to radze nauczyc sie wskaznikow :P

    Zalozmy ze mamy

    char TAB[5];
    char *WTAB;

    nazwa tablicy to defacto jej adres, czyli wskaznik na jej poczatek,
    WTAB = TAB; //TAB to adres wiec &(rekurencja) jest zbedna

    wysylajac np TAB[2] wysylasz adres tablicy przesuniety o 2 elementy
    TAB[2] to to samo co (WTAB+2)

    Do wysłania pojedynczego znaku musisz wykorzystac funkcje LCD_WyslijDane(dana)

    LCD_WyslijLitery(&napis[jest]); - Nie masz tu zadnego warninga ?

    To ze pierwszego elementu nie ma zapewne wynika z tego
    LCD_Bufor[LCD_Licznik] = 0x00;
    jesli LCD_Licznik = 0 to czyscisz [w twoim przypadku] litere K
REKLAMA