Anda di halaman 1dari 16

TUGAS JAM DIGITAL

Hansen (13214077)
Deddy Welsan (13214148)
Dosen: Farkhad Ihsan Hariadi
EL3014 Sistem Mikroprosesor
Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

Abstrak yang tepat harus digunakan. Sebagai contoh,


PORTB3 untuk bit nomor 3 pada Port B,
Tugas ini dibuat untuk menggunakan umumnya dituliskan sebagai PORTxn.
fitur timer/counter pada mikrokontroler Register I/O fisik dan lokasi bit tertulis di
ATMega pada board Arduino Uno. Pada halaman 66 data sheet ATMega 8535. [1]
tugas ini, mahasiswa diminta untuk
Terdapat tiga lokasi alamat memori I/O pada
membuat jam digital yang ditampilkan setiap port, masing-masing untuk Data
pada 4 buah 7-segment sehingga hanya Register PORTx, Data Direction Register
akan ditampilkan bagian jam dan menit. DDRx, dan Port Input Pins PINx. Lokasi PIN
Pada jam tertentu, jam digital ini dapat I/O hanya untuk membaca masukan,
memberikan alarm dengan sementara Data Register dan DDR untuk
menggunakan buzzer. Selain itu, membaca atau menulis. Sebagai tambahan,
terdapat fitur stopwatch yang dapat Pull-up Disable PUD di dalam Special
menampilkan menit dan detik. Function Input Output Register SFIOR,
menonaktifkan fungsi pull-up untuk seluruh
Kata kunci: Arduino uno, ATMega328P, pin.
timer/counter, dan interrupt.

1. PENDAHULUAN
Tujuan dari tugas ini secara umum adalah
sebagai berikut.
a. Mahasiswa dapat memberikan input
output pada ATMega
Gambar 2.2 Konfigurasi Pin Port [1]
b. Mahasiswa dapat menggunakan fitur
timer/counter
c. Mahasiswa dapat menggunakan fitur
internal dan eksternal interrupt
Gambar 2.3 PUD pada SFIOR [1]
2. STUDI PUSTAKA
2.2REKOMENDASI UNTUK INISIALISASI PADA
2.1SKEMATIK I/O PIN INPUT
Jika beberapa pin tidak digunakan, sangat
dianjurkan untuk memastikan bahwa pin
tersebut mempunyai tingkat (nilai tegangan)
yang pasti. Bahkan walaupun sebagian besar
masukan digital dimatikan dalam deep sleep
modes, floating input harus dihindari untuk
mengurangi konsumsi arus di semua mode
lain dimana masukan digital diaktifkan
(Reset, Active mode dan Idle mode). [1]
Metode yang paling sederhana untuk
memastikan tingkat tegangan pada pin yang
tidak digunakan adalah dengan mengaktifkan
Gambar 2.1 Skematik I/O [1]
internal pull-up. Dalam kasus ini, pull-up akan
Semua register dan referensi bit pada bagian dinonaktifkan selama reset. Jika konsumsi
ini ditulis dalam bentuk umum. Huruf x daya yang rendah selama reset menjadi hal
merepresentasikan huruf penomoran untuk yang penting, maka dianjurkan untuk
port, dan huruf n merepresentasikan nomor menggunakan pull-up atau pull-down
bit. Ketika menggunakan register atau eksternal. Menghubungkan pin yang tidak
mendefinisikan bit dalam program, bentuk digunakan secara langsung ke Vcc atau GND
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 1
tidak disarankan, karena dapat menyebabkan Gambar 2.7 Compare Output Mode, Non-
arus berlebih jika secara tidak disengaja pin PWM Mode [1]
diatur sebagai keluaran. [1] CS02:0: Clock Select
Ketiga bit Clock Select menentukan sumber
yang digunakan oleh Timer/Counter. [1]

Gambar 2.4 Deskripsi Register PORT


A [1]

2.3KONFIGURASI TIMER/COUNTER DAN Gambar 2.8 Deskripsi Bit Clock Select [1]
INTERRUPT

Gambar 2.9 TCNT0 [1]


Gambar 2.5 TCCR0 [1]

Bit 7 FOC0: Force Output Compare


Bit FOC0 hanya aktif saat bit WGM00 diatur Gambar 2.10 OCR0 [1]
dalam mode non-PWM. Saat logika satu
ditulsikan pada bit ini, maka sebuah
immediate Compare Match akan dipaksakan
pada unit Waveform Generation. Keluaran Gambar 2.11 TIMSK [1]
OC0 berubah berdasarkan pengaturan bit
COM01:0. Bit FOC0 selalu dibaca sebagai nol.
[1]
Gambar 2.12 TIFR [1]
Bit 6, 3 WGM01:0: Waveform Generation
Mode 2.4KONFIGURASI EXTERNAL INTERRUPT

