REVISI
Setelah beberapa pembaca mengeluh karena ga bisa jalan itu script...dan saya juga bingung dibuatnya, akhirnya terdeteksi bahwa saya menggunakan script dengan ARRAY yang melebihi RAM seperti gambar berikut ini :
JADI MOHON DIMAAFKAN !!
Atas permintaan seorang pembaca blog dengan id kaskus sn0bi, kali ini kita akan bahas perancangan 3 LED MATRIX yang menggunakan ATMega 8535. Sebenernya ini adalah perpanjangan dari project
LOVE HURT yang hanya menggunakan 1 buat Led Matrix. Untuk mengurangi jumlah komponen yang dipakai, maka ukuran led matrix jangan melebihi dari 2" (inch) . Untuk dapat dirancang diatas breadboard / projectboard dipilihlah led matrix berukuran 1 inch.
Bahan-bahan dan skematiknya seperti berikut ini :
klik untuk memperjelas
*) catatan : perhatikan port ISP yg digunakan 6 pin..sesuaikan dengan yg kamu gunakan
Dari skematik diatas dapat dijelaskan bahwa ATMEGA8535 menggunakan clock internal / default 1MHz dan dot/led matrix diparalel dibagian baris. Untuk scanning kolom digunakan portD 0-7 dan portC 0-6. Sebenarnya kalo dilihat dari gambar diatas, kaki-kaki ATMega masih cukup untuk 1 buah led matrix (tinggal penyesuaian di script nya saja). Scanning cukup dilakukan dengan menggeser bit (active low) dari kiri ke kanan. Secara lengkap scriptnya seperti berikut :
#define F_CPU 1000000UL //ubah sesuai clock micro
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#define cepat 8 //ubah ini untuk mengatur kecepatan scroll
//UPDATED JUNE 9 2014 ...www.aisi555.com ....
const char textset[] PROGMEM =
{0x30, 0x4a, 0x4a, 0x4a, 0x7c,//a
0x7f, 0x28, 0x44, 0x44, 0x38,//b
0x80, 0x38, 0x44, 0x44, 0x44,//c
0x38, 0x44, 0x44, 0x28, 0x7f,//d
0x38, 0x54, 0x54, 0x54, 0x18,//e
0x08, 0x7e, 0x09, 0x09, 0x02,//f
0x08, 0x54, 0x54, 0x54, 0x3c,//g
0x7f, 0x08, 0x04, 0x04, 0x78,//h
0x80, 0x44, 0x7d, 0x40, 0x80,//i
0x20, 0x40, 0x44, 0x3d, 0x80,//j
0x80, 0x7f, 0x18, 0x24, 0x42,//k
0x80, 0x41, 0x7f, 0x40, 0x80,//l
0x7c, 0x04, 0x78, 0x04, 0x78,//m
0x7c, 0x08, 0x04, 0x04, 0x78,//n
0x38, 0x44, 0x44, 0x44, 0x38,//o
0x7c, 0x14, 0x14, 0x14, 0x08,//p
0x08, 0x14, 0x14, 0x14, 0x7c,//q
0x7c, 0x08, 0x04, 0x04, 0x08,//r
0x48, 0x54, 0x54, 0x54, 0x24,//s
0x80, 0x04, 0x3f, 0x44, 0x44,//t
0x3c, 0x40, 0x40, 0x20, 0x7c,//u
0x1c, 0x20, 0x40, 0x20, 0x1c,//v
0x3c, 0x40, 0x30, 0x40, 0x3c,//w
0x44, 0x28, 0x10, 0x28, 0x44,//x
0x0c, 0x50, 0x50, 0x50, 0x3c,//y
0x44, 0x64, 0x54, 0x4c, 0x44,//z
0x3e, 0x51, 0x49, 0x45, 0x3e, //0
0x80, 0x42, 0x7f, 0x40, 0x80, //1
0x42, 0x61, 0x51, 0x49, 0x46, //2
0x41, 0x41, 0x45, 0x4b, 0x31, //3
0x18, 0x14, 0x12, 0x7f, 0x10, //4
0x27, 0x45, 0x45, 0x45, 0x39, //5
0x3c, 0x4a, 0x49, 0x49, 0x31, //6
0x01, 0x71, 0x09, 0x05, 0x03, //7
0x36, 0x49, 0x49, 0x49, 0x36, //8
0x06, 0x49, 0x49, 0x29, 0x1e, //9
0x7e, 0x11, 0x11, 0x11, 0x7e, //A
0x7f, 0x49, 0x49, 0x49, 0x36, //B
0x3e, 0x41, 0x41, 0x41, 0x22, //C
0x7f, 0x41, 0x41, 0x22, 0x1c, //D
0x7f, 0x49, 0x49, 0x49, 0x41, //E
0x7f, 0x09, 0x09, 0x09, 0x01, //F
0x3e, 0x41, 0x49, 0x49, 0x7a, //G
0x7f, 0x08, 0x08, 0x08, 0x7f, //H
0x80, 0x41, 0x7f, 0x41, 0x80,//I
0x20, 0x40, 0x41, 0x3f, 0x01, //J
0x7f, 0x08, 0x14, 0x22, 0x41, //K
0x7f, 0x40, 0x40, 0x40, 0x40, //L
0x7f, 0x02, 0x04, 0x02, 0x7f, //M
0x7f, 0x04, 0x08, 0x10, 0x7f, //N
0x3e, 0x41, 0x41, 0x41, 0x3e, //O
0x7f, 0x11, 0x11, 0x11, 0x0e, //P
0x3e, 0x41, 0x51, 0x21, 0x5e, //Q
0x7f, 0x09, 0x19, 0x29, 0x46, //R
0x46, 0x49, 0x49, 0x49, 0x31, //S
0x01, 0x01, 0x7f, 0x01, 0x01, //T
0x3f, 0x40, 0x40, 0x40, 0x3f, //U
0x1f, 0x20, 0x40, 0x20, 0x1f, //V
0x3f, 0x40, 0x38, 0x40, 0x3f, //W
0x63, 0x14, 0x08, 0x14, 0x63, //X
0x07, 0x08, 0x70, 0x08, 0x07, //Y
0x61, 0x51, 0x49, 0x45, 0x43, //Z
0x80, 0x80, 0x80};//""
const char textreal[] PROGMEM= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ' } ;
char blk = 0x80;
char fulltext[17] ;
char scrolltext[500];//panjang kalimat 300 dibagi 6 (5 kolom + 1pembatas)
//UBAH besar ARRAY scroltext[XXX] sesuaikan besar RAM IC yg dipakai..
char textnya[] = "3 Led Matrix ATMega8535 AHOCOOL SurabayA 2013";
void cleartext(void) // MEMBERSIHKAN datanya menjadi kosong
{ uint8_t i;
for(i=0 ; i <20 ; i++)
{ fulltext[i] = 0 ; }
}
void convert_text(char *texte)
{
uint8_t a,b,max_text;
int c,d;
char dummy[1];
max_text=strlen(texte);
for(a=0 ; a<max_text; a++)
{
for(b=0;b<65;b++) // maximum jumlah definisi text di database array
{
strncpy_P(dummy,&textreal[b],1);
if ( texte[a] == dummy[0]) break;
}
d=b*5;
if(dummy[0] != ' ') for(c=d; c<d+5; c++) strncat_P(scrolltext,&textset[c],1); //spasi
else for(c=d; c<d+3; c++) strncat_P(scrolltext,&textset[c],1);
strncat(scrolltext,&blk,1);
}
}
void tulis_text(void)
{
uint8_t a;
int b,speed;
a=0;
speed=5;//UBAH NILAI speed sesuai keinginan dan kedip led
while(a<16)
{
for(b=0;b<speed;b++ )
{
if(a<8 )
{
PORTD = ~(1<<a) ;
PORTC =0b11111111;
}
else
{
PORTC = ~(1<<(a-8)) ;
PORTD =0b11111111;
}
PORTA=fulltext[a];
_delay_us(60);
PORTA=0x80; //biar tidak berbayang
}
a++;
}
}
void scrol(char *scrtxt)
{ uint8_t q,r,step =0;
int maxstep;
maxstep = (strlen(scrtxt) * 6) ;
convert_text(scrtxt);
while(step < ( maxstep + 30) )
{
if(step < 15)
{
for(q=0; q <(16-step) ; q++ )
{ fulltext[q]= 0x80; }
for(q=(15-step); q <16 ; q++ )
{ fulltext[q]=scrolltext[q - 15 + step]; }
for(r=0;r<cepat;r++) tulis_text();
}
else if( step > (maxstep + 15 ) )
{
for(q=0; q <(maxstep + 30 - step) ; q++ )
{ fulltext[q]=scrolltext[step -15 + q]; }
for(q=(maxstep + 30 - step); q <16 ; q++ )
{ fulltext[q]= 0x80; }
for(r=0;r<cepat;r++) tulis_text();
}
else
{
for(q=0; q <16 ; q++ )
{
fulltext[q]=scrolltext[q + step -15];
}
for(r=0;r<cepat;r++) tulis_text();
}
step++;
}
}
int main(void)
{
//bagian ini sesuaikan dengan port micro yg kamu gunakan
DDRA = 0b11111111; // portA = data text dot matrix
DDRC = 0b11111111; //scanning kolom
DDRD = 0b11111111; //scanning kolom
while(1)
{
scrol(textnya);
cleartext();
}
return 0;
}
proses geser-geser yang terpenting adalah bagian berikut :
Scanning kolom :
void tulis_text(void)
{
uint8_t a;
int b,speed;
a=0;
speed=20;//UBAH NILAI speed sesuai keinginan
while(a<16)
{
for(b=0;b<speed;b++ )
{
if(a<8 )
{
PORTD = ~(1<<a) ;
PORTC =0b11111111;
}
else
{
PORTC = ~(1<<(a-8)) ;
PORTD =0b11111111;
}
PORTA=fulltext[a];
_delay_us(300);
PORTA=0x80; //biar tidak berbayang
}
a++;
}
}
Dari script scanning diatas dapat dilihat script PORTD = ~(1<<a) ; yang berfungsi untuk menegasi pergeseran bit 1 menjadi active low. Jika menggunakan 4 buah matrix maka dialkukan penyesuaian kondisi if ketika port nya loncat ke seri port yg berbeda.
Geser Kiri :
void scrol(char *scrtxt)
{ int q,step =0;
int maxstep;
maxstep = (strlen(scrtxt) * 6) ;
convert_text(scrtxt);
while(step < ( maxstep + 30) ) //30 = 15 awal + 15 akhir
{
if(step < 15) //start awal
{
for(q=0; q <(16-step) ; q++ )
{ fulltext[q]= 0x80; }
for(q=(15-step); q <16 ; q++ )
{ fulltext[q]=scrolltext[q - 15 + step]; }
tulis_text();
}
else if( step > (maxstep + 15 ) ) //akhir kalimat
{
for(q=0; q <(maxstep + 30 - step) ; q++ )
{ fulltext[q]=scrolltext[step -15 + q]; }
for(q=(maxstep + 30 - step); q <16 ; q++ )
{ fulltext[q]= 0x80; }
tulis_text();
}
else
{
for(q=0; q <16 ; q++ )
{
fulltext[q]=scrolltext[q + step -15]; // ditengah-tengah
}
tulis_text();
}
step++;
}
}
Bagian terpenting adalah ketika memberikan efek kosong pada awal dan akhir dari urutan kalimat. Variable "maxstep" merupakanjumlah step scanning kolom maksimum dari kalimat, sedangkan variable "step" adalah langkah pergeseran. Untuk 3 buah matrix maka terdapat 15 step scanning kolom pada setiap kali penampilan huruf di matrix. Jadi jika menggunakan 4 matrix cukup merubah unsur penghitungan kolom yang ditampilkan saja (step = 20). Untuk geser atas atau animasi lainnya dapat dikreasikan dari project love hurt.
Hasil dari project ini yang dilakukan rekan sn0bi dari makasar seperti pada video berikut :
seperti biasa, jika ingin membeli bahan-bahannya bisa lewat aku, atau paket belajarnya di "custom" dengan 3 led matrix ? bisa...harga nego via contact aku ya...
SELAMAT MENCOBA