Anda di halaman 1dari 13

Scrolling Text pada Led Dot Matrix

Berbasis Mikrokontroler & Komunikasi Serial

Kebutuhan akan media penyampai informasi yang menarik seperti


untuk kebutuhan iklan membutuhkan kreativitas tersendiri. Awalnya
banyak menggunakan lampu hias berupa lampu neon yang dibentuk
karakter khusus yang disesuaikan kebutuhan. Teknologi dengan lampu
neon terdapat banyak kekurangan diantaranya adalah tidak dapat
diupdate informasinya dan membutuhkan tenaga listrik yang relativ
besar. Teknologi led dotmatrix yang dikendalikan dengan
mikrokontroller menutup kekurangan tersebut, informasi dapat dengan
mudah diupdate melalui PC dan led tidak membutuhkan daya listrik
besar.

Blok diagram
Blok diagram sistem yang dibangun sebagai berikut

Gambar 1. Blok diagram sistem


Hardware
• Dot matrix 5x7, Led yang tersusun dalam 5 kolom dan 7 baris.
• Mikrokontroller dengan eeprom internal, dalam hal ini digunakan
ATMega 8535
• Untuk mengendalikan led yang akan dinyalakan dibutuhkan driver
baris dan kolom. Pada driver kolom menggunakan shift register
untuk menggilir led mana yang akan dinyalakan, sedangkan pada
driver baris yang dikuatkan arusnya.
• Interface ke serial port

Software

Start

Inisisalisasi Port Serial


Data

Buat Index
1
Text

Buat Index
2
Scroll

Tekan “m” untuk


masuk ke menu Y Konsole
utama

Tampilkan 3
karakter ke
dot matrix

End

Gambar 2. Diagram alir program utama dapat dilihat pada gambar di


samping.

• Fungsi untuk memasukkan, mengubah dan menghapus text dari PC


ke eeprom mikrokontroller
• Fungsi untuk menyusun index text pada eeprom dengan library font
• Fungsi untuk menyusun array berupa library font yang telah
disusun sesuai dengan text yang dimasukkan pengguna melalui PC
ke eeprom
• Fungsi untuk menampilkan array ke led dot matrix
• Fungsi untuk memberikan animasi scroll

Cara Kerja Sistem


Alat penampil karakter maupun animasi yang dapat diinput dari suatu
PC yang terhubung dengan mikrokontroler melewati port serial.
Karakter diinput pada suatu aplikasi di PC dimana aplikasi tersebut
telah di set untuk dapat menerima dan mengirimkan data melalui port
serial. Aplikasi tersebut mengirimkan data yang membuat
mikrokontroler yang terhubung komunikasi serial tersebut merespon
dengan mengirimkan data yang membentuk suatu kalimat (karakter)
dan menu untuk memasukan karakter. Di dalam menu tersebut
terdapat beberapa pilihan yaitu :
• Lihat Text, yaitu untuk melihat text yang telah dimasukan,
• Ganti Text, yaitu untuk meng-input, menambahkan dan
mengganti suatu karakter yang akan ditampilkan pada dot
matrix,
• Hapus Text, adalah pilihan yang berguna untuk menghapus
karakter atau kalimat yang telah kita masukan sebelumnya.
Setelah karakter diinput pada aplikasi tersebut, karakter yang berupa
data tersebut dikirim melalui port serial menuju mikrokontroler.
Mikrokontroler yang diset untuk menerima data dari PC akan mengolah
data yang akan disimpan pada memori yang ada pada mikrokontroler.
Hasil dari proses pada mikrokontroler tersebut adalah output hexa
yang akan dikeluarkan pada Port A sebagai pengaturan baris dot
matrix dan Port B mikrokontroler sebagai pengaturan data yang akan
diproses kembali pada driver kolom. Data yang dikirim pada Port A
inilah yang dapat menghidupkan dot matrix. Led–led yang menyala
akan membentuk suatu karakter dan karakter tersebut akan sama
dengan karakter yang diinputkan pada aplikasi di PC.
Gambar 3. Memasukkan text melalui PC ke mikrokontroller

Adapun untuk memberikan efek scroll, maka dibuat array yang akan
dipanggil dengan index yang increment sehingga karakter yang
muncul di led dot matrix tampil secara bergeser.

Rangkaian Skematik

Gambar 4. Rangkaian skematik display dot matrix

Source Code

#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
#include <string.h>