Bit ini mengatur urutan perhitungan counter, Interupsi eksternal dapat dipicu oleh pin
sumber nilai maksimum (TOP), dan tipe INT0, INT1, dan INT2 baik dalam kondisi
waveform generation yang digunakan. falling atau rissing edge, serta low level
Gambar 2.2 menunjukan mode operasi yang (khusus INT2 tidak dapat dipicu oleh low
tersedia. [1] level). Pengaturan kondisi interupsi eksternal
ditentukan oleh spesifikasi pada MCUCR
(Multipoint Control Unit Control Register) dan
MCUCSR (Multipoint Control Unit Control and
Status Register).

Gambar 2.6 Deskripsi Bit Mode Waveform


Generation [1] Gambar 2.13 MCUCR [1]
Bit 5:4 COM01:0: Compare Match Output
Mode
Bit ini mengontrol perilaku pin Output
Compare (OC0). Saat OC0 dihubungkan
dengan pin, fungsi bit COM01:0 bergantung Gambar 2.14 Interrupt 1 Sense Control [1]
pada pengaturan bit WGM01:0. Gambar 2.3
menunjukan fungsi bit COM01:0 saat bit
WGM01:0 diatur dalam mode normal atau
CTC (non-PWM). [1]

Gambar 2.15 Interrupt 0 Sense Control [1]


Pada bit 3 dan 2 MCUCR terdapat bit kontrol
untuk interupsi 1. Sedangkan pada bit 1 dan
0 terdapat bit kontrol untuk interupsi 0.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 2
Sebagai contoh, jika intrupsi eksternal 1 a. 1 buah komputer laptop
diaktifkan pada pin INT1 di GICR, maka nilai b. 1 buah arduino uno
bit 3 dan 2 pada MCUCR akan menjadi c. 1 buah kabel usb a to b
penentu sense control interupsi 1. Misalnya d. 4 buah 7-segment common cathode
bit 3 bernilai 1 dan bit 2 bernilai 0, maka e. Kabel jumper
interupsi 1 pada pin INT1 akan aktif pada f. 1 buah IC 74LS139 (2-to-4 Active Low
saat falling edge. [1] Demux)
g. 5 buah push button
h. 7 buah Resistor 220

Gambar 2.16 MCUCSR [1] 3.2. Metode Pengerjaan

Interpusi 2 akan aktif oleh pin INT2 pada Metode-metode untuk melakukan percobaan
GICR dan kontrol interupsinya akan kali ini adalah sebagai berikut.
ditentukan oleh nilai bit pada ISC2 di
MCUCSR. Jika nilai bit ISC2 bernilai nol, maka Jam Digital
interupsi 2 akan aktif saat pint INT2 berada di
falling edge. Sebaliknya jika bit ISC2 bernilai 1. Buat rangkaian jam digital sesuai dengan skematik pada gambar 4.1.
satu, maka interupsi 2 akan aktif saat INT2
berada di rising edge. [1]
2. Buat kode program dengan menggunakan bahasa C pada perangkat lunak Arduino

Gambar 2.17 GICR [1] 3. Hubungkan board Arduino Uno dengan PC menggunakan kabel usb a to b

General Interrupt Control Register berfungsi


sebagai register yang menyimpan nilai bit
4. Download program ke board Arduino
yang menerima perintah interupsi dari dunia
luar. Pilihan interupsi ditentukan oleh bit 7, 6,
dan 5 dengan konfigurasi berikut. 5. Lakukan simulasi dengan beberapa jenis kondisi dan mode
Bit 7 INT1: External Interrupt Request 1
Enable Gambar 3.1 Langkah Pengerjaan
Bit 6 INT0: External Interrupt Request 0
Enable 4. HASIL DAN ANALISIS
Bit 5 INT1: External Interrupt Request 2 4.1SPESIFIKASI
Enable
Tugas 1 jam digital ini memiliki spesifikasi
sebagai berikut:
1 Memiliki 2 buah mode : mode jam digital
Gambar 2.18 GIFR [1]
(main) dan mode stopwatch (interrupt
Ketika terjadi rising atau falling edge atau event)
perubahan nilai logika pada pin INT (0, 1,
2 Mode jam digital bisa disetting jam dan
atau 2) sebagai tanda adanya perintah
menit
interupsi dari luar, maka bit INTF yang
bersangkutan (0, 1, atau 2) pada General 3 Mode stopwatch dapat direset
Interrupt Flag Register akan diset menjadi
4 I/O terdiri dari 4 buah seven segment
satu. Hal ini membuat MCU melompat pada
common cathode display dan 5 buah
instruksi interupsi. Setelah seluruh instruksi
push button
pada interupsi selesai dijalankan, maka bit
flag akan kembali menjadi nol (dibersihkan). 5 Menggunakan board Arduino UNO
[1] Konfigurasi bit pada GIFR adalah sebagai dengan memanfaatkan fitur timer 0 dan
berikut. 2, serta external intterrupt INT0 dan INT1
Bit 7 INTF1: External Interrupt Flag 1 6 Menggunakan IC 2-to-4 Active Low
Bit 6 INTF0: External Interrupt Flag 0 Demux, 74LS139 untuk chip select
Bit 5 INTF1: External Interrupt Flag 2
4.2SKEMATIK DAN KONFIGURASI PIN
3. METODOLOGI
3.1. Alat dan Komponen yang Digunakan
Beberapa alat dan komponen yang
digunakan dalam praktikum kali ini yaitu

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 3


Gambar 4.1 Skematik Rangkaian Jam Digital
(Proteus)
Konfigurasi Pin
1 Pin 2 dan 3 (pull-up input) dipasang ke
push button to ground untuk eksternal
interrupt INT0 dan INT1 falling edge
2 Pin 6 ke buzzer
3 Pin 7-13 ke A-G seven segment paralel
4 Pin 14 dan 15 masuk ke Chip Select
74LS139
5 Pin 16 , 17, 18 (pull-up input) dipasang
ke push button to ground untuk finish
setting jam, cursor ganti digit, dan Gambar 4.2 Flowchart Utama
tambah digit terpilih

4.3FLOWCHART

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 4


Gambar 4.3 Flowchart Mode Jam Menit

Gambar 4.4 Flowchart Mode Stopwatch

4.3 DETIL DAN KEUNIKAN SISTEM


Sistem yang kami gunakan
menggunakan dua buah timer yaitu
timer 1 dan timer 2, dan dua buah
external interrupt yaitu INT0 dan INT1.
Keunikan dari program kami sbb:
Menggunakan algoritma yang
mengatasi debouncing yang tidak
diinginkan saat mengubah
settingan jam digital. Efek
debouncing adalah ketika switch
ditekan hanya sekali tetapi terjadi
terdeteksi penekanan berkali-kali
yang dapat menyebabkan nilai yang
tidak tepat. Algoritma anti
debouncing adalah dengan
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 5
menggunakan state button jam maupun menit sesuai dengan
sebelumnya dan menggunakan setting program, buzzer berhenti
delay waktu tertentu untuk ketika ada digit yang berbeda
mengambil perubahan state yang
4.4CARA KERJA
mungkin terjadi. Untuk perubahan
state berkali-kali dalam delay Pada awal jam digital ini dijalankan, program
waktu sempit akan diabaikan dan akan masuk ke dalam mode jam, dengan 2
hanya diambil 1 buah perubahan digit pertama menampilkan jam dan 2 digit
terakhir menampilkan menit. Jika tombol 1
pertama.
ditekan, maka mode akan berganti ke mode
Tidak menggunakan library timer stopwatch dan stopwatch akan langsung
arduino, kami membuat setting berjalan. Pada mode stopwatch ini, 3 digit
sendiri timer 1 untuk disetting pertama menampilkan menit, sedangkan 2
menit terakhir menampilkan detik. Jika pada
overflow interrupt setiap 1 detik,
mode stopwatch tombol 2 ditekan, maka
dan timer 2 yang bisa disetting nilai stopwatch akan direset dan perhitungan
delaynya dalam milisecond. kembali mulai dari 0. Jika, tombol 1 ditekan
Detil sistem: lagi, maka program akan kembali ke mode
jam. Selama mode jam, stopwatch tidak
1 Timer 1 digunakan pada mode dapat melanjutkan hitungannya. Sedangkan
normal menggunakan overflow selama mode stopwatch, jam tetap berjalan
interrupt setiap detik menambahkan dan dapat bertambah.
counter jam digital dan stopwatch. Pada mode jam, jika tombol 2 ditekan, maka
2 Timer 2 digunakan pada mode CTC jam akan masuk ke dalam mode setting.
menggunakan compare match Pada mode ini, jika tombol 4 ditekan, maka
kursor akan bergerak dari kiri ke kanan.
interrupt yang akan dibuat dalam
Kursor ditandai dengan intensitas cahaya
fungsi Delay(int x), di mana x adalah yang lebih redup dari lainnya. Digit yang
input pengguna dalam milisecond ditandai dengan kursor menunjukan digit
yang akan masuk ke OCR register yang sedang diatur nilainya. Jika tombol 5
timer 2. ditekan, maka nilai digit yang ditandai oleh
kursor akan bertambah. Jika nilai telah
3 INT0 external interrupt digunakan
overflow, maka nilai kembali ke 0. Jika
untuk memanggil ISR jika falling pengguna telah selesai mengatur waktu
edge untuk mengganti mode jam dengan tepat, pengguna cukup menekan
digital dan stopwatch tombol 3. Program akan kembali ke mode
4 INT1 external interrupt digunakan jam.
untuk memanggil ISR jika falling 4.5PENGUJIAN
edge untuk masuk ke dalam setting
Pada pengujian pertama yang dilakukan
jam (mode 0) dan reset stopwatch kurang lebih 15 jam, didapatkan bahwa jam
(mode 1) digital ini menjadi terlambat selama 1 menit
5 Pada mode setting jam clock timer 1 dari acuan awal. Dari data ini, dapat dihitung
dihentikan, digunakan pengecekan error jam ini untuk tiap menitnya adalah
tombol ganti cursor, add digit, dan 60
finish setting yang menggunakan error= =0,067 detik /menit
15 60
falling edge dengan algoritma anti
debouncing Pada pengujian kedua, dilakukan dari pukul
23.44 s/d 08.30 WIB. Untuk pengujian ini,
6 Pada mode reset stopwatch counter didapatkan bahwa jam digital buatan kami
stopwatch akan diulang dari 1 mengalami delay selama 35 detik. Error
kembali pengujian kedua ini adalah

