Kali ini kita membahas
soal bilangan. Dalam teknik digital kita mengenal beberapa jenis format
bilangan antara lain biner (binary), oktal dan heksadesimal (hexadecimal).
Sementara kita biasa menghitung dan familier dengan bentuk bilangan desimal. Di
sini aku tidak akan menjelaskan kepada sobat tentang bilangan biner dan oktal
tetapi hanya mengenai bilangan heksadesimal dan desimal itu pun tidak secara
terinci.
Bilangan heksadesimal terdiri
dari 16 hitungan dimulai dari 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, A, B, C, D, E dan F. Sementara bilangan desimal terdiri
dari 10 dimulai dari 0, 1, 2, 3, 4, 5, 6, 7, 8 dan 9. Sebagai contoh bilangan
heksa F sepadan dengan desimal angka 15.
Penjelasan secara rinci
mungkin akan dibahas pada kesempatan lain yang khusus mengenai
bilangan-bilangan dalam teknik digital. Aku anggap sobat semua sudah paham
perbedaan antara bilangan heksa dan bilangan desimal.
Berikut adalah aplikasi
mnemonic dari konverter bilangan heksa ke bilangan desimal yang ditulis sesuai
untuk mikrokontroler dalam rumpun MCS 51. Modul aplikasi ini berkaitan dengan
postingan lainnya tentang Membaca Kartu RFID FormatWiegand 26 Bit Pada Accessibility Option Di Microsoft Windows dan Modul Aplikasi Wiegand 26 Bit Pada Keluarga MCS 51.
Sobat bisa klik link tersebut untuk melihatnya. Dengan modul ini aku akan
menjelaskan konversi bilangan heksa 51 A5 EAH sebagai contohnya.
;Accumulator => Jumlah Byte dikonversi
;Register R1 => Alamat Hasil Konversi
;Register R0 => Alamat Bilangan
Heksadesimal
Hex2Dec:
push acc
mov r7, #8
H2DClearReg1:
mov @r1, #0
inc r1
djnz r7, H2DClearReg1
mov b, r1
push b
Tiga baris pertama adalah
keterangan mengenai register yang berpengaruh dalam modul yaitu akumulator,
register R1 dan R0. Dalam contoh ini isi bilangan heksa adalah 51 A5 EAH. Kemudian
nama alamat untuk memanggil sub rutin ini adalah Hex2Dec. Perintah pertama yang
dilaksanakan adalah menyimpan isi register akumulator ke register SP dengan
perintah PUSH. Baris perintah berikutnya adalah menetapkan banyaknya loop
dengan register R7 sebanyak 8 yang akan dilaksanakan pada 3 baris berikutnya.
Baris-baris perintah loop
di atas adalah untuk membersih isi register alamat hasil konversi yang nanti
akan dilaksanakan dimulai dengan mengosong data pada alamat awal yang
dinyatakan dalam register R0. Setelah data pada alamat tersebut kosong maka
menuju ke alamat berikutnya dengan menaikkan isi register R0. Perintah DJNZ
akan menyebabkan perintah-perintah pada H2DclearReg1 dijalankan sebanyak 8 kali
sesuai isi register R7. Isi register R1 sekarang adalah 0FH. Isi buffer hasil
konversi 0BH, 0CH, 0DH, 0EH, 0FH, 10H, 11H dan 12H adalah 00 00 00 00 00 00 00
00H.
Perintah berikutnya adalah
menyalin isi register R1 ke register B kemudian menyimpannya ke register SP
dengan perintah PUSH.
clr cy
clr ac
mov a, @r0
anl a, #0fh
jz LSB1B
mov r7, a
LSB1A:
pop b
mov r1, b
push b ;Kelipatan 1
mov a, @r1
inc a
acall H2DConvert
acall H2DConvert
djnz r7, LSB1A
Program dilanjutkan dengan
perintah me-reset bit Carry (CY) dan bit AC (Auxiliary Carry). Perintah
selanjutnya mengambil data pada alamat sesuai register R0 ke akumulator yang
merupakan LSB dari data heksadesimal yang akan dikonversi dari contoh adalah EAH.
Kemudian mengambil nibel LSB dari akumulator menggunakan perintah AND dengan
0FH. Jika isi akumulator kosong maka program akan melompat ke alamat LSB1B.
Sesuai contoh isi akumulator
tidak kosong karena berisi 0AH dan perintah selanjutnya menetapkan banyaknya
loop sesuai nilai dari akumulator yaitu 0AH atau 10 dengan memindahkannya ke
register R7 kemudian menjalankan perintah loop pada alamat LSB1A.
Pada alamat LSB1A,
perintah pertama yang dilaksanakan adalah mengeluarkan isi register SP dan
memindahkannya ke register B dengan perintah POP. Kemudian menyalinnya kembali
ke register R1 dan menyimpan kembali isi register B dengan perintah PUSH.
Selanjutnya mengambil data
dari alamat dalam register R1 ke akumulator. Kemudian sebelum dikonversi
ditambahkan dengan 1 menggunakan perintah INC. Awalnya isi akumulator adalah
00H dan sekarang berisi 01H. Setelah itu memanggil sub rutin H2Dconvert
sebanyak 2 kali berturut-turut untuk mengkonversikan 2 byte LSB dari buffer
hasil konversi yaitu alamat 11H dan 12H karena setiap pemanggilan sub rutin
H2Dconvert maka isi register R1 berkurang 1.
Untuk lebih jelas dapat
melihat ke sub rutin H2Dconvert di bagian bawah postingan ini.
Dengan perintah DJNZ maka
perintah-perintah mulai dari LSB1A dilaksanakan sebanyak 10 kali. Hasil akhir
yang diapat pada buffer hasil konversi berturut-turut
adalah 00H, 00H, 00H, 00H, 00H, 00H, 01H dan 00H.
Dari uraian di atas maka
LSB1A adalah rutin yang menjumlahkan dalam kelipatan 1 dari nibel LSB data pada
byte pertama dihitung dari akhir atau LSB.
LSB1B:
mov a, @r0
swap a
anl a, #0fh
jz MSB1B
mov r7, a
MSB1A:
pop b
mov r1, b
push b ;Kelipatan 16
mov a, @r1
add a, #6
acall H2DConvert
add a, #1
acall H2DConvert
acall H2DConvert
djnz r7, MSB1A
MSB1B:
pop b
pop acc
djnz acc, H2DByte2
ret
Perintah yang dimulai dari
alamat LSB1B hampir sama dengan LSB1A hanya yang akan diproses adalah nibel MSB
dari data maka dilakukan perintah SWAP sebelum memeriksa dengan logika AND
dengan data 0FH. Karena isi buffer LSB data heksa adalah EAH maka akumulator
kini berisi 0EH atau 14 yang juga merupakan banyaknya loop pengulangan.
Kemudian setelah
me-refresh register R1 dimulai dari alamat MSB1A maka perintah selanjutnya
adalah menambahkan isi akumulator dengan 6 dilanjutkan dengan memanggil sub
rutin H2Dconvert untuk mengkonversi alamat hasil 12H. Register R1 sekarang
sudah menunjuk 11H.
Berikutnya menambahkan
akumulator dengan 1 kemudian memanggil sub rutin H2Dconvert sebanyak 2 kali
berturut-turut untuk mengkonversi buffer hasil 10H dan 11H.
Perintah-perintah dari
alamat MSB1A diulang sebanyak 14 kali dengan perintah DJNZ sehingga hasil akhir
konversi adalah 00H, 00H, 00H, 00H, 00H, 02H, 03H dan 04H. Ini sesuai dengan
nilai EAH yang sepadan dengan desimal 234.
Perintah terakhir dari sub
rutin yang mengkonversi dalam kelipatan 16 dari alamat LSB1B mengeluarkan isi
register SP untuk disalin ke register B yang berisi alamat hasil konversi dan
berikutnya ke akumulator yang berisi jumlah byte yang akan dikonversi. Maka
karena isi akumulator adalah perintah DJNZ akan memerintahkan program melompat
ke H2Dbyte2 dan melewatkan perintah RET.
H2DByte2:
push acc
push b
dec r0
mov a, @r0
anl a, #0fh
jz LSB2B
mov r7, a
LSB2A:
pop b
mov r1, b
push b
mov a, @r1 ;Kelipatan 256
add
a, #6
acall H2DConvert
add a, #5
acall H2DConvert
add a, #2
acall H2DConvert
acall H2DConvert
djnz r7, LSB2A
LSB2B:
mov a, @r0
swap a
anl a, #0fh
jz MSB2B
mov r7, a
MSB2A:
pop b
mov r1, b
push b
mov a, @r1 ;Kelipatan 4096
add a, #6
acall H2DConvert
add a, #9
acall H2DConvert
acall H2DConvert
add a, #4
acall H2DConvert
acall H2DConvert
djnz r7, MSB2A
MSB2B:
pop b
pop acc
djnz acc, H2DByte3
ret
Alamat H2Dbyte2 berisi
perintah untuk melaksanakan konversi byte ke-2 dari bilangan heksa yaitu A5H
tepatnya nibel LSB-nya yaitu 05H. Dilanjutkan dengan LSB2A untuk melaksanakan
perintah penjumlahan dengan kelipatan 256. Karena sub rutin H2Dconvert
menyebabkan nilai register R1 berkurang 1 maka dapat dijelaskan bahwa buffer hasil
kalkukasi akan ditambah dengan urutan alamat 12H dengan penambahan 6, 11H
dengan 5, 10H dengan 2 dan 0FH merupakan konversi untuk hasil lebih. Sampai di
sini isi buffer hasil kalkulasi menjadi 00H, 00H, 00H, 00H, 01H, 05H, 01H dan 04H
setara dengan 5EAH atau 1514.
Kemudian alamat LSB2B
adalah perintah konversi MSB dari byte ke-2 dari bilangan heksa A5H yaitu
menjadi 0AH dengan perintah SWAP. Dilanjutkan ke MSB2A dengan menambah isi
buffer hasil kalkulasi dengan kelipatan 4096 dengan pemanggilan subrutin
H2Dconvert sebanyak 5 kali. Setelap loop ke MSB2A sebanyak 0AH atau 10 kali
maka hasil akhirnya adalah 00H, 00H, 00H, 04H, 02H, 04H, 07H, 04H atau setara
dengan 42474. Ini sesuai dengan nilai konversi 2 byte dari A5EAH. Karena kita
hanya mengkonversi 2 byte maka pada perintah-perintah di bawah MSB2B aplikasi
akan keluar.
Versi awal dari modul konverter
ini sebenarnya mampu mengknversikan sampai dengan 3 byte. Maka
perintah-perintah selanjutnya seperti diuraikan di bawah ini.
H2DByte3:
push acc
push b
dec r0
mov a, @r0
anl a, #0fh
jz LSB3B
mov r7, a
LSB3A:
pop b
mov r1, b
push b
mov a, @r1 ;Kelipatan 65536
add a, #6
acall H2DConvert
add a, #3
acall H2DConvert
add a, #5
acall H2DConvert
add a, #5
acall H2DConvert
add a, #6
acall H2DConvert
acall
H2DConvert
djnz r7, LSB3A
LSB3B:
mov a, @r0
swap a
anl a, #0fh
jz MSB3B
mov r7, a
MSB3A:
pop b
mov r1, b
push b
mov a, @r1 ;Kelipatan 1048576
add a, #6
acall H2DConvert
add a, #7
acall H2DConvert
add a, #5
acall H2DConvert
add a, #8
acall H2DConvert
add a, #4
acall H2DConvert
acall
H2DConvert
add a, #1
acall H2DConvert
acall H2DConvert
djnz r7, MSB3A
MSB3B:
pop b
pop acc
ret
Perintah-perintah yang
dimulai dari H2Dbyte3 dan seterusnya ke bawah hingga MSB3B adalah untuk
perhitungan byte MSB. Jika ini dijalankan maka data heksa 51 A5 EA akan
dikonversi menjadi 5.350.890 dan maksimalnya adalah FF FF FF menjadi 16.777.215.
Selanjutnya kita bahas sub
rutin H2Dconvert seperti di bawah ini.
H2DConvert:
da a
push acc
anl a, #0fh
mov @r1, a
pop acc
anl a, #0f0h
swap a
mov b,a
dec r1
mov a, @r1
add a, b
da a
ret
Sub rutin ini pertama kali
menjalankan perintah DA atau mengkonversi akumulator menjadi desimal. Kemudian
menyimpan nilai hasil konversi dalam register SP. Nilai akumulator diambil
nibel LSB-nya dengan perintah logika AND yaitu 0FH dan mengisikan hasil tersebut
ke register R1 yang merupakan alamat buffer hasil konversi. Kemudian nilai
akumulator semula yang disimpan dalam register SP diambil kembali dan diambil
nibel MSB-nya dengan perintah AND kemudian menukar isi nibel dengan perintah
SWAP. Hasil pemindahan nibel di akumulator didalin ke register B. Dengan
perintah DEC untuk mengurangi register R1, selanjutnya alamat dari register R1
diisikan ke akumulator. Kemudian nilai akumulator tersebut ditambahkan dengan
nilai dari register B. Sub rutin diakhiri dengan mengkonversi akumulator
menjadi desimal.
Catatan: Aplikasi konversi
3 byte ini bekerja berdasarkan penambahan dalam nibel sesuai dengan urutan
bilangan heksa yang 16 yaitu 0 sampai F atau dalam biner 0000 sampai 1111 yang
berjumlah 4 bit. Maka kelipatan yang digunakan adalah bersesuaian dengan
kelipatan perkalian 16 dari nibel dengan
urutan 1, 16, 256, 4096, 65536 dan 1048576.
Jika sobat ingin mencoba
dengan jumlah byte yang lebih panjang maka hanya perlu mengalikan setiap nibel
dari byte dengan kelipatan perkalian 16 saja. Contoh diurut dari LSB: byte 1
dengan 1 dan 16, byte 2 dengan 256 dan 4.096, byte 3 dengan 65.536 dan 1.048.576,
byte 4 dengan 16.777.216 dan 268.435.456 dan seterusnya ....
Udah ya, makasih udah baca
postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat
semua. Selamat mencoba ....
Salam....
Tidak ada komentar:
Posting Komentar