int a,i,n,k,l,y,x,c,z;
int n_font=96; //STATIS
int jumlah_urutan;
int flag=0;
char data;

eeprom int n_text,j=0;


eeprom char text[80]={'0','1'};
unsigned char scroll[250]={'0','1'};

flash char font_greeting1[] = {


0x00,
0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00,// W
0x7E, 0x11, 0x11, 0x11, 0x7E ,0x00,// A
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,// H
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,// Y
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,// U
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x7F, 0x09, 0x09, 0x01, 0x01, 0x00,// F
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,// I
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,// R
0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00,// D
0x7E, 0x11, 0x11, 0x11, 0x7E ,0x00,// A
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,// U
0x46, 0x49, 0x49, 0x49, 0x31, 0x00,// S
0x00
};

flash char font_greeting2[] ={


0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x08, 0x08, 0x08, 0x08, 0x7F, 0x3E,// Diode
0x1C, 0x08, 0x7F, 0x08, 0x08, 0x08,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x00, 0x00, 0x00, 0x00, 0x00
};

flash char font[] = {


0x9C, 0xBE, 0xFC, 0xBE, 0x9C,0x00,//heart (~)
0x08, 0x08, 0x2A, 0x1C, 0x08,0x00,// ->
0x08, 0x1C, 0x2A, 0x08, 0x08,0x00,// <-
0x00, 0x08, 0x36, 0x41, 0x00,0x00,// {
0x00, 0x00, 0x7F, 0x00, 0x00,0x00,// |
0x00, 0x41, 0x36, 0x08, 0x00,0x00,// }
0x00, 0x00, 0x7F, 0x41, 0x41,0x00,// [
0x02, 0x04, 0x08, 0x10, 0x20,0x00,// \
0x41, 0x41, 0x7F, 0x00, 0x00,0x00,// ]
0x04, 0x02, 0x01, 0x02, 0x04,0x00,// ^
0x40, 0x40, 0x40, 0x40, 0x40,0x00,// _
0x00, 0x01, 0x02, 0x04, 0x00,0x00,// `
0x00, 0x07, 0x00, 0x07, 0x00,0x00,// "
0x00, 0x00, 0x5F, 0x00, 0x00,0x00,// !
0x14, 0x7F, 0x14, 0x7F, 0x14,0x00,// #
0x24, 0x2A, 0x7F, 0x2A, 0x12,0x00,// $
0x23, 0x13, 0x08, 0x64, 0x62,0x00,// %
0x36, 0x49, 0x55, 0x22, 0x50,0x00,// &
0x00, 0x1C, 0x22, 0x41, 0x00,0x00,// (
0x00, 0x41, 0x22, 0x1C, 0x00,0x00,// )
0x08, 0x2A, 0x1C, 0x2A, 0x08,0x00,// *
0x08, 0x08, 0x3E, 0x08, 0x08,0x00,// +
0x00, 0x50, 0x30, 0x00, 0x00,0x00,// ,
0x08, 0x08, 0x08, 0x08, 0x08,0x00,// -
0x00, 0x30, 0x30, 0x00, 0x00,0x00,// .
0x20, 0x10, 0x08, 0x04, 0x02,0x00,// /
0x3E, 0x51, 0x49, 0x45, 0x3E,0x00,// 0
0x00, 0x42, 0x7F, 0x40, 0x00,0x00,// 1
0x42, 0x61, 0x51, 0x49, 0x46,0x00,// 2
0x21, 0x41, 0x45, 0x4B, 0x31,0x00,// 3
0x18, 0x14, 0x12, 0x7F, 0x10,0x00,// 4
0x27, 0x45, 0x45, 0x45, 0x39,0x00,// 5
0x3C, 0x4A, 0x49, 0x49, 0x30,0x00,// 6
0x01, 0x71, 0x09, 0x05, 0x03,0x00,// 7
0x36, 0x49, 0x49, 0x49, 0x36,0x00,// 8
0x06, 0x49, 0x49, 0x29, 0x1E,0x00,// 9
0x00, 0x36, 0x36, 0x00, 0x00,0x00,// :
0x00, 0x56, 0x36, 0x00, 0x00,0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41,0x00,// <
0x14, 0x14, 0x14, 0x14, 0x14,0x00,// =
0x41, 0x22, 0x14, 0x08, 0x00,0x00,// >
0x02, 0x01, 0x51, 0x09, 0x06,0x00,// ?
0x32, 0x49, 0x79, 0x41, 0x3E,0x00,// @
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// SPASI
0x7E, 0x11, 0x11, 0x11, 0x7E ,0x00,// A
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,// B
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,// C
0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00,// D
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,// E
0x7F, 0x09, 0x09, 0x01, 0x01, 0x00,// F
0x3E, 0x41, 0x41, 0x51, 0x32, 0x00,// G
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,// H
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,// I
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,// J
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,// K
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,// L
0x7F, 0x02, 0x04, 0x02, 0x7F, 0x00,// M
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,// N
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,// O
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,// P
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,// Q
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,// R
0x46, 0x49, 0x49, 0x49, 0x31, 0x00,// S
0x01, 0x01, 0x7F, 0x01, 0x01, 0x00,// T
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,// U
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,// V
0x7F, 0x20, 0x18, 0x20, 0x7F, 0x00,// W
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,// X
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,// Y
0x61, 0x51, 0x49, 0x45, 0x43, 0x00,// Z
0x20, 0x54, 0x54, 0x54, 0x78, 0x00,// a
0x7F, 0x48, 0x44, 0x44, 0x38, 0x00,// b
0x38, 0x44, 0x44, 0x44, 0x20, 0x00,// c
0x38, 0x44, 0x44, 0x48, 0x7F, 0x00,// d
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,// e
0x08, 0x7E, 0x09, 0x01, 0x02, 0x00,// f
0x08, 0x14, 0x54, 0x54, 0x3C, 0x00,// g
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,// h
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,// i
0x20, 0x40, 0x44, 0x3D, 0x00, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44,0x00,// k
0x00, 0x41, 0x7F, 0x40, 0x00,0x00,// l
0x7C, 0x04, 0x18, 0x04, 0x78,0x00,// m
0x7C, 0x08, 0x04, 0x04, 0x78,0x00,// n
0x38, 0x44, 0x44, 0x44, 0x38,0x00,// o
0x7C, 0x14, 0x14, 0x14, 0x08,0x00,// p
0x08, 0x14, 0x14, 0x18, 0x7C,0x00,// q
0x7C, 0x08, 0x04, 0x04, 0x08,0x00,// r
0x48, 0x54, 0x54, 0x54, 0x20,0x00,// s
0x04, 0x3F, 0x44, 0x40, 0x20,0x00,// t
0x3C, 0x40, 0x40, 0x20, 0x7C,0x00,// u
0x1C, 0x20, 0x40, 0x20, 0x1C,0x00,// v
0x3C, 0x40, 0x30, 0x40, 0x3C,0x00,// w
0x44, 0x28, 0x10, 0x28, 0x44,0x00,// x
0x0C, 0x50, 0x50, 0x50, 0x3C,0x00,// y
0x44, 0x64, 0x54, 0x4C, 0x44,0x00// z
};