7 Counter jam digital selalu berjalan 35


error=
walau sedang mode stopwatch, ( 08.3023.44 )
tetapi counter stopwatch tidak
berjalan jika dalam mode jam digital error=0,0678 detik /menit
Kedua pengujian memberikan nilai hasil error
8 Setting buzzer akan berbunyi jika
yang sudah sangat dekat yaitu 0,0674 (rata-
nilai counter jam digital baik digit rata) detik/menit, atau bisa dibuah menjadi
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 6
6,74%. Error sebesar ini sangat signifikan 4 Push button untuk input seringkali
untuk jam digital bila ingin dipasarkan. mengalami debouncing, oleh karena itu
digunakan manipulasi menggunakan delay
Jika dibandingkan dengan salah satu produk
dan state button untuk menghilangkan
jam tangan digital yang memiliki error 30
debouncing
detik/bulan, maka error per menitnya adalah
5 IC 74LS139 active low demux 2-to 4 dapat
30 digunakan untuk chip select hanya
error= =0,000694 detik /menit
30 24 60 menggunakan 2 buah pin untuk memilih 4
chip (dalam hal ini 7 segment common
Dengan kata lain, jam digital buatan kami ini
cathode)
memiliki error 100 kali lebih besar dari jam
digital pasaran. Salah satu faktor yang dapat 6 Display 4 digit 7 segment dapat hanya
menyebabkan error ini adalah ketidaktepatan menggunakan 1 buah bus data 7 bit
nilai clock ATMega328P di board arduino yang dengan menggunakan metode scanning
kami gunakan. Pada spesifikasi dikatakan dalam orde milidetik
ATMega ini memiliki kecepatan clock 16MHz,
namun faktanya clock tersebut mungkin saja DAFTAR PUSTAKA
memiliki kecepatan di bawah 16 MHz.
[1] ATMega8535 Datasheet, Atmel
5. KESIMPULAN Corporation,
2006
Kesimpulan dari tugas 1 ini sbb:
[2] ATMega832P Datasheet, Atmel
1 Board Arduino UNO dapat diprogram
Corporation, 2016
menggunakan bahasa dasar C AVR untuk
mengatur register secara detil ataupun [3] 74LS139 Datasheet
langsung menggunakan bahasa Arduino
yang sudah dipermudah [4] https://www.allaboutcircuits.com/up
loads/articles/Arduino_UNO_R3_Pin
2 Aplikasi delay() pada Arduino UNO
out.jpg
menggunakan Timer0, kita dapat
mengeset Timer1 dan Timer2 dengan
menggunakan setting register AVR
3 External interrupt INT0 dan INT1 terdapat
pada pin 2 dan 3 dapat digunakan sesuai
kebutuhan dengan setting register AVR

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB 7


