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 :
#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
.