Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32][C] - klawiatura matrycowa i LCD16x02

micrograf 16 Mar 2012 19:59 2070 15
  • #1 16 Mar 2012 19:59
    micrograf
    Poziom 9  

    witam,

    muszę napisać program wprowadzający znaki z klawiatury matrycowej i wyświetlający je na LCD. Doszedłem do momentu gdzie po wciśnięciu klawisza dana cyfra zostaje załadowana do tablicy i wyświetlona na LCD. Ale potrzebuje aby co najmniej 4 cyfry kolejno wciskane zostały zapisane w tablicy. Proszę o naprowadzenie jak mogę to zrobić ?

    0 15
  • Pomocny post
    #2 16 Mar 2012 20:30
    gaskoin
    Poziom 38  

    Musisz sobie utworzyć coś w rodzaju wskaźnika do tablicy. Może to być np int, który będzie wskazywał na kolejne indeksy w tablicy.

    Wpisujesz zmienną do tablica[indeks] i zwiększasz indeks.

    0
  • #3 13 Lip 2012 21:48
    micrograf
    Poziom 9  

    Ostatnio powróciłem do problemu wpisywania danych z klawiatury, rzeczywiście na wskaźniku działa, ale nie do końca poprawnie. Mając tablice 4 elementową wprowadzam cyfry z klawiatury po kolei, pierwsze trzy wyświetlane są poprawnie a dla czwartej na wyświetlaczu pojawia mi się czwarta wprowadzona cyfra i na 5 pozycji pojawia się niepożądany znak. kawałek kodu:

    Kod: C
    Zaloguj się, aby zobaczyć kod


    KBD_ReadKey() zwraca znak wciśnięty na klawiaturze matrycowej, jest typu char, jak klawisz nie jest wciśnięty zwraca 0x00,

    Może ktoś z forumowiczów ma jakiś pomysł i naprowadzi mnie na poprawne rozwiązanie.

    0
  • #4 13 Lip 2012 21:56
    michalko12
    Specjalista - Mikrokontrolery

    Ręce opadają...

    Zamiast
    unsigned char bufor[4];

    napisz

    unsigned char bufor[5];

    i poczytaj o stringach w C, co jest w nich takiego charakterystycznego na końcu.

    0
  • #5 13 Lip 2012 22:16
    micrograf
    Poziom 9  

    Generalnie wiem co na końcu stringa musi wystąpić żeby nie czytał przypadkowych danych z pamięci, aż do napotkania jakiegoś null-a.

    Po zmianie na unsigned char bufor[5]; dane z klawiatury wprowadzane są na 6 pozycji tablicy a 7 pozycja to ten niepożądany znak...dziwne...

    0
  • #6 13 Lip 2012 23:00
    stanleysts
    Poziom 27  

    LCD_WriteTextXY(bufor,1,1); ta funkcja to co ona wogóle wyświetla? jedną wartość z tablicy, czy całą zawartość tablicy?

    Cytat:

    Po zmianie na unsigned char bufor[5]; dane z klawiatury wprowadzane są na 6 pozycji tablicy a 7 pozycja to ten niepożądany znak...dziwne...


    na jakiej 6tej i 7mej pozycji tablicy jak takiej wogóle nie ma?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie pisze się tak.

    0
  • #7 13 Lip 2012 23:11
    micrograf
    Poziom 9  

    LCD_WriteTextXY(bufor,1,1); - funkcja wyświetla aktualną zawartość tablicy podczas wpisywania liczb z klawiatury. argumentem jest typ char. No właśnie nie ma takiej pozycji w tablicy ale wyświetlacz wyświetla 6 i 7 pozycję, 6 jest zawsze taka jaką wcisnę na klawiaturze, a 7 to jakieś śmieci, i to jest dziwne,...

    rozumiem że należy napisać

    Kod: C
    Zaloguj się, aby zobaczyć kod

    0
  • #8 13 Lip 2012 23:13
    stanleysts
    Poziom 27  

    Cytat:
    No właśnie nie ma takiej pozycji w tablicy ale wyświetlacz wyświetla 6 i 7 pozycję, 6 jest zawsze taka jaką wcisnę na klawiaturze, a 7 to jakieś śmieci, i to jest dziwne,...
    Ja nie rozumiem tego -> jak można wyświetlać pozycję której nie ma?

    no ale to w takim razie funkcja wyświetla zawsze wartość spod adresu bufor, czyli bufor[0], a Ty zapisujesz wartosci do kolejnych miejsc tablicy.
    pokaż lepiej jak wygląda wnętrze tej funkcji

    jeśli dobrze myśle to spróbuj ją też tak wywołać: LCD_WriteTextXY(*wsk,1,1);

    0
  • #9 13 Lip 2012 23:35
    micrograf
    Poziom 9  

    Funkcja wyświetla na LCD kolejne wartości wprowadzane do tablicy bufor, nie tylko z pod adresu bufor[0],

    LCD_WriteTextXY(*wsk,1,1); - nie działa, natomiast LCD_WriteTextXY(wsk,1,1); - wyświetla same śmieci, pewnie wartości adresów?

    Cytat:
    Ja nie rozumiem tego -> jak można wyświetlać pozycję której nie ma?


    Ja też tego nie rozumiem, ale wyświetla się zawsze więcej cyfr niż zadeklarowana tablica...

    0
  • #10 13 Lip 2012 23:40
    stanleysts
    Poziom 27  

    Dobra nie działa, bo pewnie funkcja przyjmuje adresy tylko, źle popatrzyłem na to. Poza tym przed wywołaniem funkcji wskaźnik jest inkrementowany dlatego odpowiedź na pytanie:

    Cytat:
    natomiast LCD_WriteTextXY(wsk,1,1); - wyświetla same śmieci, pewnie wartości adresów?
    - wyświetla śmieć który się znajduje tam.

    Teraz pytanie:
    Skąd ta funkcja wie ile ma wyświetlić wartości i kiedy zatrzymać wyświetlanie skoro wyświetla kolejne wartości.

    Najlepiej weź pokaż tę funkcję co jest w środku to będziemy wiedzieli co jest nie tak.

    0
  • #11 13 Lip 2012 23:46
    micrograf
    Poziom 9  

    Funkcję obsługującą LCD zaadaptowałem z internetu:

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Tylko dla mnie ważniejsze jest to co zostało zapisane w tablicy bufor - bo ona będzie mi potrzebna w dalszej części aplikacji. na LCD wyświetlam tylko kontrolnie. Wydaje mi się że problem tkwi w wpisywaniu danych do tablicy przy pomocy wskaźników...tylko nie wiem w którym miejscu jest błąd...?

    0
  • #12 14 Lip 2012 08:42
    starob
    Poziom 25  

    michalko12 napisał:
    Ręce opadają...

    Zamiast
    unsigned char bufor[4];

    napisz

    unsigned char bufor[5];

    i poczytaj o stringach w C, co jest w nich takiego charakterystycznego na końcu.


    .. i nie doczytał!!! ...a stoi jak byk

    void LCD_WriteText(unsigned char * text)
    {
    while(*text)
    LCD_WriteData(*text++);
    }

    , że znacznikiem końca stringu jest 0. Procedura będzie wyświetlać do momentu aż gdzieś w pamięci przypadkiem trafi na 0.

    Dopisz
    if (KBD_ReadKey() != 0x00 ){
    *wsk=KBD_ReadKey();
    *wsk++;
    *wsk=0;

    0
  • #13 14 Lip 2012 08:59
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #14 14 Lip 2012 09:10
    starob
    Poziom 25  

    Freddie Chopin napisał:
    starob napisał:
    *wsk++;

    Ciekawe co ta linijka ma niby robić i niby po co?

    4\/3!!

    ..tak głeboko to nie analizowałem :) ..popełniłem tylko
    *wsk=0; jako znacznik końca (kolejny za wczytanym z klawiatury)
    Powinna być jeszcze kontrola zakresu żeby nie przekroczyć rozmiaru bufora.

    0
  • #15 14 Lip 2012 11:31
    micrograf
    Poziom 9  

    Po dodaniu *wsk=0; działa prawidłowo,

    starob napisał:

    Powinna być jeszcze kontrola zakresu żeby nie przekroczyć rozmiaru bufora.
    - w jaki sposób mogę to kontrolować?

    Jeśli mój kod jest niepoprawny to prosiłbym o przedstawienie jakiegoś innego rozwiązania.

    0
  • #16 14 Lip 2012 13:02
    starob
    Poziom 25  

    tak jak proponował

    gaskoin napisał:
    Musisz sobie utworzyć coś w rodzaju wskaźnika do tablicy. Może to być np int, który będzie wskazywał na kolejne indeksy w tablicy.

    Wpisujesz zmienną do tablica[indeks] i zwiększasz indeks.

    ..operujesz wtedy na bufor[indeks] i pilnujesz czy indeks nie przekracza rozmiaru zadeklarowanego bufora, pamiętając o zerze na końcu łańcucha znaków.
    Bufor musi być o 1 większy od ilości znaków właśnie na to ostatnie zero.

    0