LAMPIRAN
Kode Program
#include <avr/io.h>
#define F_CPU 16000000UL
#include <avr/interrupt.h>

int counterJam = 0, counterStopwatch = 0;


int buzz = 0, mode = 0, select = 0;
int s0, s1, s2, s3;
int d0 = 0, d1 = 0, m0 = 4, m1 = 4, j1 = 2, j0 = 3;
int statusSetting;
boolean buttonState1 = LOW;
boolean buttonState2 = LOW;

void init_int(void);
void Delay(int t);
void bcd(byte bil);
void init_ext_int(void);
boolean debounceButton(boolean state, int pin);
void setting(int var);

ISR(TIMER1_OVF_vect) // interrupt untuk menambah jumlah jam dan stopwatch


{
if((mode == 1))
{
fStopwatch();;
}
fJamMenitDetik();

TIFR1 = (1<<TOV1);
TCNT1H = 0xC2;
TCNT1L = 0xF6;
}

ISR(INT0_vect) // interrupt untuk mengganti mode


{
if((mode == 0))
{
mode = 1;
}
else if((mode == 1))
{
mode = 0;
}
}

ISR(INT1_vect) // interrupt untuk mengatur jam dan reset stopwatch


{
// mengatur jam
if(mode == 0)
{
TIMSK1 = (0 << TOIE1);
while(statusSetting)
{
if(debounceButton(buttonState1, 17) == HIGH && buttonState1 == LOW)
{
select++;
buttonState1 = HIGH;

if(select >= 4)
{
select = 0;
}
}
else if(debounceButton(buttonState1, 17) == LOW && buttonState1 ==
HIGH)
{
buttonState1 = LOW;
}

if(select == 3)
{
setting(m0);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
m0++;
buttonState2 = HIGH;

if(m0 >= 10)


{
m0 = 0;
}
}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}
else if(select == 2)
{
setting(m1);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
m1++;
buttonState2 = HIGH;

if(m1 >= 6)
{
m1 = 0;
}
}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}
else if(select == 1)
{
setting(j0);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
j0++;
buttonState2 = HIGH;

if(j1 < 2)
{
if(j0 >= 10)
{
j0 = 0;
}
}
else if(j1 = 2)
{
if(j0 >= 4)
{
j0 = 0;
}
}

}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}
else if(select == 0)
{
setting(j1);
if(debounceButton(buttonState2, 18) == HIGH && buttonState2 == LOW)
{
j1++;
buttonState2 = HIGH;

if(j1 >= 3)
{
j1 = 0;
}
}
else if(debounceButton(buttonState2, 18) == LOW && buttonState2 ==
HIGH)
{
buttonState2 = LOW;
}
}

statusSetting = digitalRead(16);
}
TIMSK1 = (1 << TOIE1);
}
//reset stopwatch
else if(mode == 1)
{
counterStopwatch = 0;
s3 = 0;
s2 = 0;
s1 = 0;
}
}

void setup() {
// put your setup code here, to run once:
// decoder
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);

// 7 segment
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

// buzzer
pinMode(6, OUTPUT);

//button
pinMode(2, INPUT); // INT0
pinMode(3, INPUT); // INT1
pinMode(16, INPUT); // finish setting jam
pinMode(17, INPUT); // geser kursor
pinMode(18, INPUT); // tambah

// Input pull-up
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(16, HIGH);
digitalWrite(17, HIGH);
digitalWrite(18, HIGH);

init_int();
init_ext_int();
}

