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



Teraz jest 13 gru 2024, o 16:06


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 30 lis 2017, o 09:30 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Witam i pozdrawiam wszystkich.

Ostatnio przerabiałem poradnik Pana Mirka odnośnie scrollowania tekstu w poziomie na wyświetlaczu lcd ze strony
http://mirekk36.blogspot.com/2013/07/lc ... owego.html

Zmodyfikowałem pliki do obsługi wyświetlacza zgodnie z opisem i wszystko działa doskonale. Pobawiłem się trochę tym zagadnieniem
i dodatkowo napisałem mały kodzik do przesuwania tekstu za pomocą jednego przycisku. Wykląda to tak:

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


Każde przyciśnięcie powoduje przesuwanie tekstu o jedną kolumnę w prawo do momentu całkowitego schowania i następnie
pojawienie się od lewej znak po znaku.

Chciałbym zrobić podobnie w pionie. Mam np. cztery linijki tekstu i wyświetlają się oczywiście dwie, a pozostałe dwie są ukryte.
Chciałbym przewijać tekst w pionie podobnie, jak robię to w poziomie. Proszę o pomoc, jak to można zrobić w praktyce.
Dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2017, o 11:57 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Witam kolegę Dambo.
Dzięki za odpowiedź. Napisałem taki kawałek kodu. Przesuwanie tekstu w pionie mi działa z jedną linią. Przycisk powoduje przechodzenie
tekstu po wierszach w pętli. W poprzedniej wersji wiersz się nie zmieniał. Inkrementowałem tylko kolumnę i było proste dla mnie.
W tym przypadku muszę wyświetlić jednocześnie wszystkie wiersze, po naciskaniu guzika muszę je przewijać jednocześnie i nie
mogę załapać, jak to ugryźć. Pewnie nie jest to skomplikowane, ale mam jakaś pomroczność ciemną :lol:


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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2017, o 12:18 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Dzięki Dambo.
Oczywiście mam metodę na osiągnięcie celu chociażby na switch and case. case 0 wyświetl linia 1,2,3,4, case 1 wyświetl linia 2,3,4,5,
case......itd i przyciskiem jadę do góry, a drugim jadę w dół, ale nie tak chcę to wykonać. Chciałbym uczyć się bardziej ambitnych
kodów, mniej pamięciożernych, a to jest chyba najbardziej łopatologiczna metoda.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2017, o 12:37 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Dzięki wielkie.
Przeanalizuję temat i jak coś się uda, to napiszę i zamieszczę. A może jeszcze ktoś ma jakiś pomysł ?.

Analizuję temat z BB, ale na tą chwilę stanąłem w miejscu z braku czasu. Wrócę do tematu lada moment.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2017, o 08:30 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Poczytałem w BB to, co kolega Dambo sugerował, ale szczerze się przyznaję bez bicia, że trochę trudne i napisałem "łopatologicznie"
kod, dzięki któremu osiągnąłem zamierzony cel. Oczywiście będę drążył temat, ale na ta chwilę zrobiłem,jak niżej.


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


Można zrobić przewijanie 2 razy po cztery linijki i są tylko dwa przyciśnięcia klawisza, ale chciałem, a żeby było przewijanie tekstu
jakby po linijce, dlatego tak napisałem. Proszę niech się osoby wypowiedzą, czy to totalna porażka w pisaniu chyba bardzo prostego
programu (można by pewnie o wiele krócej), czy jest do przyjęcia. Tablice przerobię do flasza. Kod zawiera fragmenty z innych
postów na tym forum, a obsługa przycisków z blogu Mirka.
Chciałbym jeszcze i tu prośba do kolegów zrobić tak,że jak na przykład linia char screen_3[] = " 3.Text nr 3 "; znajdzie się
na pozycji lcd_locate(2, x), czy dowolna inna linia na konkretnej pozycji lcd (0-3) to przyciskając jakiś kolejny przycisk wykona
się dowolna instrukcja (np. zapalenie diody led). Nie wiem, jak zacząć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2017, o 12:38 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Heja.
Dzięki dambo za pokazanie innej metody na wykonanie tego działania. O ile mniej na ekranie :) . Sprawdziłem oba przypadki i na przykład w Twoim zajęcie programu = 2284 bytes i
DATA 205 bytes, natomiast w moim przypadku zajęcie programu = 2478 (czyli więcej) i DATA = 189 bytes (czyli mniej). Zmieniłem również _ILOSC_POZYCJI z 5 na 8. Piszę to w celach poznawczych
i czysto dydaktycznych, ale pewnie któregoś dnia zastosuje w jakimś małym projekcie. Zastanawiam się nadal, jak rozwiązać sprawę wykonywania jakichś przydzielonych działań w zależności od tego,
gdzie w danym momencie znajduje się wybrana linia tekstu. Załóżmy, że ustalamy sobie czysto hipotetycznie wiersz, który jest jakby nadrzędny w stosunku do innych. Niech to będzie
powiedzmy drugi wiersz i dowolna kolumna (1, x). Teraz kiedy przewijam wiersze w dowolnym kierunku i zatrzymuję się na jakimś wybranym tekście (pozycja (1, x) oczywiście), to po po wciśnięciu
przycisku następuje np, zaświecenie diody led (działanie przypisane temu tekstowi). Po odjechaniu z tym tekstem w górę lub w dół informacja jest nadal pamiętana, czyli dioda świeci nadal, a ja
przewijam na pozycję (1, x) z kolejnym tekstem i ponownie coś tam uruchamiam przyciskiem. Jak by tu zacząć. Nie mogę ruszyć z miejsca. Może ktoś zaświeci światło w tunelu ? :lol: .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2017, o 13:54 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Witaj dambo.
Jak testowałem zaraz po wgraniu kodu, to przewijanie nie było właściwe. Jak wstawiłem liczbę 8 (tyle jest wierszy i wyświetlacz cztery linie), to jest ok. wyświetlanie polega w moim przypadku tak,
że przy starcie, na lcd są screen 1,2,3,4. Przyciśnięcie "scrolling_up" powoduje wyświetlenie screen 2,3,4,5, kolejne przyciśnięcie 3,4,5,6,.... , 4,5,6,7...., 5,6,7,8 i dalej nie idzie. Potem przycisk
"scrolling_down" i odwrotna sekwencja.

