Skocz do zawartości

Dodatkowe ćwiczenia z wyświetlaczem 2x16 znaków


Pomocna odpowiedź

Gość

O to chodzi, że w jednym segmencie mogę wyświetlić albo znak, albo kropkę. W stoperze np. za cyfrą minut muszę mieć kropkę na stałe, albo migającą dla bajeru, tylko nie wiem jak to zrobić. kiedy próbuję, to albo znak nadpisuje kropkę, albo kropka znak. Nie wiem jak jednocześnie wyświetlić to na raz.    

Ale w LCD czy 7SEG? W LCD jest trochę za mało miejsca, ale jest to możliwe (dynamiczne tworzenie znaków). W 7seg najstarszy bit to kropka (albo dwukropek, zależy od typu).

Gość

W LCD temat mam już opanowany po za ładowaniem całej zawartości przy jednym odświeżeniu. Mowa o 7seg. Rozchodzi się o to, czy ta biblioteka z powyższego kodu to obsługuje? Regulacji jasności segmentów też nie widzę, a wyczytałem że na TM1638 jest taka możliwość. 

Powiem tak: nie siedzę teraz przy kompie i kodu nie pokażę ale parę razy tego używałem (np. w zegarkach, jeden taki śliczny mam w łazience). Mam migający dwukropek - kwestia odświeżania (w moim przypadku) co pół sekundy. Co prawda na esp8266, ale kumplowi robiłem to na Arduino Pro Mini.

Gość
3 minuty temu, ethanak napisał:

Powiem tak: nie siedzę teraz przy kompie

ok. To tam wolnym czasem podeślij kawałek który odpowiada obsłudze kropki, albo link do biblioteki dającej niezależną możliwość wyświetlania cyfry oraz kropki w tym samym segmencie. Ja na razie poćwiczę sobie bez tych kropek. 

5 minut temu, ethanak napisał:

ale parę razy tego używałem (np. w zegarkach, jeden taki śliczny mam w łazience)

tutaj to jest inna sprawa, bo z tego co mi wiadomo ten dwukropek po środku w wyświetlaczach od zegarków jest traktowany jako oddzielny segment. Ale nie chcę  wnikać, ponieważ dla mikrokontrolera jest to bez znaczenia. Ostatecznie i tak wszystko zależy od kodu.  

Gość
3 minuty temu, ethanak napisał:

To nie jest niezależne - kropka to ósmy segment znaku.

W standardowym segmencie. Natomiast w typowym wyświetlaczu od zegarka pomiędzy minutami a godzinami masz jeszcze jeden segment składający się z 2 LED. Jest to oddzielny segment zlokalizowany po środku. 

No ale u mnie tego nie ma jest standardowo 2 x 4 seg.  Muszę tylko opanować kropkę jako oddzielny znak. Może jakaś biblioteka to w prosty sposób umożliwia. 

No więc kropka nie jest oddzielnym znakiem tylko (jak pisałem) ósmym segmentem wyświetlacza.

Znalazłem coś takiego w swoich projektach (akurat na Arduino czyli powinno pasować): 

 

Zwróć uwagę na funkcję drawText i co się dzieje jeśli dostanie dwukropek (to jeden z typów wyświetlaczy). Tam też dwukropek nie jest oddzielnym znakiem, tylko ósmym segmentem znaku numer 1.

 

Gość
4 godziny temu, ethanak napisał:

Tam też dwukropek nie jest oddzielnym znakiem, tylko ósmym segmentem znaku numer 1.

Tak, tylko miałem na myśli te wyświetlacze w których po liczbie masz kropkę, a te kropki które są po środku są oddzielne. Kiedyś jak nie było wyświetlaczy deklarowanych, to się dawało zwykłe segmenty jednocyfrowe, albo dwucyfrowe, a po środku dwie zwykłe diody LED wstawione na PCB. Z czasem te LEDy zintegrowano w jednym segmencie. Tak więc oprócz znaku dp, miałeś po środku taki bajer który kiedyś robiło się z dwóch LED. Dawno nie kupowałem tych wyświetlaczy, ale zapewne masz rację. W tych chińskich do dp drugiej cyfry może być przypięty cały dwukropek albo dp ostatniej cyfry jako druga kropka. Kiedyś to było oddzielnie. Mam teraz kilka rzeczy do zrobienia i muszę sobie zrobić przerwę od Arduino. Jak skończę to wstawię stoper na tym wyświetlaczu 8 x 7seg. Wszystko działa fajnie, tylko za chorobę nie wiem jak zrobić te kropki. Bez grzebania w bibliotece, to chyba nie da rady. Generalnie mógłbym zrobić tak, że co pętlę raz bym odświeżał kropki, a raz cyfry, tylko to jest takie trochę bez sensu kiedy TM1638 posiada pamięć podręczną. Działa podobnie jak sterownik hd44780. Sam multipleksuje wyświetlacz z wewnętrznego bufora pamięci.