void loop() {
// put your main code here, to run repeatedly:
sei();
statusSetting = digitalRead(16);
if((mode == 0))
{
pJamMenit();
if(j1 == 0 && j0 == 6 && m1 ==0 && m0 == 0)
{
digitalWrite(6, HIGH);
}
else
{
digitalWrite(6, LOW);
}
}
else if((mode == 1))
{
pStopwatch();
}

void pJamMenit(void)
{
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
bcd(m0);
Delay(5);

digitalWrite(14, HIGH);
digitalWrite(15, LOW);
bcd(m1);
Delay(5);

digitalWrite(14, LOW);
digitalWrite(15, HIGH);
bcd(j0);
Delay(5);

digitalWrite(14, LOW);
digitalWrite(15, LOW);
bcd(j1);
Delay(5);
}

void pStopwatch(void)
{
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
bcd(s0);
Delay(5);

digitalWrite(14, HIGH);
digitalWrite(15, LOW);
bcd(s1);
Delay(5);

digitalWrite(14, LOW);
digitalWrite(15, HIGH);
bcd(s2);
Delay(5);

digitalWrite(14, LOW);
digitalWrite(15, LOW);
bcd(s3);
Delay(5);
}

void fStopwatch(void)
{
counterStopwatch++;
s0 = counterStopwatch % 10;
s1 = counterStopwatch / 10;
if (s1 >= 6)
{
s1 = 0;
}
if (counterStopwatch >= 60)
{
counterStopwatch = 0;
s2++;
if (s2 >= 10)
{
s2 = 0;
s3++;
if (s3 >= 6)
{
s3 = 0;
}
}
}
}

void fJamMenitDetik(void)
{
if (buzz == 1)
{
digitalWrite(6, LOW);
buzz = 0;
}

counterJam++;
d0 = counterJam % 10;
d1 = counterJam / 10;
if (d1 == 6)
{
d1 = 0;
}
if (counterJam >= 60)
{
counterJam = 0;
m0++;
if (m0 >= 10)
{
m0 = 0;
m1++;
if (m1 >= 6)
{
m1 = 0;
j0++;
if(j1 < 2)
{
if( j0 >= 10)
{
j0 = 0;
j1++;
}
}
else
{
if( j0 >= 4)
{
j0 = 0;
j1 = 0;
digitalWrite(6,HIGH);
buzz = 1;
}
}
}
}
}
}

void bcd(byte bil)


{
byte D3, D2, D1, D0, A, B, C, D, E, F, G;

D3 = (bil & 0b00001000);


D2 = (bil & 0b00000100);
D1 = (bil & 0b00000010);
D0 = (bil & 0b00000001);

A
= (D3 || !D2 || D1 || D0) && (D3 || D2 || D1 || !D0);
B
= (D3 || !D2 || D1 || !D0) && (D3 || !D2 || !D1 || D0);
C
= D3 || D2 || !D1 || D0;
D
= (D3 || !D2 || D1 || D0) && (D3 || D2 || D1 || !D0) && (D3 || !D2 || !
D1 || !D0);
E = (!D2 && !D1 && !D0) || (D1 && !D0);
F = (D3 || D2 || !D0) && (D3 || D2 || !D1) && (D3 || !D1 || !D0);
G = (D3 || D2 || D1) && (D3 || !D2 || !D1 || !D0);

digitalWrite(7, A);
digitalWrite(8, B);
digitalWrite(9, C);
digitalWrite(10, D);
digitalWrite(11, E);
digitalWrite(12, F);
digitalWrite(13, G);
}

void init_int(void)
{
TIMSK1 = 0b000000;
TIMSK1 = _BV(TOIE1); //mengaktifkan Overflow Interrupt

TCCR1A = 0;
TCCR1B = 0b00001101; //prescalar 1024
TCNT1 = 49910;

sei();

TCCR2A = 0x02;
TCCR2B = 0x07;
TIMSK2 |= (0<<TOIE2);
}

void Delay(int t)
{
TIMSK2 |= (1<<TOIE2);

TCNT2 = 0;

//penentuan nilai compare untuk delay 1 detik


OCR2A = 16000000 / 1024 * t / 1000;

//menunggu hingga compare match, nilai TCNT1 = OCR1A


loop_until_bit_is_set(TIFR2,OCF2A);

//meng-nol-kan flag
TIFR2 |= _BV(OCF2A);

//overflow interrupt disable


TIMSK2 |= _BV(TOIE2);
}

void init_ext_int(void)
{
EICRA = 0x0A;
EIMSK = 0x03;
EIFR = 0x03;
}

boolean debounceButton(boolean state, int pin)


{
boolean stateNow = digitalRead(pin);
if(state != stateNow)
{
delay(10);
stateNow = digitalRead(pin);
}
return stateNow;
}

void setting(int var) // menampilkan kursor


{
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
bcd(m0);
if(select == 3)
Delay(50);
else
Delay(5);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
bcd(m1);
if(select == 2)
Delay(50);
else
Delay(5);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
bcd(j0);
if(select == 1)
Delay(50);
else
Delay(5);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
bcd(j1);
if(select == 0)
Delay(50);
else
Delay(5);
}

Anda mungkin juga menyukai