- Input tetap berupa tombol, posisi di PIN B#1.
- 7 segmen dihubungkan pada output PORT D#0 sampai D#6.
- Tiap segmen dihubungkan dengan kondisi nyala mati sedemikian rupa sehingga menampilkan digit angka 0,1,2,3,4,5,6,7,8,9 .
- Tiap digit desimal segmen di masukkan kedalam Array Segmen[10] yang isinya susunan segmen penyusun digit dan kemudian ditampilkan sesuai variabel angka.
- Ketika ada penekanan tombol maka variabel angka akan increment / nambah sampai kondisi angka >9 di reset kembali menjadi 0.
#define F_CPU 1000000UL // frekuensi clock internal 1Mhz #include <avr/io.h> // definisi library standar IO port #include <util/delay.h> // definisi include untuk delay //susunan segmen dari portD = GFEDCBA //7 segmen common ANODA uint8_t segmen[10]= {0b1000000, // 0 0b1111001, // 1 0b0100100, // 2 0b0110000, // 3 0b0011001, // 4 0b0010010, // 5 0b0000010, // 6 0b1111000, // 7 0b0000000, // 8 0b0010000}; // 9 int main(void) { DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ; // 7 seg DDRB &= ~(1<<PB1); //tombol uint8_t a =0; while (1) { if(bit_is_set(PINB,PINB1)) { a++; if(a==10) a=0; _delay_ms(300); } PORTD = segmen[a]; //Tampilkan segmen
} }
- Hal yang mungkin cukup spesial adalah array segmen[10] dengan 10 buah anggota, yang merupakan susunan segmen yang jumlahnya 7, sehingga sedemikian rupa untuk menampilkan digit 6, maka PORT D#0, D#2, D#3, D#4, D#5, D#6 diberikan logika 0 (ingat komonnya anoda /positif) sehingga segmen ini menyala. Sedangkan PORT D#1 diberikan logika HIGH (5 volt ) alias sama dengan commonnya dan menyebabkan LED segmennya mati.
- Saat ada penekanan tombol pada PIN B#1 maka variabel angka akan berubah dan PORTD nilainya diubah sesuai angka binary yang diwakilkan oleh array segmen[angka], yang artinya jika angka bernilai 6, maka PORTD bernilai 0b0000010.
#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay
//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA
uint8_t segmen[10]= {0b1000000, // 0
0b1111001, // 1
0b0100100, // 2
0b0110000, // 3
0b0011001, // 4
0b0010010, // 5
0b0000010, // 6
0b1111000, // 7
0b0000000, // 8
0b0010000}; // 9
int main(void)
{
DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ;
DDRB |= (1<<PB0); //led
DDRB &= ~(1<<PB1); //tombol
uint8_t angka;
while (1)
{
for(angka=0 ; angka<10 ; angka++){
PORTD=segmen[angka];
_delay_ms(1000);
}
if(bit_is_set(PINB,PINB1)) PORTB |=(1<<PB0);
else PORTB &= ~(1<<PB0);
}
}
- Loop for(angka=0 ; angka<10 ; angka++) merupakan cara untuk melakukan pengulangan dan penambahan variabel angka secara satu persatu dari 0 sampai nilai maksimum 9.
- Delay 1000 mili second diberikan setiap loop for dan ini merupakan blocking delay atau menghentikan semua jalannya program mikrokontroller selama 1 detik.
- Perintah dibawah loop For merupakan proses menunggu penekanan tombol dan perubahan LED pada Port B#0, dan karena terjadi blocking delay, maka penekanan tombol kadang tidak terbaca seperti animasi berikut.
- Untuk mengatasi blocking delay maka dapat memanfaatkan fasilitas timer pada microcontroller.
#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay
#include <avr/interrupt.h> // library interupt timer
//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA
uint8_t segmen[10]= {0b1000000, // 0
0b1111001, // 1
0b0100100, // 2
0b0110000, // 3
0b0011001, // 4
0b0010010, // 5
0b0000010, // 6
0b1111000, // 7
0b0000000, // 8
0b0010000}; // 9
uint8_t angka=0;
ISR(TIMER1_COMPA_vect) // interupt jalan independen tiap selang 1 detik
{
PORTD = segmen[angka];
angka++;
if(angka==10) angka=0;
}
int main(void)
{
DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ;
DDRB |= (1<<PB0);
DDRB &= ~(1<<PB1);
TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
OCR1A = 15625; //compare the CTC A for 1 second
TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
sei(); //mulai membaca interupt
while (1)
{
//penekanan tombol
if(bit_is_set(PINB,PINB1)) PORTB |=(1<<PB0);
else PORTB &= ~(1<<PB0);
}
}
- Mikrokontroler memiliki fasilitas counter & timer internal, dan akan berjalan secara independen.
- Tiap tick/clock akan diatur sedemikian rupa sehingga counter didalamnya dapat melakukan delay sesuai nilai yang ditentukan, semisal contoh diatas tiap 1 detik atau clock counter 15625 maka akan men-trigger fungsi interupt ISR(TIMER1_COMPA_vect).
- Hasilnya pada loop utama saat penekanan tombol tidak akan terpengaruh seperti pada animasi berikut ini.