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

Jak wyświetlić liczby int/char na HD44780 z użyciem WinAVR i Atmega?

PluszowyMisiu 24 Sie 2006 21:30 3060 6
REKLAMA
  • #1 2949716
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    Witam.
    Na poczatek dodam ze przeszukalem forum i nie znalazlem konlretnej odpowiedzi jak to zrobic.
    Wlasnei robie taki sterownik ktory bedzie pobieral temperature z kilku czujnikow, rejestrowal ja z czasem wystapienia i wyswietlal aktualna temp na wyswietlaczu.
    Problem polega na tym ze nie weim jak wyswietlic liczbe tylu int lub char na wyswietlaczu. Wyswietlacz przyjmuje dane w postaci HEX ( kozystam z bibliotek avrlib ) ale ja chce obrabiac liczby na wyswietlaczu czyli, mam liczbe 3 i chce do niej dodac 1 i wyswietlic to na wyswietlaczu:
    char liczba = 3;
    liczba = 3 + 1; - 4

    LcdDanaWrite(liczba); - ale to nie dziala bo uznaje ta liczbe 4 jako hex czyli powinien wyswietlic dana z pozycji 4.

    A totalnie nie weim jak zrobic liczbe 2 cyfrowa czyli np:
    int liczba = 13;
    liczba = 13 -11;

    ??????????

    Kolejny problem to obsluga zegara ( wyswietlanie ), sa jakies gotowe biblioteki. Te liczby wlasnie beda sluzyly mi do zegara. Do ukladu bedzie podlaczony RTC PCF8583 ( z obsluga tego ukladu chyba nie bede mial problemu )

    Mzm nadzieje ze nie zamieszlaem.

    Pozdrawiam
  • REKLAMA
  • #2 2949883
    sedzia
    Poziom 15  
    Posty: 117
    Pomógł: 13
    Ocena: 41
    Witam,

    ja rozwiazalem ten problem bardzo prosto i u mnie dziala tzn:

    jesli chcesz poszczegolne liczby twojego zadania wyswietlic to dodaj do kazdej d'48' lub 0x30 tzn:

    3+48=51 i jesli tyle wyslesz na LCD zostanie ci wyswietlone 3
    1+48=49 i zostanie wyswietlone 1

    najlepiej jest wykonac dzialanie i dopiero wynik wyswietlic na LCD jesli nie potrzebujesz dzialania wyswietlic tzn:

    z twojego dzialania wynika

    1+3=4 czyli wynik 4+48=52 co da na LCD liczbe 4

    jesli idzie o liczby 2 cyfrowe to robisz to identyczne tzn.

    wykonujesz dzalanie

    13+11=24 czyli 2+48=50 i na LCD a nastepnie 4+48=52 i na LCD co da ci liczbe 24 na LCD

    co do PCF8583 to nie jestem taki pewny ze ci tak bedzie latwo tu musisz jeszcze oprogramowac komunikacje I2C z zegarem oraz przerwania
  • REKLAMA
  • #3 2949922
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    I2C Mam juz zrobiona do EPROM wiec nie mam z tym wiekszego problemu. Sek taki ze jeszcze zegaru nie podpiolem i nie wiem czego po nim oczekiwac :? Zegar ma dodatkowe wyjscie i zaprogramuje je tak zeby co pol godziny pojawial sie impuls alarmowy, wtedy atmeg odczyta przerwanie, zczyta parametry czujnikow, przestawi alarm o pol godziny i pojdzie spac, cala operacja bedzie tak trwala dopuki eprom mi sie nie skonczy :)
    Mam nadzieje ze jutro to odpale.

    Z tymi liczbami to troche taka babranina :(
    Jesli nie bedzie innego sposobu bede musial tak robic.
    Nie ma czegos w portaci konwentera np str2int int2hex?? itp.
  • REKLAMA
  • #4 2949938
    johny_w
    Poziom 24  
    Posty: 674
    Pomógł: 80
    Ocena: 64
    Generalnie do tego służy funkcja "sprintf". Jednak ona ponoć zajmuje 2kb pamięci uC, więc nigdy jej nie używałem. Szczególnie biorąc pod uwagę to, że jest to funkcja uniwersalna.

    Ja osobiście robię coś takiego (dla liczb 2-cyfrowych, dla większych musisz rozszerzyć funkcję):

    Jeśli liczba jest mniejsza od 10 wyświetlam "0" i daną liczbę.
    Jeśli natomiast liczba jest większa lub równa 10 wyświetlam "liczba/10" (to jest I-sza cyfra) + "liczba-(liczba/10)" (druga cyfra".

    Moim zdaniem jest to na pewno szybsze od "sprintf". Pozdrawiam.
  • REKLAMA
  • #5 2950072
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    Jezeli tak to sie przedstawia to raczej wybiore zabawe w hex. Jutro do poludnia powinienem cos zrobic w tym kierunku wiec jesli nie bedzie chodzic to napewno jeszcze napisze a jesli bedzie chodzic to podziele sie jak to zrobilem
  • #6 2950439
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Skorzystaj z funkcji itoa(int,char *str,10) w stdlib.h

    Piotrek
  • #7 2951406
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Jak Zumek napisal wyżej musisz przerobic liczbe na stringa ( za pomocą funkcji itoa ) i dopiero ja wyswietlic na wyswietlaczu, jakas komenda w stylu LCD_write_text, ktora zapisuje cale lancuchy znakow na LCD.
    A jesli chcesz wyswieltac takze liczby ulamkowe albo moc okreslac ilosc miejsc po przecinku to polecam funkcje dtostrf !! Jest bardzo fajna i zajmuje znaaacznie mniej miejsca niz pamieciozerna sprintf.

    Pozdrawiam

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy wyświetlania liczb typu int i char na wyświetlaczu LCD HD44780 przy użyciu mikrokontrolera Atmega i środowiska WinAVR. Problem polega na tym, że wyświetlacz przyjmuje dane w formacie HEX, a użytkownik chce wyświetlać wartości liczbowe, np. wynik działań arytmetycznych. Rozwiązaniem jest konwersja liczb na znaki ASCII poprzez dodanie wartości 0x30 (48) do cyfry, co pozwala na poprawne wyświetlenie pojedynczych cyfr. Dla liczb dwucyfrowych należy rozdzielić je na cyfry dziesiątek i jedności, konwertując każdą osobno na znak ASCII i wyświetlając kolejno. Alternatywnie można użyć funkcji itoa() z biblioteki stdlib.h do konwersji liczby na łańcuch znaków, który następnie wyświetla się na LCD. Funkcja sprintf() również umożliwia formatowanie liczb, ale jest pamięciożerna (ok. 2KB), dlatego zaleca się prostsze metody. Do wyświetlania liczb zmiennoprzecinkowych lub z określoną liczbą miejsc po przecinku polecana jest funkcja dtostrf(), która jest bardziej oszczędna pamięciowo. W kontekście obsługi zegara RTC PCF8583 konieczne jest zaimplementowanie komunikacji I2C oraz obsługi przerwań, co autor już częściowo zrealizował.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA