Bagian Ketiga
Sebagai lanjutan
dari serial tulisanku tentang peraga jadual Sholat, tapi jangan dianggap
seperti sinetron ya, he...he. Sebelumnya sudah dipaparkan mengenai data
informasi jadual sholat pada bagian pertama dan rangkaiannya dengan teknik
peragaan LED 7 segmen secara scanning, maka kali ini dibagian ketiga akan
dilanjutkan mengenai fasilitas KONTROL yang akan dikembangkan untuk pengaturan
waktu.
Tapi sebelumnya aku
akan menampilkan contoh tata letak LED 7 segmen dari tampilan peraga, sekedar
ide saja karena mungkin Sobat memiliki ide lainnya yang lebih disukai.
Gambar di atas
hanya contoh tampilan yang terjadi pada tanggal 14 Agustus 2012, pukul 03:54:27
dini hari. Ada 2 digit permanen yaitu untuk menampilkan bilangan tahun yaitu 20
yang tidak dihasilkan dari keluaran program atau mikrokontroler.
Kita lanjutkan
pembahasan tentang penggunaan CN104 yang berfungsi sebagai kendali
masukan. Konektor ini dapat dihubungkan dengan rangkaian seperti ditunjukkan di
bawah ini:
Gerbang P30
dan P31 dari mikrokontroler dapat dimanfaatkan sebagai sarana
komunikasi dengan PC yang dihubungkan pada port serial RS232. Agar fasilitas
tersebut berfungsi, nanti akan kita rancang bersama program aplikasinya.
Sementara itu
gerbang P32 dan P33 dihubungkan dengan sakelar tekan S101
untuk PRG dan S102 untuk SET yang nanti akan difungsikan sebagai
fasilitas pengaturan waktu dari RTC. Karena kita pasti sama-sama memahami bahwa
informasi waktu dari RTC sangat perlu diatur jika tidak sesuai dengan waktu
sebenarnya.
Kita mulai dari
penggunaan sakelar PRG dan SET sebagai fasilitas pengaturan waktu. Sebelum
membuat atau merancang aplikasinya, terlebih dahulu kita harus menetapkan apa
dan bagaimana fungsi dari kedua sakelar tersebut. Sakelar PRG akan ditetapkan
untuk memilih informasi data waktu yang akan diatur yaitu jam, menit, tanggal,
bulan atau tahun. Sementara sakelar SET untuk mengubah nilai dari informasi
data tersebut.
Cara kerjanya
adalah sebagai berikut:
Pada keadaan
normal, seluruh digit penunjuk waktu baik jam, menit, detik, tanggal, bulan dan
tahun akan ditampilkan seperti gambar di atas. Menekan sakelar PRG akan
diproses oleh mikrokontroler dengan hanya menampilkan menit saja untuk memasuki
mode pengaturan menit. Penekanan sakelar PRG pada kali kedua akan menampilkan
hanya jam saja, penekanan ketiga untuk tanggal, keempat untuk bulan, kelima
untuk tahun dan penekanan keenam akan mengembalikan peraga pada kondisi semula
atau normal.
Pada keadaan
normal, menekan sakelar SET tidak akan diproses dan tidak berpengaruh. Namun
pada mode pengaturan jam, menit, tanggal, bulan atau tahun maka menekan sakelar
SET akan mengusah nilai informasi sesuai posisi mode. Jika pada mode pengaturan
jam maka nilai jam akan dinaikkan. Contoh ketika posisi menit menunjuk 03
seperti di atas, maka menekan SET akan mengubah nilai jam menjadi 04, penekanan
berikutnya menjadi 05 dan seterusnya sampai ditemui waktu jam yang sesuai.
Jika sakelar SET
ditekan dan ditahan maka data akan berotasi ke arah naik dengan kecepatan
kurang lebih setengah detik.
Pengaturan akan
mengubah nilai waktu dengan rentang berdasarkan dengan format yang sesuai,
yaitu:
§ Jam berisi nilai antara 00 sampai 23.
§ Menit berisi nilai antara 00 sampai 59.
§ Pengaturan Tanggal agak kompleks di mana bisa berisi nilai antara 01
sampai 31 (Januari, Maret, Mei, Juli, Agustus, Oktober dan Desember), berisi
nilai 01 sampai 30 (April, Juni, September dan November). Sementara untuk
Februari maka tanggal bisa berisi 01 sampai 29 untuk tahun kabisat dan 01 sampai
28 untuk selain tahun kabisat.
§ Bulan berisi nilai antara 01 sampai 12.
§ Tahun berisi nilai antara 00 sampai 99, namun aku batasi antara 12
sampai 25 saja.
Mode pengaturan
juga akan kita otomatisasi dengan timer di mana jika pada mode tertentu yang
terpilih dan kita tidak melanjutkan penekanan salah satu sakelar baik PRG
maupun SET maka dalam 10 detik mikrokontroler akan mengembalikan posisi program
pada keadaan normal.
Nah, berikut akan
kita buat aplikasinya sebagai tambahan dari aplikasi program yang sudah dibuat
sebelumnya. Pada area konfigurasi kita perlu menambahkan parameter berikut ini:
PB_PRG bit p3.2
PB_SET bit p3.3
BitMenu bit RegBit.3
Kemudian pada rutin
Periksa_Waktu baris perintah “JNB PB_PRG, Menu_PRG” akan disisipkan seperti
diperlihatkan berikut ini:
Periksa_Waktu:
jnb PB_PRG,
Menu_Waktu
djnz r5,
Periksa_Detik
mov r5,
#255
--- dst ---
Baris perintah
pertama di atas untuk memeriksa status masukan dari sakelar S101
PRG. Jika ditekan maka logika masukan gerbang akan menjadi rendah dan program
akan menjalankan rutin berikut:
Menu_Waktu:
mov r2,
#0
Untuk program pengaturan, kita akan menggunakan register R2
untuk status menu yang dipilih. Register lainnya yang digunakan adalah Register
B, R0 dan R1. Setiap kali rutin Menu_Jam dijalankan maka nilai register R2 akan
bertambah untuk menentukan menu yang akan dikerjakan. Isi register R0, R1 dan
register B akan digunakan pada program menu.
Menu_Jam:
inc r2
cjne r2, #1, Menu_Menit
mov r1, #BufDisplay
mov r0, #BufWaktu+2
mov b, #23h
ajmp Prog_Menu
Menu_Menit:
cjne r2, #2, Menu_Tanggal
mov r1, #BufDisplay+2
mov r0, #BufWaktu+1
mov b, #59h
ajmp Prog_Menu
Khusus untuk Menu_Tanggal, maka nilai register B perlu dilakukan
verifikasi karena perbedaan jumlah hari dalam setiap bulan termasuk adanya
tahun kabisat. BitMenu juga akan diset menjadi tinggi untuk keperluan penetapan
nilai tersendah saat rotasi data.
Menu_Tanggal:
cjne r2, #3, Menu_Bulan
setb BitMenu
mov r1, #BufDisplay+6
mov r0, #BufWaktu+4
acall Bulan_01
ajmp Prog_Menu
Menu_Bulan:
cjne r2, #4, Menu_Tahun
mov r1, #BufDisplay+8
mov r0, #BufWaktu+5
mov b, #12h
ajmp Prog_Menu
Menu_Tahun:
cjne r2, #5, Menu_Selesai
mov r1, #BufDisplay+10
mov r0, #BufWaktu+6
mov b, #25h
Setelah penetapan salah satu dari 5 mode pengaturan di atas,
selanjutnya aplikasi menu akan diproses. Hal pertama yang akan diproses adalah
memanggil subrutin Display_Menu. Kemudian menyiapkan register R3, R6 dan R7
untuk penundaan kira-kira selama 10 detik melalui rutin Reset_Mnu2. Status PB_PRG
dan PB_SET diperiksa pada rutin Prog_Mnu1, jika keduanya bernilai tinggi yang
berarti baik sakelar PRG maupun SET tidak ditekan maka delay akan berjalan.
Prog_Menu:
acall Display_Menu
jnb PB_PRG, $
Reset_Mnu1:
mov r3, #36
mov r6, #255
mov r7, #255
Reset_Mnu2:
djnz r7, Prog_Mnu1
mov r7, #255
djnz r6, Prog_Mnu1
mov r6, #255
djnz r3, Prog_Mnu1
ajmp Periksa_Waktu
Prog_Mnu1:
jnb PB_PRG, Menu_Jam
jb PB_SET, Reset_Mnu2
mov r3, #14
mov r6,
#255
mov r7, #255
Register R3, R6 dan R7 juga digunakan untuk pengaturan secara
otomatis nilai informasi waktu jika PB_SET rendah secara terus menerus atau
ditahan. Kecepatan rotas kurang lebih per-setengah detik. Contoh untuk menu Jam
maka nilai akan berubah dari 0 sampai 23 kemudian kembali lagi ke 0 dan
seterusnya. Proses rotasi data dilakukan pada subrutin Ubah_Waktu.
Prog_Mnu2:
acall Ubah_Waktu
Prog_Mnu3:
jb PB_SET, Reset_Mnu1
djnz r7, Prog_Mnu3
mov r7, #255
djnz r6, Prog_Mnu3
mov r6, #255
djnz r3, Prog_Mnu3
mov r3, #3
ajmp Prog_Mnu2
Menu_Selesai:
cjne r2, #6, Menu_Kembali
clr BitMenu
ajmp Periksa_Waktu
Menu_Kembali:
ajmp Menu_Jam
Seperti kita ketahui bahwa jumlah hari dalam 1 bulan tidak sama ada
yang berjumlah 31 dan 30, sementara bulan februari bahkan 28 hari dan pada
tahun kabisat menjadi 29. Subrutin berikut menetapkan nilai tanggal sesuai
dengan bulan dan tahun yang bersesuaian.
Mula-mula nilai akumulator digunakan untuk menyimpan informasi
bulan. Kecuali bulan Februari maka setiap bulan akan dibandingkan untuk
menentukan jumlah hari 30 dan 31.
Bulan_01:
mov a, BufWaktu+5
cjne a, #1, Bln03
ajmp Hari31
Bln03:
cjne a,
#3, Bln04
ajmp Hari31
Bln04:
cjne a,
#4, Bln05
ajmp Hari30
Bln05:
cjne a,
#5, Bln06
ajmp Hari31
Bln06:
cjne a,
#6, Bln07
ajmp Hari30
Bln07:
cjne a,
#7, Bln08
ajmp Hari31
Bln08:
cjne a,
#8, Bln09
ajmp Hari31
Bln09:
cjne a,
#9, Bln10
ajmp Hari30
Bln10:
cjne a,
#10h, Bln11
ajmp Hari31
Bln11:
cjne a,
#11h, Bln12
Hari30:
mov b,
#30h
ret
Bln11:
cjne a,
#12h, Bln02
Hari31:
mov b,
#31h
ret
Untuk bulan Februari, giliran register B yang digunakan untuk
menyimpan informasi tahun. Register R3 dan akumulator digunakan untuk melacak
tahun. Sepintas register R3 dan akumulator sepertinya mirip namun informasi
yang disimpan sesungguhnya berbeda dimana register R3 untuk nilai dalam
bilangan biner sementara akumulator dalam format BCD sesuai dengan format yang
disimpan pada register B.
Bln02:
mov b, BufWaktu+6
clr a
mov r3, #0
Tahun kabisat adalah jumlah tahun yang habis jika dibagi dengan
4. Untuk menghindari pembagian bilangan 0 maka jumlah tahun dalam biner yang
disimpan oleh register R3 akan ditambahkan dengan 4. Setelah nilai minimal dari
akumulator adalah 4 kemudian dilakukan pembagian dengan 4. Jika sisa pembagian
pada register B bernilai 0 berarti merupakan tahun kabisat.
Thn1: cjne a,
b, Thn2
mov a, r3
mov b, #4
add a, b
div ab
xch a, b
jz Kabisat
mov b, #28h
ret
Kabisat:
mov b, #29h
ret
Thn2: inc r3
mov a, r3
clr ac
clr c
da a
ajmp Thn1
Pengaturan data waktu terbagi menjadi 2 bagian dalam penentuan
nilai terendah saat reset di mana untuk jam dan menit adalah 0. Sementara untuk
tanggal dan bulan adalah 1. Pemilihan tersebut ditentukan oleh nilai dari
BitMenu. Khusus untuk tahun maka aku sengaja sisipkan pembatasan minimal saat
rotasi adalah 12.
Ubah_Waktu:
jb BitMenu, Ubah_Wkt1
mov a, @r0
cjne a, b, Ubah_Wkt2
mov a, #0
ajmp Ubah_Wkt2
Ubah_Wkt1:
mov a, @r0
cjne a, b, Ubah_Wkt2
mov a, #1
cjne r2, #6, Ubah_Wkt2
mov a, #12h
Ubah_Wkt2:
inc a
clr ac
clr c
da a
mov @r0, a
push b
mov a, r0
clr c
subb a, #BufWaktu
xch a, b
mov a, #1
acall DS1307_Write
pop b
acall Display_Menu
ret
Tampilan menu
berbeda dengan saat normal di mana hanya informasi waktu yang akan diatur saja
yang akan ditampilkan pada LED 7 segmen. Untuk itu seluruh data digit akan
dibersihkan dengan mengisi masing-masing dengan data 255 atau FFH sehingga akan
menyebabkan seluruh LED 7 segmen padam. Setelah seluruh LED padam maka hanya
informasi waktu yang akan diatur saja yang akan ditampilkan pada subrutin
Display_Prog.
Display_Menu:
push b
push 01h
push 0h
mov r7, #18
mov r0, #BufDisplay
Bersihkan_Digit:
mov @r0, #255
inc r0
djnz r7, Bersihkan_Digit
pop 0h
Display_Prog:
mov a, @r0
acall Display_BCD
pop 01h
pop b
ret
Sampai di sini
aplikasi program menu pengaturan untuk perangkat Peraga Jadual Sholat sudah
selesai. Perangkat sudah dilengkapi dengan mode pengaturan untuk mengubah
informasi agar sesuai.
Sudah ya, terima
kasih sudah membaca artikel aku. Semoga bermanfaat dan bisa diterapkan oleh
sobat semua.
Salam....