Kiedy podstawię "5", to jest dokładnie tak:

Po odpaleniu wyświetla linie 1,2,3,4. Pierwsze wciśnięcie jest: 2,3,4,5 drugie wciśnięcie jest: 3,4,5,1 trzecie wciśnięcie jest 4,5,1,2 czwatre wciśnięcie jest 5,1,2,3 i dalej nie idzie.
Przy "8" działa dobrze. :?:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2017, o 20:33 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Hej dambo.
Nie ma co pisać sorki. To ja dziękuję za chęć pomocy. przy okazji, to nie masz jakiejś wskazówki, jak się zabrać za temat dwa posty wcześniej ?
A może jeszcze ktoś ma jakiś pomysł ?. dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2017, o 07:38 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Witam wszystkich.
Chciałem pójść trochę dalej z programem i napisałem kod, który nie chce działać w 100% tak, jak bym tego oczekiwał. Mam dwa ekrany zmieniane przyciskami
góra i dół. W pierwszym ekranie wyświetlają się teksty 1-4, a w drugim 5-8. Dodatkowo mam cztery przyciski, które są jakby "przyporządkowane" czterem
linijkom. Chciałem, a żeby przyciśnięcie któregoś z przycisków zmieniało stany portu C (zapalają się diody) i tak też się dzieje. Jest tylko jeden problem, że kiedy
jestem w ekranie 1-4, to na przykład przycisk nr1 ustawia PORTC = 0b00000001;
Kiedy jestem w ekranie 5-8, to ten sam przycisk nr1 ma np. ustawić PORTC = 0b00000110;
Jest tu chyba konflikt i program się wykrzacza, tzn. nie zawsze ustawia port zgodnie z założeniem.
Sądziłem, że jeżeli jest case 0 i case 1, to będzie wszystko działać prawidłowo, a tu zonk. Proszę szanownych kolegów o jakieś wyjście z sytuacji, ponieważ
nie wiem, jak to dalej zadziałać.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2017, o 19:52 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Czy na prawdę nie ma nikogo, kto zechciałby pomóc i ewentualnie zasugerować, jak sobie z tym poradzić ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2017, o 20:43 
Offline
Użytkownik

Dołączył(a): 24 kwi 2013
Posty: 454
Pomógł: 30

Możesz w obsłudze klawisza wybierać switchem jaka funkcja ma być uruchomiona przez przycisk, w zależności od położenia menu.

Choć zwykle robi się to w oparciu o tablice struktur, w których są zmienne i wskaźniki na funkcje.
W GB masz sporo o wskaźnikach np. w rozdziale o UART.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2017, o 16:57 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Dzięki kol. ciamciak za odpowiedź na mój post.
Ale czy ja nie robię dokładnie tego, o czym piszesz ? Przy case 0 przyciskiem ustawiam jakiś tam stan portu, a przy case 1 tym samym przyciskiem ustawiam
inny stan tego samego portu. Wiem, że można z tablicami. Kol. dambo pokazywał, jak to się robi, ale w tym przykładzie akurat zastosowałem tą metodę.
Oczywiście ja sam sobie tak to wymyśliłem, co nie znaczy, że to ma działać, dlatego zapytałem forum. Myślałem, że jeśli instrukcje zmiany stanu portu
są jakby "odseparowane" w różnych case (case 0, case 1, case 2. itd.....), to program będzie działał, pomimo tego, że raz przycisk nr1 ustawia por np. 00000001,
a w innym przypadku ( kolejne case ... ) np. 00001110. Niestety jest tak, że dwa, trzy razy przełączy prawidłowo, a potem przycisk przestaje reagować.
Zachowuje się to przypadkowo i nieprzewidywalnie.

Przepraszam. Trochę szybko odpisałem bez przemyślenia. Chodzi Tobie o obsługę przycisku, a nie powiedzmy obsługę menu. Trochę mi się lampka zapala, ale
czy mógłbyś podać jakiś bardzo prosty przykład, który pomógłby mi lepiej zaskoczyć ?.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2017, o 12:51 
Offline
Użytkownik

Dołączył(a): 18 cze 2015
Posty: 368
Pomógł: 0

Aby dokończyć temat piszę, że udało mi się osiągnąć cel, jeśli chodzi o zmianę stanu bitów portu C. Otóż moje założenie okazało się
słuszne, tzn. jeżeli dany przycisk ma przypisane różne warianty zmiany stanu tych bitów, ale są one oddzielone poszczególnymi case,
a wiec np. jeśli w case 0 przycisk ustawia port:

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


a w case 1

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


i w kolejnych case, jeśli takowe istnieją ten sam przycisk wykonuje podobną prace, to wszystko działa prawidłowo. Zapisy typu
0b00000101 itp. nie chciały działać prawidłowo. Zresztą napisałem wszystko od nowa. Wesołych Świąt i do Siego Roku :) .



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: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


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