Dot Matrix LED Display

İnternette piyasada bolca bulunan 8x8 dot matrix LED displaylerle yapılmış kayan yazı projelerine sıkça rastlıyorum. Popüler olan bu konuyla ilgili olarak bir proje yapmaya karar verdim. Piyasadaki projeler hep birbirinin kopyası ve gereksiz derecede karışıklar. Pek çoğu 74xx595 serisi entegre ile birlikte ledleri sürmek için ya bir transistor dizisi ya da ULN2803 gibi entegreler kullanmışlar. Oysaki, bu iş için çok uygun bir entegre var: TPIC6B595, 150 mA (sürekli) çıkış gücü sağlayabilen 8-Bit Shift Register. Bu entegre, LEDleri doğrudan sürebilir ve ayrıca birbirine eklenme (cascading) özelliğine sahiptir.

Bu proje için değerli arkadaşım Ferudun Yurdabak (kendisi PIC projeleri yapar) bana birbirine kaskad bağlanmış 2 adet 8x8 dot matrix displayden oluşan bir devre hazırladı (Resim 1). Ben de bu devreyi Atmega8 ile sürmek için basit bir proje hazırladım.

Film burada oynar!

Amatör elektronikçilere lazım olabileceğini düşünerek (bir de ar-ge çalışmaları ve web sitesinin masraflarını çıkarabilmek amacıyla), bu displaylerden ilk etapta 100 adet hazırlayıp makul bir fiyatla satmayı planlıyoruz. Displayler SPI ile sürülecek; bu, birbirine kaskad bağlanmış bir düzüne 8x8 displayin sadece 4 adet kablo ile (SCK, SS, MOSI ve MISO) sürülebileceği anlamına geliyor. Projemiz test aşamasında, gelimelere bu sayfada yer vereceğim.

...

Amatör dostu Güler Elektronikten sipariş verdiğimiz prototip PCB'ler elimize ulaştı (Resim 3). Bordların boyutları displaye göre (60x60mm) kesildiğinden, önden bakıldığında displaylerin arkasındaki bordlar görünmemekte ve displaylerin yanyana boşluksuz olarak kaskad bağlanmasına olanak sağlamaktadır (Resim 4-5).Tek bir displayin SPI ile sürülmesi ile ilgili testlerimiz başarıyla sonuçlandı, sadece bir kaç satır kod yazarak, ekrana istenilen şekli yazdırmak ve animasyon yapmak mümkün. Aşağıdaki basit kod köşelere çarpıp geri dönen ping-pong topu animasyonunu yaratır (SPI modülünü başlatma, ana değişkenleri tanımlama gibi jenerik kısımlar dikkate alınmadığında, animasyonu yaratan asıl kod vurgulanmış olan kısımdır).

#include <avr/io.h>
#include <util/delay.h>
#include <string.h>

#define PORT_SPI PORTB
#define DDR_SPI DDRB //mega8
#define SS PB2
#define MOSI PB3
#define MISO PB4
#define SCK PB5

unsigned char buffer[8]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void delay_ms(uint16_t ms){
for(uint16_t f=0;f<ms;f++)_delay_ms(1); }

void SpiMasterInit(void){
unsigned char tmp;

/* Switch SCK and MOSI pins to output mode. */
DDR_SPI = _BV(SCK) | _BV(MOSI) | _BV(SS); //revision ss as output

/* Activate the SPI hardware. FCK/16 */
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR1) | _BV(SPR0);

/* Clear status flags. */
tmp = SPSR;
tmp = SPDR;
}

void Draw_Display (void){
for(uint8_t x=0;x<8;x++) {
SPDR=buffer[x];
while (!(SPSR & (1<<SPIF))); // wait until Char is sent
} }

void clearmatrix(void){
for(uint8_t x=0;x<8;x++)buffer[x]=0; }

void plot(uint8_t x, uint8_t y){
buffer[x]=_BV(y); }

int main(void){
signed char diry=0,dirx=0;
double x=0,y=0;
SpiMasterInit();
delay_ms(1000);
while(1){
Draw_Display();
_delay_ms(30);
clearmatrix();
plot(x,y);
if(dirx==0)x+=0.5;
else x-=0.5; if(diry==0)y++;
else y--; if(x > 7) {x=7; dirx=1;}
if(x < 0) {x=0; dirx=0;} if(y > 7) {y=7; diry=1;}
if(y < 0) {y=0; diry=0;}
}

}

Bordun üzerinde bulunan Atmega8 sadece SPI üzerinden gelen 8 Byte'lık matriks şeklindeki ekran verisini TPIC6B595 üzerinden LED matrikse yansıtır. Ekranı kontrol eden devrede ise sadece matriksin içi değiştirilip SPI üzerinden LED modülüne gönderilir. Bu sistemin avantajları şöyle sıralanabilir.

  • Asıl devre üzerindeki işlemci yükünü önemli ölçüde azaltır.
  • Sadece iki kablo ile displaye veri gönderilir.
  • SPI evrensel bir arayüz olduğundan display modülü diğer işlemcilerle ve hatta bilgisayardan kontrol edilebilir.

Proje Dosyaları

Proje Dosyaları