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.

kasowanie pojedynczych znaków hd44780

wojtektorr 20 Gru 2012 11:52 1707 16
  • #1 20 Gru 2012 11:52
    wojtektorr
    Poziom 14  

    Chciałęm wykonać kasowanie pojedynczego znaku po nacisnięciu klawisza 'D' (klawiatura matrycowa 4x4) funkcja LCD_GoTo() działa poprawnie (sprawdzone w innym przypadku) index jest zliczany co naciśnięcie klawisza z wyjątkiem 'D' który to ma kasować a jadnak poniższe rozwiązanie nie działa, coś gdzieś przeoczyłem?
    Wogóle czy to się robi w ten sposób a możę do wyświetlacza trzeba wysyłać komendę z dekrementacja kursora? Proszę o pomoc.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 16
  • #2 20 Gru 2012 13:27
    SeerKaza
    Poziom 20  

    wojtektorr napisał:
    break;
    case 'D': LCD_GoTo(index--,1); LCD_WriteText(" ");
    break;


    zastosowałeś index-- czyli o jeden zmniejszy po wykonaniu instrukcji zmień na --index

    0
  • #3 20 Gru 2012 13:37
    wojtektorr
    Poziom 14  

    Niestety to nie pomaga ale zauważyłem że funkcja LCD_GoTo zawiera parametry unsigned char a ja index który przekazuje do tej funkcji jest typem zmiennej uint8_t.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czy to będzie przyczyną nie działania tego kodu? A jeśli tak to jak to rozwiązać?

    0
  • #4 20 Gru 2012 13:39
    SeerKaza
    Poziom 20  

    A pytanie czy cokolwiek się dzieje po wciśnieciu D ?? Kursor idzie dalej czy stoi w miejscu ??

    0
  • #5 20 Gru 2012 13:45
    wojtektorr
    Poziom 14  

    Pierwszy raz kiedy wcisne to pisze mi ostatnio napisany znak co dziwne w pierwszym wierszu na drugiej pozycji, nastepne nacisniecie nie powoduje zmian na wyswietlaczu dopiero po kilku nacisnieciach znow pisze ostatnio napisany znak raz w pierwszej lini raz w drugiej linii, jakiś haos.

    0
  • #6 20 Gru 2012 14:16
    SeerKaza
    Poziom 20  

    Przydałby sie cały kod by przesledzic co program robi bo tak to cieźko coś doradzić. index to zmienna ktora przetrzymuje miejsce kursora tak ??

    0
  • #7 20 Gru 2012 15:17
    perlon
    Poziom 19  

    To co jest na wyświetlaczu trzymaj w buforze znakowym. Kasowanie wykonaj na buforze a potem lcd_cls() i cały bufor na wyświetlacz. Odpada nadpisywanie spacji i kontrola położenia kursora. A gdybyś chciał zostać przy swoim to po naciśnięciu "D" powinieneś:
    1. Cofnąć kursor o 1
    2. Napisać spację
    3. Znowu cofnąć kursor o 1

    0
  • #8 20 Gru 2012 20:03
    wojtektorr
    Poziom 14  

    Tak index to zmienna która przechowuje pozycje kursora, poniżej przerwanie które obsługuje klawiature. Program ma za zadanie wypisywać pary znaków (np. 15 14 14 48) i po wypisaniu par na całym wierszu ma wysyłać przez rs232.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 20 Gru 2012 21:44
    perlon
    Poziom 19  

    wojtektorr napisał:
    Tak index to zmienna która przechowuje pozycje kursora, poniżej przerwanie które obsługuje klawiature. Program ma za zadanie wypisywać pary znaków (np. 15 14 14 48) i po wypisaniu par na całym wierszu ma wysyłać przez rs232.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Chyba czegoś nie kumam. Po wysłaniu danych na RS-a i czyszczeniu wyświetlacza jesteś na pozycji (0,1) i masz indeks==1. Jak naciśniesz "D" to co zrobi ci program? Skoczy do poz.(0,1), wstawi na poz.(0,1) spację co przeniesie kursor na poz.(1,1) i dalej indeks==1
    Jak naciśniesz coś innego to kursor stanie (1,1) indeks=2, kolejny znak i kursor na pozycji (2,1) indeks=3 i zaraz potem ponieważ indeks%2==1 dopisujesz spację i kursor jest na poz.(3,1) a indeks==3 a powinien chyba być 4. Musisz się zdecydować czy indeks to pozycja_kursora czy pozycja_kursora+1. No i to goto OUT to chyba z BASIC'a wziąłeś bo w C wygląda jak...

    0
  • #10 20 Gru 2012 21:46
    SeerKaza
    Poziom 20  

    case 'D': LCD_GoTo(--index,1); LCD_WriteText(" "); index++; goto OUT;
    po spacji -- indeks a nie index++.

    Skoro musisz ze ci wyświetla ostatnio zapisaną liczbę to najprawdopodobniej niedziała ci skok goto. poza tym na wyświetlaczu kasujesz a co z buforem do przetrzymywania danych co mają być wysłane.

    0
  • #11 20 Gru 2012 21:51
    perlon
    Poziom 19  

    SeerKaza napisał:

    [...]
    poza tym na wyświetlaczu kasujesz a co z buforem do przetrzymywania danych co mają być wysłane.


    Dlatego jeszcze raz powtarzam, że lepiej operować na buforze i w całości go wyświetlać na LCD niż manipulować LCD'kiem.

    0
  • #13 20 Gru 2012 23:09
    wojtektorr
    Poziom 14  

    Przerwanie występuje ok 200 razy na sekunde. Podpowiadacie żeby zrobić to z buforem, czyli chodzi tworzenie na bierząco tablicy ze znakami które sa wyswietlane na wyswietlaczu, kasowania calosci wyswietlacza a pozniej wypisywania ich pomniejszonych o jeden znak?

    0
  • #15 21 Gru 2012 12:38
    wojtektorr
    Poziom 14  

    Zrobiłem jak podpowiadaliście dane do bufora, czyszczenie wyswietlacza oraz wyspisywanie zawartosci bufora[i-1]. W przerwaniu zostawiłem tylko funkcję pobierają klawisz a w mainie czytanie co to za klawisz i calego switcha. Dzieki, już wszystko łądnie działa tylko zastanawiam się czym zastąpić to goto?

    0
  • #16 21 Gru 2012 12:58
    SeerKaza
    Poziom 20  

    wojtektorr napisał:
    LCD_WriteData(keyPressed);
    index++;
    if (index%2) LCD_WriteText(" ");
    dane[i]=keyPressed;
    i++;
    if (i>10)
    {
    dane[i]='0';
    uart_putstr(dane);
    i=0;
    index=1;
    LCD_Clear();
    LCD_WriteText("Podaj dane:");
    LCD_GoTo(0,1);


    Z tego robisz funkcje i wywołujesz w wymaganym case

    Dodano po 1 [minuty]:

    Oczywiście aktualnie ta funckja ale wiesz oco mi chodzi to co jest od konca switcha do OUT wsadzasz w funckję i jak trzeba to wywołujesz

    0
  • #17 21 Gru 2012 14:00
    wojtektorr
    Poziom 14  

    To będe ją wywoływał po niemalżę każdym case z wyjątkiem kasowania('D') i wysyłania ('#') no i calkowitego kasowania wiersza ('*'). Skoro to ma być lepsze rozwiązanie to tak będzie:) Dzięki

    0