Bahan-Bahan:
- ATMega 8535/16/32
- 4 buah Led matrix 7x5
- 3 bh Resistor 10K
- 2 Tombol tactile switch
- Breadboard / projectboard
- Kabel secukupnya
Dasar yg harus dikuasai:
Dasar I/O,
Led Matrix Lovehurt ,
Counter/Timer
Skematik :
Klik untuk lebih jelas, baca keterangan pada gambar
Script Jam Led matrix
#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>
//ARRAY UNTUK MENYIMPAN DATA ANGKA
const char textset[] PROGMEM =
{0x7f, 0x41, 0x7f, //0
0x80, 0x80, 0x7f, //1
0x79, 0x49, 0x4f, //2
0x49, 0x49, 0x7f, //3
0x0f, 0x08, 0x7f, //4
0x4f, 0x49, 0x79, //5
0x7f, 0x49, 0x79, //6
0x01, 0x01, 0x7f, //7
0x7f, 0x49, 0x7f, //8
0x4f, 0x49, 0x7f, //9
};
char titik_dua = 0x14; // :
char blk = 0x80; // BLANK
char fulltext[22] ; //ARRAY TAMPILAN led matrix
char detik,menit,jam; //variabel jam
void cleartext(void) // MEMBERSIHKAN datanya menjadi kosong
{ uint8_t i;
for(i=0 ; i <20 ; i++)
{ fulltext[i] = 0 ; }
}
void ubah_angka(char angka1, char angka2, char angka3, char angka4)
{
//routine mengubah angka waktu ke tampilan led matrix
uint8_t a,b;
//jam
b=angka1*3;
for(a=b; a<b+3; a++) strncat_P(fulltext,&textset[a],1); //spasi
strncat(fulltext,&blk,1);
b=angka2*3;
for(a=b; a<b+3; a++) strncat_P(fulltext,&textset[a],1);
strncat(fulltext,&blk,1); strncat(fulltext,&blk,1);
// untuk tampilan titik dua berkedip
if(detik%2 == 0)strncat(fulltext,&titik_dua,1);
else strncat(fulltext,&blk,1);
strncat(fulltext,&blk,1); strncat(fulltext,&blk,1);
//menit
b=angka3*3;
for(a=b; a<b+3; a++) strncat_P(fulltext,&textset[a],1);
strncat(fulltext,&blk,1);
b=angka4*3;
for(a=b; a<b+3; a++) strncat_P(fulltext,&textset[a],1);
}
//routine untuk scanning & menulis ke led matrix
void tulis_text(void)
{
uint8_t a;
int b,speed;
a=0;
speed=5;//UBAH NILAI speed sesuai kedip dan kecerahan yg diinginkan
while(a<21)
{
for(b=0;b<speed;b++ )
{
if(a<8 )
{
PORTD = ~(1<<a) ;
PORTC =0b11111111;
PORTB =0b1111;
}
else if(a>=8 && a<16)
{
PORTC = ~(1<<(a-8)) ;
PORTD =0b11111111;
PORTB =0b1111;
}
else if(a>=16 && a<21)
{
PORTB = ~(1<<(a-16)) ;
PORTD =0b11111111;
PORTC =0b11111111;
}
PORTA=fulltext[a];
_delay_us(50);
PORTA=0x80; //biar tidak berbayang
}
a++;
}
}
ISR(TIMER1_COMPA_vect) //vector interupt untuk 1/2 detik
{
detik++; //dibuat 1/2 detik agar mudah menampilkan : kedap kedip
if(detik==120) // 1 menit
{
menit++;
if(menit==60) //1 jam
{
jam++;
if(jam==24)jam=0; // 1 hari
menit=0;
}
detik=0;
}
cleartext();
ubah_angka(jam/10, jam%10, menit/10, menit%10); //tampilkan
}
void init_timer(void)
{
TCCR1B |= (1 << CS11)|(1 << CS10); // Set up counter dengan prescale 64
//Baca datasheet untuk mencari konfigurasi prescaler micro yg sesuai
TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
OCR1A = 7812; // nilai atas dari TCNT1, untuk perhitungan 1 detik
sei(); //hidupkan interupt
}
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
DDRB = 0b11001111; //scaning, PB5 & PB4 sebagai tombol
jam = 10;
menit = 23;
init_timer();
while(1)
{
tulis_text();
//ini untuk pembacaan tombol
if (bit_is_clear(PINB, PINB4)) // membaca tombol jika port input B#4 di clear LOW / 0
{
menit++;
if(menit>=60) menit=0;
_delay_ms(200);
}
if (bit_is_clear(PINB, PINB5)) // membaca tombol jika port input B#5 di clear LOW / 0
{
jam++;
if(jam>=24) jam=0;
_delay_ms(200);
}
}
return 0;
}
Hasil
SELAMAT MENCOBA
.