Sebenarnya membuat aplikasi pencacah naik-turun (up-down counter) menggunakan AT89 adalah hal yang aneh dalam dunia elektronika digital. Lho kok? La ya… lha wong tinggal pake rangkaian dengan IC TTL (seri 74LS) saja sudah bisa, kok ini pake programming mikrokontroler segala… Lha kalo untuk belajar pemrograman mikrokontroler gimana? O ya silahkan saja… itu jadi gak aneh lagi… he he he…
Oke gak apa-apa, yang penting kali ini kita belajar bagaimana membuat pencacah naik turun menggunakan mikrokontroler seri AT89C atau AT89S. Perhatikan rangkaiannya terlebih dahulu…
Mmmm gak ada yang aneh khan? Biasa-biasa saja, tombol pushbutton digunakan untuk memberi picuan atau detak (clock) untuk melakukan pencacahan naik (P3.2 atau ~INT0) atau pencacahan turun (P3.3 atau ~INT1). Dengan demikian kita juga sekaligus belajar memanfaatkan fasilitas interupsi di AT89.
Baik, program kita awali dengan menentukan alamat seperti biasa di lokasi 0h, dilanjutkan dengan lompatan ke label “utama” (ljmp utama):
org 0h
ljmp utama
Kemudian dilanjutkan dengan mendefinisikan vektor atau lokasi interupsi INT0 dan INT1. Untuk interupsi-0 (INT0) kita isikan lompatan ke label “cacah_naik”. Lho kok gak pake ORG? ya karena instruksi sebelumnya (ljmp utama) berukuran 3 byte (menempati lokasi 0, 1, dan 2), sedangkan vektor interupsi INT0 harus dituliskan mulai lokasi 3 dan itu pas dengan instruksi pertama, jadi gak perlu pake ORG. Sedangkan untuk INT1 tetap harus menggunakan ORG 13h (instruksi ljmp cacah_turun):
ljmp cacah_naik org 13h ljmp cacah_turun
Instruksi-instruksi berikutnya adalah melakukan inisialisasi data angka yang akan ditampilkan di 7-segmen (pada lokasi yang ditandai dengan label “numerik“), sedangkan lokasi program utama mulai alamat 30h:
org 30h
utama:
mov dptr, #numerik
Kemudian persiapan akumulator A, data pertama juga ditempatkan ke A, tampilkan ke 7-segmen yang terhubung dengan P0, dan jangan lupa ada sebuah register, R0, yang digunakan untuk menyimpan indeks data (mengapa? Karena untuk cacah turun tidak ada perintah DEC atau penurunan pada DPTR, dalam hal ini data menggunakan register DPTR):
clr a
movc a, @a+dptr
mov p0, a
mov r0, #0
Nah, sekarang inisialisasi interupsi, eksternal-0 (INT0), eksternal-1 (INT1), aktivasi interupsi global (EA), aktifkan interupsi aktif low pada IT0 dan IT1:
setb ex0
setb ex1
setb ea
setb it0
setb it1
Dan seperti biasa, lompat ditempat:
sjmp $
Baiklah, sekarang apa yang terjadi jika terjadi penekanan tombol pada INT0? Ya betul! Terjadilah interupsi eksternal-0, label apa yang dijalankan? Ya tepat! Label “cacah_naik” yang dijalankan. Pertama nilai R0 dinaikkan (untuk indeks data berikutnya), kemudian bandingkan dengan nilai #10 (apakah R0 = 10, artinya data sudah semuanya), jika belum maka lompat ke label “tampil”, namun jika R0=10, maka R0 dibuat sama dengan 9, selesai interupsi:
cacah_naik:
inc r0
cjne r0, #10, tampil
mov r0, #9
reti
Begitu juga saat interupsi eksternal-1 (INT1) yang terjadi, maka mikrokontroler akan mengerjakan label “cacah_turun”. Pertama nilai R0 dikurangi satu, kemudian dibandingkan datanya apakah sama dengan 255, lho kok? Setelah R0=0 kemudian ada instruksi untuk mengurangi satu, maka akan kembali ke nilai terbesar yaitu 255, hal ini diistilahkan dengan warping. Jika sama, maka nilai R0 dipertahankan agar sama dengan 0. Kalo belum sama ya data ditampilkan saja:
cacah_turun:
dec r0
cjne r0, #255, tampil
mov r0, #0
reti
Untuk masalah tampilan ke 7-segmen adalah masalah gampang! Simpan lokasi data yang sudah siap ke akumulator A, kemudian lakukan penyalinan data ke A menggunakan MOVC dan tampilkan ke 7-segmen yang terhubungkan melalui port-0, selesai:
tampil:
mov a, r0
movc a, @a+dptr
mov p0, a
reti
Program selengkapnya sebagai berikut:
——————————————————————————-
org 0h
ljmp utama
ljmp cacah_naik
org 13h
ljmp cacah_turun
org 30h
utama:
mov dptr, #numerik
clr a
movc a, @a+dptr
mov p0, a
mov r0, #0
;
;mov ie, #85h ; <- bisa juga aktivasi INT pake yang singkat begini
setb ex0
setb ex1
setb ea
setb it0
setb it1
sjmp $
;
cacah_naik:
inc r0
cjne r0, #10, tampil
mov r0, #9
reti
;
cacah_turun:
dec r0
cjne r0, #255, tampil
mov r0, #0
reti
;
tampil:
mov a, r0
movc a, @a+dptr
mov p0, a
reti
;
numerik:
DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h
end
——————————————————————————-
Semoga bermanfaat!