TM1637 jest rodzajem interfejsu skanowania obwodu klawiatury, ze zintegrowanym, specjalizowanym sterownikiem wyświetlacza, zbudowanego na diodach LED.
Układ scalony złożony jest z kilku zintegrowanych interfejsów cyfrowych: MCU, zatrzasków, sterownika napięcia dla LED, obwodu skanującego klawiaturę. Producent pisze:
Ten produkt jest doskonałej i niezawodnej jakości. Dedykowany do kuchenek elektrycznych i mikrofalowych, oraz jako mały kontroler wyświetlacza (Display Driver).
Cechy
⇒ Opracowany w oparciu o proces CMOS
⇒ Tryb wyświetlania – 6 wyświetlaczy 8 segmentowych, ze wspólną anodą
⇒ Klawiatura skanowanie dwóch ośmiobitowych linii, zwiększona odporność na zakłócanie, układ rozpoznawania klawiszy
⇒ Układ regulacji jasności – cykl 8 stopniowy
⇒ Interfejs szeregowy dwuprzewodowy (CLK, DIO)
⇒ Wbudowany oscylator RC (450KHz + 5%)
⇒ Wbudowany układ power-on reset
⇒ Wbudowany automatyczny układ wygaszania
⇒ Obudowa: DIP20 / SOP20
Opis funkcjonalny wyprowadzeń
DIO Serial data input/output, pin 17, szeregowe wejście/wyjście danych, dane wejściowe zapisywane są na wysokim poziomie SCLK, każdy odebrany bajt podczas transmisji, generuje sygnał ACK przy dziewiątym takcie zegarowym.
CLK Clock input, pin 18, dane są przepisywane na narastającym zboczu sygnału zegarowego
K1 ~ K2 Key-scan data input, pin 19-20, dane wprowadzane na piny będą odczytywane (zatrzaskiwane) na koniec okresu wyświetlacza
SG1 ~ SG8 output (segment), pin 2-9, wyjście segmentów (również używane do skanowania klawiatury) typu N, wyjście otwarty dren
GRID6 ~ GRID1 Output(grid), pin 10-15, wyjście do sterowania anody wyświetlacza, typu P, wyjście otwarty dren
VDD Logic power, pin 16, 5V ± 10%
GND Logic ground, pin 1, podłączony systematycznie
Odczyt danych skanowania klawiatury.
Matryce klawiatury 8 × 2bit, przedstawia poniższy schemat:
Po naciśnięciu przycisku, klawisze są odczytywane w sposób następujący:
Uwaga: nie wciśnięty żaden przycisk wywoła odczyt klucza danych: 1111_1111.
W odróżnieniu od innych układów tej rodziny TM1637 posiada mechanizm sterowany zboczem ujemnym, ze względu na możliwą pracę przy silnych zakłóceniach.
Wyświetlacz i tryb wyświetlania, rejestr adresów.
Dane przesłane z zewnętrznego urządzenia za pośrednictwem interfejsu szeregowego przechowywane są w rejestrze. Rejestr wyświetlaczy TM1637 posiada adresy w zakresie 00H-05H, i pomieści 6 bajtów, które odpowiedzialne są za wyświetlanie zawartości segmentów (wyprowadzenia SEG) poszczególnych wyświetlaczy. Zapis powinien odbywać się zgodnie z adresem wyświetlania od niskiego do wysokiego.
Opis interfejsu.
Przesyłanie danych interfejsem dwuprzewodowym z µC powinno nastąpić gdy na linii zegarowej (pin CLK) występuje stan niski. Podczas gdy linia CLK ustawiona jest w stan wysoki na pinie DIO nie może nastąpić zmiana stanu logicznego. Jeśli transmisja danych przebiegła poprawnie układ generuje sygnał ACK (po zboczu opadającym 8 taktu zegara) na pinie DIO (stan niski) dla potwierdzenia transmisji. Wysłanie sygnału na lini DIO nastąpi to po zakończeniu dziewiątego taktu zegara.
Instrukcja procesu transmisji danych (the key data read timing).
Po wygenerowaniu sygnału ACK (Low) układ automatycznie przechodzi w stan down.
Command: read button commands; S0, S1, S2, K1, K2 constituting the key information encoding, S0, S1, S2 coding for the SG, K1, K2 to K1 and K2 key codes, first reading low, after reading high.
Tryb zapisu danych do SRAM z automatyczną inkrementacją adresu (mode 1).
Command1: Set data
Command2: Set Address
Data1 ~ N: Transfer Display Data
Command3: Control Display
Tryb zapisu danych do SRAM dla określonego adresu wyświetlacza (fixed address mode).
Command1: Set data
Command2: Set Address
Data1 ~ N: Transfer Display Data
Command3: Control Display
Instrukcje, i ich rodzaje
Odebrana instrukcja służy do ustawienia trybu wyświetlacza, i statusu sterownika LED. Instrukcja ta musi być przesłana jako pierwszy bajt na pinie DIO, po zboczu opadającym na linii CLK. Po zdekodowaniu najstarszych bitów B7 i B6 otrzymamy rozkazy dla kontrolera. Także jak widać w tabeli w zależności od ich zawartości dalsze dane będą różnie interpretowane. Jeśli polecenie STOP zostanie wysłane w trakcie przesyłania instrukcji lub podczas przekazywania danych, komunikacja szeregowa zostanie ponownie zainicjowana. Skutkuje to nieprawidłową instrukcją, lub błędnie przesyłanymi danymi (instrukcja lub bajt danych, odebrane przed transmisją STOP, pozostają aktywne).
Powyżej data instruction set, między innymi służy do określenia czy dane mają być zapisywane czy odczytywane. Dozwolone wartości B1 i B0 to 01 lub 11. Poniżej address instruction setting. Polecenie to służy do ustawienia adresu rejestru wyświetlacza. Jeśli adres jest ustawiany na 0C6H lub wyższej, dane są ignorowane, dopóki podany adres jest aktywny. Po włączeniu zasilania, adres domyślnie ustawiony jest na 00H.
Instrukcje typu display control – do regulacji intensywności świecenia oraz wyłączenia całego wyświetlacza. Bez tego rozkazu niemożliwe jest wyświetlanie jakichkolwiek danych na polach odczytowych. Zakres regulacji przedstawia tabela niżej.
Porównanie układów
Rodzina tych układów jest bardzo ciekawą propozycją prezentacji danych na wielosegmentowych wyświetlaczach LED i zadawania nastaw wieloma przyciskami jednocześnie. Te nie małe możliwości dostępne są dla µC z wykorzystaniem jedynie dwóch lub trzech linii sygnałowych, co jest znakomitym wynikiem i nie lada gratką 🙂 przy konstruowaniu swojego urządzenia. A wszystko zawdzięczamy firmie Titan Micro Electronics. Szczegółowe informacje o tej rodzinie kontrolerów i innych produktach można przeglądać na witrynie producenta. Czasem są problemy z jej dostępnością. 😯
Małe porównanie:
oznaczenie układu | tryb wyświetlacza | matryca klawiatury | regulacja jasności | interfejs szeregowy | wbudowany układ power-on reset | obudowa układu | proces technologiczny | wbudowany oscylator RC | |
---|---|---|---|---|---|---|---|---|---|
TM1630 | 7 seg x 5 lub 8seg x 4 | 7 x 1 bit | 8 stopniowa | CLK STB DIO | tak | DIP18 | CMOS | 450KHz + 5% | 5V±10% |
TM1635 | 7 seg x 4 | 7 x 1 bit | 8 stopniowa | CLK DIO | tak | DIP16 SOP16 | CMOS | 450KHz + 5% | 5V±10% |
TM1636 | 8 seg x 4 | 2 x 8 bit | 8 stopniowa | CLK DIO | tak | DIP18 | CMOS | 450KHz + 5% | 5V±10% |
TM1637 | 8 seg x 6 | 2 x 8 bit | 8 stopniowa | CLK DIO | tak | DIP20 SOP20 | CMOS | 450KHz + 5% | 5V±10% |
TM1638 | 10 seg x 8 | 8 x 3 bit | 8 stopniowa | CLK STB DIO | tak | SOP28 | CMOS | 450KHz + 5% | 5V±10% |
TM1639 | 8 seg x 8 | 4 x 2 bit | 8 stopniowa | CLK STB DIO | tak | DIP24 | CMOS | 450KHz + 5% | 5V±10% |
TM1616 | 7 seg x 4 | - | 8 stopniowa | CLK STB DIN | tak | SOP16 DIP16 | CMOS | 450KHz + 5% | 5V±10% |
TM1618 | 5 seg x 7 lub 8 seg x4 | 5 x 1 bit | 8 stopniowa | CLK STB DIO | tak | DIP18 SOP18 | CMOS | 450KHz + 5% | 3V ~ 5V |
TM1620 | 8 seg x 6 | - | 8 stopniowa | CLK STB DIN | tak | SOP20 | CMOS | 450KHz + 5% | 5V±10% |
TM1620B | 6 seg x 7 lub 9 seg x 4 | 6 x 1 bit | 8 stopniowa | CLK STB DIO | tak | SOP20 | CMOS | 450KHz + 5% | 5V±10% |
TM1623 | 10 seg x 7 lub 14 seg x 4 | 10 x 3 bit | 8 stopniowa | CLK STB DIN DOUT | tak | SOP32 | CMOS | tak | 3 ~ 6V |
TM1624 | 11 seg x 7 lub 14 seg x 4 | - | 8 stopniowa | CLK STB DIN DOUT | tak | SOP24 | CMOS | 450KHz + 5% | 5V±10% |
TM1626A | 11 seg x 7 lub 14 seg x 4 | 10 x 1 bit | 8 stopniowa | CLK STB DIO | tak | SOP32 | CMOS | 450KHz + 5% | 5V±10% |
TM1626B | 11 seg x 7 lub 14 seg x 4 | 10 x 3 bit | 8 stopniowa | CLK STB DIO | tak | QFP44 | CMOS | 450KHz + 5% | 5V±10% |
TM1627 | 10 seg x 7 lub 13 seg x 4 | 10 x 2 bit | 8 stopniowa | CLK STB DIO (KEYINT) | tak | SOP28 | CMOS | 450KHz + 5% | 5V±10% |
TM1640 | 8 seg x 16 | - | 8 stopniowa | SCLK DIN | tak | SOP28 | CMOS | tak | 5V±10% |
TM1641 | 11 seg x 7 lub 14 seg x 4 | 10 x 3 bit | 8 stopniowa | CLK STB DIO | tak | SOP32 | CMOS | 450KHz + 5% | 5V±10% |
TM1650 | 8 seg x4 lub 7 x 4 | 7 x 4 bit | 8 stopniowa | CLK DIO | tak | DIP16 SOP16 | CMOS | tak | 2.8V-5.5V |
TM1667 | 10 seg x 7 lub 13 seg x 4 | 10 x 2 bit | 8 stopniowa | CLK STB DIO | tak | SOP28 | CMOS | 450KHz + 5% | 3 - 5V |
TM1629 | 16 seg x 8 | 8 x 4 bit | 8 stopniowa | CLK STB DIN DOUT | tak | QFP44 | CMOS | tak | 5V±10% |
Poszczególne typy kontrolerów mają analogiczną funkcjonalność, z różną ilością sterowanych wyświetlaczy i liczbą segmentów, oraz odmienną ilością obsługiwanych przycisków. Zasadnicza różnica między nimi polega na odmiennym sterowaniu, wybrane obsługiwane są magistralą dwu, 3 i więcej przewodową. Nieliczne mają rozszerzoną funkcjonalność o np. szybki PWM i wyjście przerwania klawiatury, oraz większy zakres zasilania.
Przykład ciekawego zastosowania jednego z układów. Grafika pochodzi z witryny sklepu internetowego.
Teraz przedstawię jak sobie poradzić z wybranym modelem kontrolera (TM1637), który zastosowano w module z wyświetlaczem SM410364EF (czerwony intensywny) w środowisku Bascom AVR. W jednej z notek zamieszczono kod w języku C więc był znacznym ułatwieniem, dla oprogramowania transmisji. Niestety wszystkie noty katalogowe są w rodzimym języku producenta – dodatkowo występuje tam pismo „obrazkowe”, co jest bardzo uciążliwe i czasochłonne w rozgryzaniu. Dlatego też, zdecydowałem się na tak obszerną formę opisu tego układu scalonego.
Mój moduł podczas pracy wygląda następująco:
Aplikacja zawiera wszystkie niezbędne elementy w postaci kondensatorów i oporników wyszczególnionych w notce katalogowej. Więc układ pracuje bezproblemowo. Moją uwagę zwrócił przydźwięk przy załączonych (pracujących) wyświetlaczach, który ujawnił się w module wzmacniacza małej mocy – był on wetknięty w tą samą płytkę stykową podczas rozgryzania modułu wyświetlacza. W zależności od jasności świecenia przydźwięk słyszany w głośniczkach zmieniał modulację …
Ale do rzeczy 😉 kod podzieliłem na dwa pliki by lepiej mi się do niego zaglądało podczas testów. Nie jest on jakoś szczególnie zoptymalizowany, raczej stanowi działający brudnopis, i na chwilę obecną nie testowałem jeszcze obsługi przycisków. Dodatkowo na myśli mam jeszcze jeden szwindel … pewno go zdradzę … kiedyś ;-p jak przetestuję. Bo kład nie jest zgodny w komunikacji z magistralą TWI, ale …. 😆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 |
'badanie modułu wyświetlacz 4-Digit Display CATALEX - 7seg - 2015-05-31 'by kaktus 'http://kaktusa.pl 'Copyright CC-BY-NC $regfile = "m328pdef.dat" $crystal = 16000000 $hwstack = 124 $swstack = 96 $framesize = 124 Config Submode = New $include "TM1637_core.inc" Dim J As Byte , K As Byte , L As Byte , M As Byte '---[ test ]-------------------------------------------------------------- Set Ddrc.2 Test Alias Portc.2 '$baud = 9600 'Config Serialin = Buffered , Size = 8 'Echo Off '---[ test END ]-------------------------------------------------------------- 'Print "rozruch " Do Call Tm1637(27 , 27 , 27 , 27 , 4 , 0) Call Tm1637_poz(&B00111111 , 0 ) 'test pozycji Waitms 500 Call Tm1637_poz(&B00000110 , 1) Waitms 500 Call Tm1637_poz(&B01011011 , 2) Waitms 500 Call Tm1637_poz(&B01001111 , 3) Waitms 500 Call Tm1637(27 , 27 , 27 , 27 , 0 , 0) Wait 1 J = 1 : K = &B01000000 : L = 0 : M = &B01111111 For I = 0 To 7 'test segmentow L.i = 1 'najpierw prawie wszytko robie na "piechote" 'Write display register ' bajt = &H40 '40H address is automatically incremented by 1 mode, 44H fixed address mode, the program uses a self-imposed 1 mode Gosub Tm1637_start Call Tm1637_wrbyte(&H40) '&B01000000 data instruction set -> write data to register (data write mode set) Gosub Tm1637_ack Gosub Tm1637_stop ' bajt = &HC0 'Is Set The First Address Gosub Tm1637_start Call Tm1637_wrbyte(&Hc0) '&B11000000 addres instruction setting, MSB display Gosub Tm1637_ack Call Tm1637_wrbyte(j) 'pusto Gosub Tm1637_ack Call Tm1637_wrbyte(k) ' Gosub Tm1637_ack Call Tm1637_wrbyte(l) ' Gosub Tm1637_ack Call Tm1637_wrbyte(m) ' Gosub Tm1637_ack Gosub Tm1637_stop Shift J , Left , 1 Shift K , Right , 1 Shift M , Right , 1 Call Tm1637_brightness(8) Waitms 200 Next I Waitms 200 Call Tm1637_brightness(0) Waitms 500 'uzycie zbudowanych funkcji For I = 0 To 3 Call Tm1637(27 , 27 , 27 , 8 , 8 , 0) 'biegaj¹ce 8 Waitms 120 Call Tm1637(27 , 27 , 8 , 27 , 8 , 0) Waitms 80 Call Tm1637(27 , 8 , 27 , 27 , 8 , 0) Waitms 40 Call Tm1637(8 , 27 , 27 , 27 , 8 , 0) Waitms 20 Call Tm1637(27 , 8 , 27 , 27 , 8 , 0) Waitms 40 Call Tm1637(27 , 27 , 8 , 27 , 8 , 0) Waitms 80 Call Tm1637(27 , 27 , 27 , 8 , 8 , 0) Waitms 120 Call Tm1637_brightness(0) Waitms 260 Next I Wait 1 Call Tm1637(27 , 27 , 28 , 29 , 1 , 1) 'pusto pusto ;-) For I = 0 To 8 Call Tm1637_brightness(i) Waitms 150 Next I Call Tm1637_poz(&B00000000 , 2) 'mryg oczkiem Waitms 500 Call Tm1637_poz(&B10000000 , 2) For I = 8 To 0 Step -1 Call Tm1637_brightness(i) Waitms 150 Next I Wait 1 Call Tm1637(17 , 10 , 17 , 10 , 1 , 0) 'HAHA Waitms 500 Call Tm1637_brightness(0) Waitms 500 Call Tm1637(17 , 10 , 17 , 10 , 8 , 0) 'HAHA Waitms 500 Call Tm1637_brightness(0) Waitms 500 Call Tm1637(17 , 10 , 17 , 10 , 1 , 0) 'HAHA Waitms 500 Call Tm1637_brightness(0) Wait 1 Call Tm1637(23 , 26 , 27 , 27 , 1 , 0) 'mrugajaca pupa Waitms 300 Call Tm1637(27 , 27 , 23 , 10 , 1 , 0) Waitms 300 Call Tm1637(23 , 26 , 27 , 27 , 8 , 0) Waitms 300 Call Tm1637(27 , 27 , 23 , 10 , 8 , 0) Waitms 300 Call Tm1637_brightness(0) Waitms 500 Call Tm1637(27 , 27 , 27 , 17 , 1 , 0) 'wjezdzajace HE HE z rozjasnianiem Waitms 100 Call Tm1637(27 , 27 , 17 , 14 , 1 , 0) Waitms 100 Call Tm1637(27 , 17 , 14 , 27 , 2 , 0) Waitms 100 Call Tm1637(17 , 14 , 27 , 17 , 2 , 0) Waitms 100 Call Tm1637(14 , 27 , 17 , 14 , 3 , 0) Waitms 100 Call Tm1637(27 , 17 , 14 , 27 , 3 , 0) Waitms 100 Call Tm1637(17 , 14 , 27 , 27 , 4 , 0) Waitms 100 Call Tm1637(14 , 27 , 27 , 27 , 4 , 0) Waitms 200 Call Tm1637(27 , 27 , 27 , 27 , 4 , 0) Waitms 200 Call Tm1637(14 , 27 , 27 , 27 , 5 , 0) Waitms 200 Call Tm1637(17 , 14 , 27 , 27 , 5 , 0) Waitms 200 Call Tm1637(27 , 17 , 14 , 27 , 6 , 0) Waitms 200 Call Tm1637(14 , 27 , 17 , 14 , 6 , 0) Waitms 200 Call Tm1637(17 , 14 , 27 , 17 , 7 , 0) Waitms 200 Call Tm1637(27 , 17 , 14 , 27 , 7 , 0) Waitms 200 Call Tm1637(27 , 27 , 17 , 14 , 8 , 0) Waitms 200 Call Tm1637(27 , 27 , 27 , 17 , 8 , 0) Waitms 200 Call Tm1637_brightness(0) Wait 1 For I = 200 To 00 Step -10 'mrugajacy stop Call Tm1637(5 , 25 , 0 , 23 , 8 , 0) Waitms I Call Tm1637_brightness(0) Waitms I Next I Wait 1 Loop End '---[ podprogram ]-------------------------------------------------------------- Tm1637_start: '1637 start transmission Set Clk Set Dio_out Waitus 2 Reset Dio_out Return Tm1637_ack: '1637 responses transmission Reset Clk Waitus 5 'After the eighth clock falling edge delay 5us, start determination ACK signal Reset Dio_set Bitwait Dio_in , Reset Set Clk Waitus 2 Reset Clk Set Dio_set Return Tm1637_stop: '1637 Stop transmission Reset Clk Waitus 2 Reset Dio_out Waitus 2 Set Clk Waitus 2 Set Dio_out Return Brightness: Data &H80 'off 128 pomocne przy mruganiu caloscia Data &H88 'min 1/61 136 Data &H89 '2/16 137 Data &H8A '4/16 138 Data &H8B '10/16 139 Data &H8C '11/16 140 Data &H8D '12/16 141 Data &H8E '13/16 142 Data &H8F 'max 14/16 143 Cyfry: Data &B00111111 '0 Data &B00000110 '1 Data &B01011011 '2 Data &B01001111 '3 Data &B01100110 '4 Data &B01101101 '5 Data &B01111101 '6 Data &B00000111 '7 Data &B01111111 '8 Data &B01101111 '9 Data &B01110111 'A 10 Data &B01111100 'B 11 Data &B00111001 'C 12 Data &B01011110 'D 13 Data &B01111001 'E 14 Data &B01110001 'F 15 Data &B00111101 'G 16 Data &B01110110 'H 17 Data &B00110000 'I 18 Data &B00001110 'J 19 Data &B00111000 'L 20 Data &B01010100 'n 21 Data &B00111100 'o 22 Data &B01110011 'P 23 Data &B01010000 'r 24 'Data &B01101101 'S<->5 Data &B01111000 't 25 Data &B00111110 'U 26 Data &B00000000 'off 27 Data &B01000000 '- 28 Data &B00001111 ') 29 |
i dodatek, w postaci pliku INC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
'by kaktus 'http://kaktusa.pl 'Copyright CC-BY-NC $nocompile '---[ deklaracje ]------------------------------------------------------------- Ddrc.0 = 1 'wyjscie dla CLK 'Config Pinc.1 = Output 'wyjscie dla DIO 'Config Pinc.1 = Input 'wejscie dla DIO Ddrc.1 = 1 'poczatkowa konfiguracja DIO Clk Alias Portc.0 'przyjazne nazwy ;-) Dio_set Alias Ddrc.1 Dio_out Alias Portc.1 Dio_in Alias Pinc.1 Dim I As Byte '---[ deklaracje2 ]------------------------------------------------------------- Declare Sub Tm1637_wrbyte(byval Bajt As Byte) 'wysyla bajt obojetnie co by to nie bylo Declare Sub Tm1637_brightness(byval Light As Byte) ' 0->off, 1->min - 8->max Declare Sub Tm1637(byval Poz3 As Byte , Byval Poz2 As Byte , Byval Poz1 As Byte , Byval Poz0 As Byte , Byval Light_ As Byte , Byval Dot As Byte) 'do wyswietlania cyfr, sterowania jasnosci¹ +on,off, i za³aczania kropek na srodku Declare Sub Tm1637_poz(byval Poz As Byte , Byval Adres As Byte) 'zpis dowolnej wartoci "poz" do numeru wyswietlacza "adres", wyswietlacz musi juz pracowac '---[ podprogram ]------------------------------------------------------------- Sub Tm1637(byval Poz3 As Byte , Byval Poz2 As Byte , Byval Poz1 As Byte , Byval Poz0 As Byte , Byval Light_ As Byte , Byval Dot As Byte) 'do wyswietlania cyfr, sterowania jasnosci¹ +on,off, i za³aczania kropek na srodku 'Light 0->off, 1->min - 8->max ' dot 0->dots off, 1->on Local Tmp As Byte Gosub Tm1637_start Call Tm1637_wrbyte(&H40) '&B01000000 data instruction set -> write data to register (data write mode set) Gosub Tm1637_ack Gosub Tm1637_stop Gosub Tm1637_start Call Tm1637_wrbyte(&Hc0) '&B11000000 addres instruction setting, MSB display Gosub Tm1637_ack Call Tm1637_wrbyte(lookup(poz3 , Cyfry)) Gosub Tm1637_ack Tmp = Lookup(poz2 , Cyfry) Tmp.7 = Dot.0 Call Tm1637_wrbyte(tmp) 'MSB -> dots Gosub Tm1637_ack Call Tm1637_wrbyte(lookup(poz1 , Cyfry)) Gosub Tm1637_ack Call Tm1637_wrbyte(lookup(poz0 , Cyfry)) Gosub Tm1637_ack Gosub Tm1637_stop 'display on/off Call Tm1637_brightness(light_) End Sub '******************************************************************************* Sub Tm1637_brightness(byval Light As Byte) ' 0->off, 1->min - 8->max Gosub Tm1637_start Call Tm1637_wrbyte(lookup(light , Brightness)) 'Maksymalna wartoæ indeksu w u¿yciu jest 65535. Pierwszy wpis zwróci wartoæ 0. Gosub Tm1637_ack Gosub Tm1637_stop End Sub '******************************************************************************* Sub Tm1637_wrbyte(byval Bajt As Byte) 'Write a byte Local Temp As Byte For Temp = 0 To 7 'send bit, LSB first Reset Clk Dio_out = Bajt.temp Waitus 3 Set Clk Waitus 3 Next Temp End Sub '******************************************************************************* Sub Tm1637_poz(byval Poz As Byte , Byval Adres As Byte) 'poz -> dowolna wartosc do wyswietlenia 'adres -> 0-3 -który wyswietlacz 0- prawy skrajny, 3- lewy skrajny 'do zapisu wybranych, nowych wartoci gdy wywietlacz ju¿ pracuje Select Case Adres Case 0: Adres = &HC3 Case 1: Adres = &HC2 Case 2: Adres = &HC1 Case 3 : Adres = &HC0 End Select Gosub Tm1637_start 'mryg oczkiem Call Tm1637_wrbyte(adres) Gosub Tm1637_ack ' Call Tm1637_wrbyte(lookup(poz , Cyfry)) Call Tm1637_wrbyte(poz) Gosub Tm1637_ack Gosub Tm1637_stop End Sub |
Oba pliki do kompilacji należy umieścić w tym samym katalogu. Część podprogramów pozostawioną w pliku głównym można zmienić na procedury i łącznie z deklaracjami przegonić do pliku dodatkowego 😉
Wyświetlacz pracuje idealnie, nie widać żadnego mrugania „przemiatania” czy zmiany intensywności świecenia wybranych segmentów przy przełączaniu wyświetlanej treści. Z łatwością wyświetla się „byle co” w postaci dowolnych znaków, i równie łatwo steruje się intensywnością świecenia. Kontroler bez problemu realizuje szybkie animacje i zmiany jasności świecenia segmentów.
Podglądnięta komunikacja podczas zapisu danych wygląda następująco:
Wynik działania kodu testowego można obserwować na filmie:
Zastosowany wyświetlacz LED jest na tyle egzotyczny, że do chwili obecnej nie udało mi się odnaleźć do niego (dokładnie tego typu) dokumentacji …
Dziękuję Wojtkowi za udostępnienie modułu do rozgryzannia!
A.D. 2015-06-16 Tak się składa, że potestowałem odczyt przycisków, wszystko działa nieźle 🙂 odczyt trzeba oprogramoać tak jak odczyt pojedynczego przycisku podłączonego do pina μC. Krótko mówiąc w chwili naduszenia guzika musi nastąpić odczyt. Dlatego trzeba by dokonywać sekwencyjnego odczytu rejestru co np 50ms. Poniżej przykładowa funkcja do odczytu rejestru z wartościami matrycy klawiatury.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Function Readkey()as Byte 'Czytaj przycisk Gosub Tm1637_start Call Tm1637_wrbyte(&H42) 'Reading the key command Gosub Tm1637_ack Reset Dio_set Set Dio_in For I = 0 To 7 'Zaczął czytać od niskiego Reset Clk Waitus 30 Set Clk Readkey.i = Dio_in Waitus 30 Next I Gosub Tm1637_ack Gosub Tm1637_stop Set Dio_set End Function |
Trzeba pamiętać o jej prawidłowej deklaracji.
Spróbowałem też komunikacji standardowymi poleceniami do obsługi magistrali TWI. Niestety bez spodziewanego rezultatu. Wyświetlacz albo nie działał, albo przy cyklicznym wysyłaniu identycznych wartości wyświetlała się dynamicznie zmieniająca się „mozaika”, zamiast przesłanych cyfr. Jakoś nie chce mi się uruchamiać na „siłę” tej komunikacji … zakładam że być może było by to możliwe. Dla dociekliwych kawałek kodu z użytymi poleceniami.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Config Sda = Portc.1 Config Scl = Portc.0 Config I2cdelay = 0 '---[ test END ]-------------------------------------------------------------- 'Print "rozruch " Do I2cstart I2cwbyte &H40 I2cstop I2cstart I2cwbyte &HC0 L = Lookup(0 , Cyfry) I2cwbyte L L = Lookup(1 , Cyfry) I2cwbyte L L = Lookup(2 , Cyfry) I2cwbyte L L = Lookup(3 , Cyfry) I2cwbyte L I2cstop For J = 8 To 0 Step -1 L = Lookup(j , Brightness) I2cstart I2cwbyte L 'on i jasno I2cstop Waitms 200 Next J wait 1 Loop End Brightness: Data &H80 'off 128 pomocne przy mruganiu caloscia Data &H88 'min 1/61 136 Data &H89 '2/16 137 Data &H8A '4/16 138 Data &H8B '10/16 139 Data &H8C '11/16 140 Data &H8D '12/16 141 Data &H8E '13/16 142 Data &H8F 'max 14/16 143 |
A.D. 2015-06-20 Film przedstawiający pobór prądu przez moduł z wyświetlaczem w trakcie pracy.
Pod koniec prezentacji aktywne są wszystkie segmenty wyświetlacza, najpierw nastawniona jest maksymalna jasność a następnie minimalna. Zasilacz nie był w stanie zmierzyć prądu pobieranego przy minimalnej jasności. Więc można wnioskować, że zapotrzebowanie na energie było mniejsze niż 1mA.
Pliki udostępnionego kodu do pobrania TM1637_AVR.bas_.zip (292 pobrania)
Notki katalogowe
nota katalogowa kontrolera
TM1637.pdf (1555 pobrań)
nota katalogowa kontrolera
TM1637_v12.pdf (3118 pobrań)
Dzięki za kod.
Pomogło mi to, w końcu wyświetlacz TM1639 działał poprawnie.
Mam nadzieję, że to zrozumiesz (użyłem google translate)
:-))
Pozdrawiam !!
It’s quite good for reading ;-p Everything is bright and understandable Show your project off, please.
Trochę poprawiłem 😉
Hej. Mam dość dziwny błąd podczas kompilacji Twojego kodu. Niby polecenia call zawierają tylko jeden parametr, a jednak wywala błąd. Nawet rozbicie (pierw lookup, a potem call) nic nie daje. Dalej ten sam błąd.
Error : Incorrect number of parameters. The numer of parameters must be [ 1] , in File : TM1637_core.inc
Nie sprawdzałem w praktyce, ale dopiero rozbicie funkcji, wykorzystując zmienną lokalną tmp umożliwiło skompilowanie programu.
Tmp = Lookup(poz1 , Cyfry )
Call Tm1637_wrbyte(tmp)
Najczęstsze problemy tego typu są spowodowane różnymi wersjami oprogramowania IDE, a co z tego wynika, inną wersją kompilatora. Przyczynić się do takiego rezultatu również mogą błędy w kodzie źródłowym związane z edytowaniem lub/i przepisywaniem.
Witryna jest tak skonstruowana że kody udostępnione można dogodnie kopiować i w niektórych wypadkach pobrać gotowe DZIAŁAJĄCE pliki źródłowe.
Na tą chwilę nic innego mi nie przychodzi do głowy.
Te wyświetlacze nadają się tylko do stacjonarnych zastosowań. Wedle producenta pobór prądu to ćwierć ampera. W praktyce dochodzi do pół ampera. Niektórzy podają, że pobiera im nawet 800mA! Tymczasem dowolny wyświetlacz LED z własnym sterownikiem nie przekroczy 50mA przy maksymalnej jasności. A jeśli zastosować dynamiczne wyświetlanie tak jak w tym module to 20mA.
Ode mnie szacun za Bascoma, rozgryzanie wyświetlacza przy tym to pikuś 🙂
Na mojej prezentacji wideo w tle jest zasilacz i wskazanie w czasie rzeczywistym poboru mocy. Nie wiem czy widziałeś …
dzięki za ciekawy wpis.