Translate

Modul Aplikasi Konversi Bilangan Heksadesimal Ke Bilangan Desimal Pada Keluarga MCS 51



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