Wyświetlacz oparty na SAA1064

Wyświetlacz oparty na SAA1064

Wyświetlacz oparty na SAA1064

Możliwość komentowania Wyświetlacz oparty na SAA1064 została wyłączona

Otrzymałem do uruchomienia i rozpracowania wyświetlacz LED o wysokości cyfry 9 cm sterowany układem scalonym SAA1064. Wyświetlacz prawdopodobnie pochodzi ze starej sportowej tablicy wyników. Składa się z 4 cyfr, każda po 28 diod, nie posiada kropek. Po ściągnięciu aplikacji układu SAA rozpocząłem analizę PCB.

Widać, że moduły można łączyć w większą całość. Układ jest sterowany interfejsem I2C, posiada piny adresowe do zwarcia cyną. Analizę rozpocząłem od zbadania połączenia diod LED. Okazało się, że są one połączone szeregowo po 4 sztuki. Układ wymaga zatem zasilania 12V (przynajmniej w części LED). Po sprawdzeniu danych katalogowych okazało się, że SAA1064 można zasilać napięciem do 15V, przy zachowaniu poziomów TTL w interfejsie sterującym. Analiza PCB pozwoliła ustalić, że zasilanie 12V podawane bezpośrednio na kondensator 220u/40V wystarczy do obsługi całości, ponieważ jest ono dostarczone dalej do układu scalonego przez diodę półprzewodnikową. Odnalazłem pola lutownicze do adresowania magistrali i ustawiłem domyślny adres 0x70 (pin 1 układu scalonego do masy).
Sterowanie testowe powierzyłem Arduino Uno. Układ w zasadzie ruszył od pierwszego uruchomienia, ale program miał błędnie skonfigurowane definicje cyfr (skorzystałem z gotowych definicji z chińskich modułów – tutaj diody są podłączone zupełnie inaczej). Bajt sterujący wyświetlaniem cyfry ma składnię (binarnie: 1-segment zapalony, 0-segment zgaszony): defabcg0


Czyli dla wyświetlenia poszczególnych cyfr należy wysłać (dziesiętnie):
0 – 252
1 – 12
2 – 218
3 – 158
4 – 46
5 – 182
6 – 246
7 – 28
8 – 254
9 – 190
Dalej już bez problemu napisałem testowy program:

#include „Wire.h”
byte saa1064 = 0x70 >> 1; // SAA1064 (pin 1 do masy)
int digits[10]={252, 12, 218, 158, 46, 182, 246, 28, 254, 190};
// zdefiniowanie cyfr    – binarnie:   Bdefabcg0      gdzie abcdefg – segmenty wyświetlacza

void setup()
{
Wire.begin();
delay(500);
initDisplay();
}

void initDisplay()
{
Wire.beginTransmission(saa1064);
Wire.write(B00000000);
Wire.write(B01000111);
Wire.endTransmission();
}

void displayDigits()
{
for (int z=0; z<10; z++)
{
Wire.beginTransmission(saa1064);
Wire.write(1); //control is 1 (right hand side)
Wire.write(digits[z]); // cyfra 1 (prawa)
Wire.write(digits[z]); // cyfra 2
Wire.write(digits[z]); // cyfra 3
Wire.write(digits[z]); // cyfra 4 (lewa)
Wire.endTransmission();
delay(1200);
}
}

void clearDisplay()
{
Wire.beginTransmission(saa1064);
Wire.write(1);
Wire.write(0);
Wire.write(0);
Wire.write(0);
Wire.write(0);
Wire.endTransmission();
}

void loop()
{
displayDigits();
clearDisplay();
delay(2000);
}

Related Posts

Back to Top