@rafal220

 Rozumiem że używasz biblioteki na zasadzie "wyświetl znak" a nie "wyświetl kombinację segmentów". Nie mam takiego wyświetlacza i nie planuję, ale co się stanie jeśli każesz mu wyświetlić segmenty 0xff na pierwszej pozycji (albo lepiej  na wszystkich pozycjach)?

 

Gość
6 godzin temu, ethanak napisał:

Rozumiem że używasz biblioteki na zasadzie "wyświetl znak" a nie "wyświetl kombinację segmentów".

No właśnie w tej bibliotece raczej nie ma możliwości wyświetlenia hex, albo binarnej 0,1.

 

6 godzin temu, ethanak napisał:

co się stanie jeśli każesz mu wyświetlić segmenty 0xff na pierwszej pozycji (albo lepiej  na wszystkich pozycjach)?

Wtedy nic się nie wyświetla. 

 

6 godzin temu, ethanak napisał:

Nie mam takiego wyświetlacza i nie planuję

czemu? bardzo fajne wyświetlacze z przyciskami i LEDami o dowolnej deklaracji pingów cyfrowych pod STB, CLK i DIO. Sprawdzałem i działa mi to pod różnymi wyjściami. Ponadto możesz zrobić jeszcze takie rozszerzenie; 

 1376450020_modu7seg_2.thumb.jpg.7c544f918892cae245a1282306cccff7.jpg

Są też wersje z większą ilością przycisków ponieważ TM1638 obsługuje 3 równoległe linie. W moim module jest wykorzystana tylko jedna. 

Na razie udało mi się uzyskać tyle; (zdjęcia trochę rozmyte ponieważ wyciąłem je z filmu. Mój aparat nie ogarnia przemiatania segmentów)

1.thumb.png.12d163644a008ea0ecac97d5054ecd17.png2.thumb.png.ff2297705a47f3fa97c95bb5eed8f134.png3.thumb.png.76384feb9b1f7b59d671879bfbdbb574.png

Wszystko działa, ale kropek nie mam w odpowiednich miejscach. 

tutaj kod;

#include <TM1638lite.h> // https://github.com/danja/TM1638lite

TM1638lite tm(6, 7, 8);

uint8_t sw1 = 0; // start
uint8_t sw2 = 0; // stop
uint8_t sw3 = 0; //reset

unsigned long TT = 0; unsigned long t0 = 0; unsigned long t1 = 0;

unsigned long a0 = 0; unsigned long a1 = 0; unsigned long a2 = 0;
unsigned long a3 = 0; unsigned long a4 = 0; unsigned long a5 = 0;
unsigned long a6 = 0; unsigned long a7 = 0; unsigned long a8 = 0;

void setup() {
tm.reset();

tm.displayText(" rAFAL");

  
delay(5000);
tm.reset();

tm.displayText("ForboTPL");
delay(5000);
tm.reset();

}

void loop() {

uint8_t SW = tm.readButtons(); // SW1 - SW8

TT = millis();

if (SW == 1 || sw1 == 1) {t1 = TT - t0; sw1 = 1; sw2 = 0;}  // Stoper start 
else {t0 = TT - t1;}                                         

if (SW == 2 || sw2 == 1) {sw1 = 0; sw2 = 1;} // Stoper stop

if (SW == 4) {sw1 = 0; sw2 = 0; t1 = 0;}    // stoper reset   


a1 = (t1 / 10) % 10;
a2 = (t1 / 100) % 10;   // setne

a3 = (t1 / 1000) % 10;            
a4 = (t1 / 10000) % 6;  // sekundy 

a5 = (t1 / 60000) % 10;
a6 = (t1 / 600000) % 6;   // minuty

a7 = (t1 / 3600000) % 10;
a8 = (t1 / 36000000) % 10;  // godziny


tm.displayHex(7, a1);
tm.displayHex(6, a2);
tm.displayHex(5, a3);
tm.displayHex(4, a4);
tm.displayHex(3, a5);
tm.displayHex(2, a6);
tm.displayHex(1, a7);
tm.displayHex(0, a8);
}

Sorry, że na razie się uparłem przy tym dzieleniu zmiennej t1 przez liczbę, a nie zmienną przez zmienną. W przykładzie który podałeś wcześniej licznik stopera się zeruje po zatrzymaniu zegara. Trochę nad tym myślałem czemu tak się dzieje i doszedłem do wniosku, że w momencie zatrzymania stopera zmienna t1 nie otrzymuje wartości ze zmiennej TT w pętli if, co w efekcie powoduje że zmienne w pętli głównej w czasie jej przejścia są dzielone aż osiągną 0. Ale jeszcze Twój sposób sprawdzę przenosząc działania a1-a8 do pętli if tak aby nie dochodziło do dzielenia kiedy ta pętla ma niespełniony warunek.

 

41 minut temu, rafal220 napisał:

No właśnie w tej bibliotece raczej nie ma możliwości wyświetlenia hex

Hm...

    void displaySS(uint8_t position, uint8_t value);

Ciekawe do czego to służy...

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...