char font_index[96]={'~','-
>','<-','{','|','}','[','"\"',']','^','_','`','"','!','#','$','%','&','
(',')','*','+',',','-','.','/','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','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 index_text[]={''};

void tampilkan(void);
void buat_index_scroll(void);
void cek_scroll(void);
void tampilkan_index_text(void);
void buat_index_text(void);
void cek_index_text(void);
void konsole(void);
void tampilkan_greeting1(void);
void tampilkan_greeting2(void);
void tampilkan_dot_matrix(void);

void main(void)
{

// USART 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

DDRC=0xFF; // Driver Baris


PORTC=0xFF;
DDRA=0xFF; // Driver Kolom
PORTA=0xFF;

buat_index_text();
buat_index_scroll();

while(1)
{
delay_ms(50);
data=UDR;
delay_ms(50);
if(data=='m')
{
konsole();
}

tampilkan_greeting1();
tampilkan_greeting2();
tampilkan_dot_matrix();
};
}

void buat_index_text(void)
{
for (i=0; i < n_text;i++)
{
//printf("\n\r");
for (j=0;j<n_font;j++)
{
//printf(" %c",text[i]);
//printf("->%c",font_index[j]);

if(text[i]==font_index[j])
{
//printf(" Match"); // cek karakter yg match
index_text[i]=j;
}
}
}

// Temukan Indek Text


void cek_index_text(void)
{
printf("\n\r");
printf("Index:");
for (i=0; i < n_text; i++)
{
printf(" %d",index_text[i]); // Unsigned dalam desimal
}
}

void tampilkan(void)
{
for (n=0;n<60;n++)
{
printf("%u",font[n]); // Unsigned dalam desimal
printf("->%u",&font[n]); // Unsigned dalam desimal
/*
p=&font[n];
printf("P:%u",p); // Unsigned dalam desimal
printf("\n\r");
delay_ms(100);
*/
}
}

void buat_index_scroll(void)
{
for (i=0;i<n_text;i++)
{
a=(int)index_text[i]*6;
for(n=0;n<6;n++) // 6 Kolom
{
jumlah_urutan=a+n;
scroll[z]=font[jumlah_urutan];
z++;
}
}
}

void cek_scroll(void)
{

for (i=0;i<z;i++)
{
printf("-%x",scroll[i]); // Unsigned dalam desimal
}
}

void konsole(void)
{
printf("\n\r\n\r");
printf("Pilih menu:"); // Jumlah pulsa
printf("\n\r");
printf("[1].Lihat Text"); // Jumlah pulsa
printf("\n\r");
printf("[2].Ganti Text"); // Jumlah pulsa
printf("\n\r");
printf("[3].Hapus Text"); // Jumlah pulsa
printf("\n\r");

while(1)
{
while(UCSRA.7)
{
data=UDR;
delay_ms(50);

if((flag==1) && (data!=0x1b))


{
text[n_text]=data;
printf("%c",text[n_text]);
n_text=n_text+1;
}

if((flag==0)&& (data=='1'))
{
printf("\n\r");
printf("Isi Text:");
for(j=0; j< n_text; j++)
{
printf("%c",text[j]);
}
}

if((flag==0) &&(data=='2'))
{
printf("\n\r");
printf("Masukan Text:");
flag=1;
}

if((flag==0)&&(data=='3'))
{
n_text=0;
j=0;
printf("\n\r");
printf("Text telah dihapus:");
flag=0;
}

if(data==0x1b)
{
printf("\n\r");
printf("Data telah tersimpan");
flag=0;
}
};
};

void tampilkan_dot_matrix(void)
{
for(l=0; l<(n_text*6); l++) // jumlah karakter yg mau tampil
{
y=l*1; //y=faktor geser
x=0;

while(x<4) //speed
{
x=x+1; //scroll

// baris aktig low


// kolom aktif high

// CETAK DOT MATRIK


for(k=0;k<81;k++) // k=jumlah kolom dot matrix
{
c=k+y;
if(c<0)
{
PORTC=0xFF;
}
if(c>n_text*6-1) // Pemotongan Ekor
{
c=c-(n_text*6);
PORTC=0xFF;
}
else
{
PORTC=~scroll[c];
}
// KOLOM,nyala jika 0
if(k==0)
{
PORTA.0=0;
}
else
{
PORTA.0=1;
}

// Generate clock
PORTA.1=0; //Clock
PORTA.2=1; //Latch
PORTA.1=1; //Clock
PORTA.2=0; //Latch
delay_us(100);
} //end looping for shift register

}; //end while setelah 100

if(l==(n_text*6))
{
l=0;
}

} //end for
}

void tampilkan_greeting1(void)
{

z=0;
while(z<80) //speed
{
z=z+1;
for(i=0;i<81;i++) // i=jumlah kolom dot matrix
{
c=i-1;
PORTC=~font_greeting1[c];

if(i==0)
PORTA.0=0;

else
PORTA.0=1;

// Generate clock
PORTA.1=0; //Clock
PORTA.2=1; //Latch
PORTA.1=1; //Clock
PORTA.2=0; //Latch
delay_us(100);
} //end looping for shift register

}; //end while setelah 200


}

void tampilkan_greeting2(void)
{

z=0;
while(z<80) //speed
{
z=z+1;
for(i=0;i<81;i++) // i=jumlah kolom dot matrix
{
c=i-1;
PORTC=font_greeting2[c];

if(i==0)
PORTA.0=0;

else
PORTA.0=1;

// Generate clock
PORTA.1=0; //Clock
PORTA.2=1; //Latch
PORTA.1=1; //Clock
PORTA.2=0; //Latch
delay_us(100);
} //end looping for shift register

}; //end while setelah 200


}

Penulis

Wahyu Firdaus, Teknik Informatika 2006 STMIK-AMIKBANDUNG

Anda mungkin juga menyukai