Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2026, o 11:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 15 mar 2013, o 01:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Witam, podczas realizacji mojej pracy mgr przyszło mi zaimplementować klawiaturę ekranową (numeryczną) do wprowadzania liczb (całkowite i rzeczywiste, np. -4.12, 5, 23.14) na LCD TFT ze sklepu Atnela.

Z całkowitymi (wraz z ujemnymi) sobie łatwo poradziłem, ale mam problem z "przecinkowymi". Mam kilka pomysłów jak do tego podejść, ale nie wiem, czy nie idę nieco dookoła zagadnienia.

Pytanie jest następujące: czy ktoś z szanowych forumowiczów zetknął się z zadaniem stworzenia takiej klawiatury ekranowej i mógłby zdradzić, jak podszedł do parsowania danych z niej? Może przedstawię, jak się u mnie prezentuje taka klawiaturka:

zdjęcie pod linkiem: https://dl.dropbox.com/u/6082561/2013-0 ... .27.53.jpg

Kod odpowiedzialny za nią (póki co z tymi rzeczywistymi walczyłem, ale bez powodzenia więc część kodu bez sensu):

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Problem jest właśnie z liczbami typu 31.52 (gdzie występuje część całkowita i ułamkowa), problemy są różnorakie:
1) jak to reprezentować w programie? myślałem o tym, aby klawiatura zwracała wynik będący strukturą zbudowaną z trzech składowych. Te składowe to byłaby flaga mówiąca o tym, czy wynik jest liczbą całkowitą, czy rzeczywistą, druga składowa to część całkowita (int), trzecia to część ułamkowa (również int). Czy jest to dobre podejście?

2) sparsowanie tego z "dotyku" to ciężka sprawa, narysowałem do tego "automat", link: https://dl.dropbox.com/u/6082561/2013-0 ... .46.51.jpg , ale czy nie idę nieco dookoła? jest prostszy sposób?

3) następny problem: zamiana tych dwóch intów na jednego, wynikowego floata. Niby już doszedłem do tego, jak, ale znowu - dodatkowe komplikacje. Pomysł jest taki:
mamy liczbę 2.34, to oznacza inta 2 i inta 34. Floata składamy tak: 2 + 34*0.01 = 2+0.34 = 2.34. To, jaki jest mnożnik (tutaj: 0.01) zależy od tego, ile cyfr jest w drugim incie. Tutaj mamy dwie cyfry (34, czyli 3 i 4), więc mamy mnożnik z jednym zerem po przecinku (o jedno zero mniej niż cyfr w drugim incie). Dobry sposób? Czy zbyt zamotany?

Proszę o pomoc. :)
Pozdrawiam, Michał

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 mar 2013, o 07:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 maja 2012
Posty: 471
Lokalizacja: ZGY/ZS
Pomógł: 30

A nie mógłbyś wprowadzać tych liczb jako tekst, a następnie potraktować tego funkcją - long atol( char *p ) ?

Ehh, sorki, za wczesna godzina dla mnie:) Chciałeś floata a nie całkowitą ;] wycofuje się z podpowiedzi

---------
znalazłem jeszcze coś takiego
Kod:
double strtod(const char *s, char **endptr)
Zamienia łańcuch ASCII na liczbę typu double.


Nie znam tego, nie testowałem i nie wiem jak z pożeraniem zasobów.

--------
No dobra, powyżej trochę pomarudziłem może mniej sensownie :)

Odszukałem taką informację, że należy dodać bibliotekę libm.m i wtedy dostępna będzie funkcja atof(char *n). Nie siedzę teraz przy swoim kompie więc namacalnie nie jestem w stanie tego sprawdzić.

Dobra idę po kawę ;) bo nie ujadę

_________________
eDiyCraft.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 mar 2013, o 10:02 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

savian86 - życzę smacznej kawy, ja też zaraz po nią sięgnę ;) ..... napij się ... i ew pisz dalej - bo w dobrym kierunku idziesz z podpowiedzią ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 mar 2013, o 23:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Hmmm nie pomyślałem o takim podejściu - jutro spróbuję, dzięki. Faktycznie to może być "właściwa" droga. Proszę o dalsze wskazówki. Jutro się przydadzą. ;)

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2013, o 21:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Nie radzę sobie z tym podejściem - tzn samo atof() to na końcu, ale jak uzyskać tego stringa? Jak dopisywać do niego poszczególne literki? Jakiej funkcji użyć? Próbowałem strcat(), ale coś nie wychodzi...

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2013, o 22:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Chyba wrócę do swojej metody, te stringi w AVR-GCC to jakaś masakra, nie to co w C++.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2013, o 09:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 maja 2012
Posty: 471
Lokalizacja: ZGY/ZS
Pomógł: 30

Pamiętaj że jak używasz funkcji z biblioteki string.h to łańcuchy na których operujesz muszą kończyć się '\0', nawet jak łańcuch jest dla ciebie pusty, to musi on mieć na pozycji zerowej właśnie '\0'.

Tutaj masz jeden z przykładów jak dodawać kolejne znaki do łańcucha. Może trzeba to lekko zmodyfikować, bo piszę tak na sucho, chodzi mi o pokazanie idei:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To co "wypluwa" ci ekran (czyli dla ciebie cyfry) musisz traktować jako znak i operować na znakach

_________________
eDiyCraft.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2013, o 20:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Dzięki za rady, jednak te stringi mnie pokonały... Do tego celu moim zdaniem nie nadają się - lepiej pracować na liczbach i strukturce o której pisałem.
Zrobiłem po swojemu i działa pięknie - w tym cofanie (backspace), +/-, liczby całkowite i rzeczywiste.
Czyli pełna klawiaturka numeryczna. :)
Jak chcecie zapodam kod. ;)

------------------------ [ Dodano po: 13 minutach ]

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I na deser - funkcja wyświetlająca double na TFT:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO