Pemrograman Logika dan Perintah-perintahnya

BAB 7

Sasaran

 

Setelah anda menamatkan bab ini , diharapkan anda dapat :

ð          Menjelaskan tabel kebenaran untuk fungsi logika AND, OR, XOR.

ð          Membuat kode Assembler 8051 dengan instruksi fungsi logika.

ð          Menggunakan instruksi fungsi logika 8051 untuk memanipulasi bit.

ð          Menggunakan instruksi compare dan jump untuk kontrol program.

ð          Membuat kode 8051 dengan instruksi rotasi dan swap

ð          Membuat program 8051 untuk konversi data ASCII dan BCD.

 

 

Mempelajari instruksi logika adalah topik utama pada BAB ini.

Pada SubBAB 7.1, kita akan membahas instruksi logika AND, OR dan XOR. Dan penggunaan seperti instruksi COMPARE pada 8051, yaitu instruksi ROTATE dan SWAP akan kita bahas pada SubBAB 7.2. Dan terakhir kita menggunakan instruksi-instruksi ini untuk digunakan pada aplikasi sebenarnya seperti konversi BCD ke ASCII.

 

 

 



 

 

SUBBAB 7.1: INSTRUKSI PERBANDINGAN DAN LOGIKA

 

Pada SubBAb ini kita juga membahas tentang logika pada boolean, yaitu juga meliputi AND, OR dan XOR serta Complement. Kita juga mempelajari instruksi perbandingan Compare.

 

 

AND

 

      ANL  dest,source           ;dest = dest AND source

 

 

X         Y           X AND Y

0         0              0

0         1              0

1         0              0

1         1              1

 

Instruksi ini adalah melakukan AND logika pada dua operand dan menaruh hasilnya pada destination. Destination normalnya adalah Akumulator. Sedang operand source bisa register , memory, atau immediate. Lihat Lampiran A.1 untuk lebih jauh dengan model pengalamatan dari instruksi ini. Instruksi ANL untuk operand berukuran byte ini tidak mempengaruhi bendera apapun. Intruksi ini juga digunakan untuk me-mask (clear bit) beberapa bit dari operand. Lihat contoh 7-1.

 

Contoh 7-1

 

Tunjukkan hasil dari berikut ini.

 

       MOV  A,#35h        ;A=35h

       ANL  A,#0Fh        ;A=05h

 

Jawaban:

 

    35h       0011 0101

    0Fh AND   0000 1111 AND

    05h       0000 0101             35h AND 0Fh = 05h

 

 

 

OR

        ORL  dest,source           ;dest = dest OR source

 

X         Y           X OR Y

0         0              0

0         1              1

1         0              1

1         1              1

 

Operand tujuan dan sumber di-OR-kan, dan menempatkan hasilnya pada tujuan destination. Instruksi ORL dapat digunakan untuk men-Set menjadi 1’s beberapa bit dalam register. Register tujuan umumnya adalah Akumulator. Sedang operand source bisa register, memory, atau immediate. Lihat Lampiran A.1 untuk lebih jauh dengan model pengalamatan dari instruksi ini. Instruksi ORL untuk operand berukuran byte ini tidak mempengaruhi bendera apapun. Lihat contoh 7-2.

 

Contoh 7-2

 

Tunjukkan hasil dari berikut ini.

 

       MOV  A,#04         ;A=04

       ORL  A,#68h        ;A=6Ch

 

Jawaban:

 

    04h       0000 0100

    68h OR    0101 1000 OR

    6Ch       0101 1100             04h OR 68h = 6Ch

 

 

 

XOR

        XRL  dest,source           ;dest = dest XOR source

 

X         Y           X XOR Y

0         0              0

0         1              1

1         0              1

1         1              0

 

Operand tujuan dan sumber di-XOR-kan, dan menempatkan hasilnya pada tujuan destination. Register tujuan umumnya adalah Akumulator. Sedang operand source bisa register, memory, atau immediate. Lihat Lampiran A.1 untuk lebih jauh dengan model pengalamatan dari instruksi ini. Instruksi ORL untuk operand berukuran byte ini tidak mempengaruhi bendera apapun. Lihat contoh 7-3.

 

 

Contoh 7-3

 

Tunjukkan hasil dari berikut ini.

 

       MOV  A,#54H

       XRL  A,#78h

 

Jawaban:

 

    54h       0101 0100

    78h XOR   0111 1000 XOR

    2Ch       0010 1100             54h XOR 78h = 2Ch

 

 

 

Contoh 7-4

 

Instruksi XRL dapat digunakan untuk men-clear isi register dengan men-XOR-kan register tersebut dengan dirinya pula.

Tunjukkan bagaimana “XRL A,A” dapat men-clear A, anggap sebelumnya A = 45h.

 

Jawaban:

 

    45h       0100 0101

    45h XOR   0100 0101 XOR

    00h       0000 0000             45h XOR 45h = 00

 

 

PERHATIAN !!!

 

Catatan Penterjemah: Di atas adalah contoh yang kurang tepat, karena menurut beberapa datasheet yang saya baca meng-XOR akumulator dengan akumulator tidak diperkenankan untuk 8051. Anda bisa baca di 8051 Instruction Set Manual keluaran Intel maupun ATMEL. Namun untuk chip-chip yang lain misalnya Intel 486, cara meng-clear register seperti ini malah dianjurkan. Lihat Intel Architecture Optimization Manual 1997.

 

 

Instruksi XRL dapat digunakan untuk melihat apakah dua register memiliki nilai yang sama. “XRL A,R1” akan meng-exclusive-or-kan register A dengan register kerja R1, dan menempatkan hasilnya pada Akumulator. Jika sebelumnya kedua register tersebut memiliki nilai yang sama, maka sesudah operasi, A akan bernilai 00. Selanjutnya kita dapat meneruskannya dengan membuat keputusan (decision) berdasarkan hasil yang ada. Lihat contoh 7-5.

 

 

Contoh 7-5

 

Baca dan uji P1 untuk melihat apakah dia memiliki nilai 45h. Jika tidak kerimkan 99h pada P2, sebaliknya biarkan P2 clear.

 

Jawaban:

 

         MOV  P2,#00          ;clear P2

         MOV  P1,0FFh         ;buat P1 sebagai input

         MOV  R3,#45h         ;R3=45h

         MOV  A,P1            ;Baca P1

         XRL  A,R3

         JNZ  KELUAR          ;Lompat jika A tidak 00

         MOV  P2,#99h

KELUAR:  …

 

 

Dalam program contoh 7-5 perhatikan penggunaakan intruksi JNZ. JNZ dan JZ hanya untuk mengujji nilai dari akumulator saja. Dnegan kata lain, sehingga tidak dibutuhkan bendera nol (zero flag) untuk 8051.

Penggunakan luas lainnya instruksi XRL ini untuk men-toggle bit dalam operand. Misalnya kita hendah men-toggle bit 2 dari register A. Kita dapat menggunakan kode berikut. Kode ini akan membuat D2 dari register A berubah ke status berlawanan, sementara bit-bit yang laintidak berubah.

 

      XRL A#04h       ;EX_OR A dengan 0000 0100

 

 

CPL A (Complement Akumulator)

 

Instruksi ini untuk men-complement register A. Complement adalah mengubah 0s menjadi 1s dan 1s menjadi 0s. Ini disebut 1’s Complement juga kadang disebut sebagai NOT.

 

      MOV A,55h

      CPL A,#04h       ;sekarang A = AAh

                       ;0101 0101 (55h) menjadi 1010 1010 (AAh)

 

Untuk mendapatkan 2nd Complement, kita harus menambah dengan 1 pada 1st Complement. Kita tidak disediakan intruksi untuk membuat 2nd Complement ini, sehingga untuk menjadikan isi register sebagai 2nd Complement maka cara CPL dan INC inilah yang harus kita pakai. Harap dicatat untuk melakukan komplement, data harus ditempat pada register A. Hal itu karena CPL hanya membolehkan satu operan yaitu A. Lihat contoh 7-6

 

Catatan penterjemah: Ada cara yang baik untuk Complement Register Direct. Yaitu dengan menggunakan “XRL Direct,#0FFh“, dan untuk mendapatkan 2nd Complement cukup dengan “INC Direct“. Semua dapat dilakukan tanpa melibatkan A. Complement seperti ini dapat dilakukan juga terhadap Port, “XRL P1,#0FFh“. Untuk itu lihat juga bahasan tentang Read-Modify-Write (RMW). Mudah bukan?

 

 

 

 

Contoh 7-6

 

Cari 2’s Complement dari nilai 85h

 

Jawaban:

 

         MOV  A,#85h     ;                  85h  = 1000 0101

         CPL  A          ;1’s Complement         = 0111 1010

         ADD  A,#1       ;2’s Complement                 + 1

                                                   0111 1011 =7Bh

 

 

 

Instruksi Compare

 

8051 juga memiliki instruksi untuk operasi perbandingan. Adapun syntax-nya adalah sebagai berikut ini.

 

      CJNE Dest,Src,Rel

 

Dest adalah destination tujuan, Src adalah Source sumber, dan Rel adalah Relative Address alamat relatif. Dalam 8051 proses perbandingan dan lompat digabung menjadi satu instruksi, yaitu CJNE (compare and jump if not equal). CJNE membandingkan dua operand, dan lompat jika keduanya tidak sama. Jika perbandingan tersebut hasilnya tidak sama maka bendera CY menjadi penting. Jika Dest lebih besar dari Src maka CY=0 dan jika Dest lebih kecil dari Src maka CY=1. Namun jika proses perbandingan hasilnya adalah sama, maka CY tidak berubah. Dalam proses perbandingan ini operan Dest dan Src sama sekali tidak berubah (berbeda dengan XRL). Misalnya “CJNE A,#67h,Label“, setelah instruksi dijalankan register A masih tetap pada nilai sebelumnya. Instruksi tersebut akan membandingkan A dengan nilai 67h, jika sama maka instruksi selajutnya akan dijalankan, namuan jika tidak sama maka program kontrol akan me-lompat ke alamat Label.

 

 

Contoh 7-7

 

Pelajari kode berikut ini, dan jawab pertanyaan dibawah ini.

(a)    Akankah melompat ke LANJUT ?

(b)    Apa isi register A setelah instruksi CJNE dieksekusi ?

 

 

Jawaban:

 

         MOV  A,#85h     ;                  85h  = 1000 0101

         CPL  A          ;1’s Complement         = 0111 1010

         ADD  A,#1       ;2’s Complement                 + 1

                                                   0111 1011 =7Bh

 

 

Pada CJNE, Dest dapat berupa register A, atau sembarang register kerja Rn (R0 s/d R7) dan Register Indirect Ri (@R0 dan @R1). Dan Operand Src dapat berupa memory Direct (hanya jika dest = A), dan data Immediate. Lihat lapiran A untuk model pengalamatan dari instruksi ini. Instruksi ini hanya mempengaruhi bendera CY. Perubahan bendera ditunjukkan seperti pada tabel 7-1. Dan di bawahnya ditunjukkan bagaimana hasil perbandingan untuk berbagai kondisi yang mungkin.

 

Tabel 7-1 Bendera Carry setelah instruksi CJNE

Hasil Comparasi           CY

Dest > Src               0

Dest < Src               1

Dest = Src              —  no change

 

             CJNE R5,#80,TIDAK_SAMA       ;periksa dinla R5

             …                          ;R5=80

TIDAK_SAMA:  JC  LEBIH_KECIL              ;lompat jika R5<80

             …                          ;R5>80

LEBIH_KECIL: …                          ;R5<80

 

Perhatikan bahwa semua register dapat dibanding dengan data Immediate (segera). Jadi tidak perlu melibatkan lagi A. Juga diingat CY digunakan untuk melihat apakah perbadingan tersebut bernilai lebihbesar ataukah lebih kecil setelah kita mengetahui bahwa sebuah perbadingan ternyata tidak sama. Lihat contoh 7-8 dan 7-9.

 

Contoh 7-7

 

Tulis kode untuk memastikan nilai pada register A adalah 99h. Jika Ya, maka R1=FFh. Jika tidak R1 kita buat 00.

 

Jawaban:

 

         MOV   R1,#0

         CJNE  A,#99,LANJUT

         MOV   R1,#0FFh

LANJUT:  …

 

 

Contoh 7-8

Anggaplah bahwa port P1 digunakan sebagai input yang dihubungkan dengan sensor suhu. Tulis program untuk membaca temperatur dan periksalah apakah nilainya 35. Berdasarkan hasil pengujian, tempat nilai temparatur pada register seeperti di bawah ini.

 

     if T  = 35        then     A  = 35

     if T  < 35        then     R1 = T

     if T  > 35        then     R2 = T

 

jawaban:

            MOV  P1,#0FFh         ;buat P1 sebagai input

            MOV  A,P1             ;Baca data P1, simpan ke A

            CJNE A,#35,TDK_SAMA   ;Bandingkan suhu dengan 35

            SJMP SELESAI          ;A=35, dan program selesai

TDK_SAMA:   JNC  LBH_BESAR        ;lompat jika lebih kecil

            MOV R1,A              ;Simpan suhu yang lebih kecil

            SJMP SELESAI          ;R1<35, dan program selesai

LBH_BESAR:  MOV R2,A              ;R2>35, dan program selesai

SELESAI:    …

 

Catatan penerjemah: CJNE adalah pembanding aritmatika, dimana bendera CY menjadi terpengaruh sesuai hasil perbandingan. Namun XRL dapat digunakan sebagai pembanding logika yang tidak merubah satupun bendera.

Adakalanya kita hanya menginginkan dua kontrol dari perbandingan misalnya ..

 

(1)

Apakah R5 >= 80 ? Jadi kontrolnya bila Ya dan bila Tidak.

 

If R5 >= 80 then

  …        à kontrol pertama jika YA

else

  …        à kontrol kedua  jika TIDAK

 

maka kita akan mendapatkannya dalam bahasa Assembler 8051

 

                CJNE R5,#80,$+4

                CLR  C

                JNC  LEBIHBESAR_SAMADENGAN

LEBIHKECIL:     ..

 

LEBIHBESAR_SAMADENGAN:

                ..

 

(2)

Apakah R5 <= 80 ? Jadi kontrolnya bila Ya dan bila Tidak.

 

If R5 <= 80 then

  …        à kontrol pertama jika YA

else

  …        à kontrol kedua  jika TIDAK

 

maka kita akan mendapatkannya dalam bahasa Assembler 8051

 

                CJNE R5,#80,$+4

                SETB C

                JC   LEBIHKECIL_SAMADENGAN

LEBIHBESAR:     ..

 

LEBIHKECIL_SAMADENGAN:

                ..

 

 

Contoh 7-10

 

Tulis program untuk memonitor P1 terus menerus apakah nilainya 63h. Dan lompat dari Loop hanya jika P1=63h.

 

Jawaban:

             MOV  P1,#0FFh          ;buat P1 sebagai input

TUNGGU:      MOV  A,P1              ;Baca data P1, simpan ke A

             CJNE A,#63h,TUNGGU     ;apakah A=63h lompat jika tidak

             …

 

 

Contoh 7-11

 

Anggaplah kita menggunakan RAM internal dengan lokasi mulai 40h – 44h yang berisi informasi suhu setiap hari sebanyak 5 hari. Seperti ditunjukkan di bawah ini. Cari jika ada nilai yang sama dengan 30 dalam memory tersebut jika  ada simpan alamat memory tersebut pada R4, namun jika sama sekali tidak ditemukan, maka buat R4=0.

 

Jawaban:

 

          MOV R4,#0             ;R4=0

          MOV R0,#40h           ;Isi pointer

          MOV R2,#05            ;Isi pencacah

          MOV A,#30             ;Isikan pembanding

ULANG:    CJNE @R0,#30,LANJUT   ;Bandingkan isi memory dengan 30h

          MOV R4,R0             ;Simpan alamatnya

          SJMP SELESAI          ;Selasai proses

LANJUT:   INC R0                ;pencacah ke alamat selanjutnya

          DJNZ R2,ULANG         ;jika belum 5 kali lompat

SELESAI:  …

 

Catatan penterjemah: Dalam tulisan asli pada buku menggunakan perintah yang bagi saya tidak tepat. Yaitu “CJNE A,@R0,LANJUT” dimana akan ada pesan kesalahan dari assembler. Maka saya modifikasi dengan “CJNE @R0,#30,LANJUT“. Sehingga instruksi sebelumnya “MOV A,#30”  menjadi tidak berguna.

 

 

 

 



 

SubBAB 7.2: INSTRUKSI INSTRUKSI ROTARI DAN SWAP

 

Pada beberapa aplikasi adakalanya kita menginginkan bit-bit dalam sebuah register diputar. Dalam 8051 kita disediakan instruksi perputaran tersebut yaitu RL, RR, RLC, dan RRC yang dirancang khusus untuk keperluan tersebut. Instruksi-instruksi tersebut dapat membuat isi akumulator bergeser ke kiri maupun ke kanan. Dalam 8051, instruksi ini harus melibatkan operand A. Ada dua type rotasi. Satunya adalah rotasi yang hanya melibatkan semua bit dalam akumulator. Satunya lagi rotasi akumulator ditambah bit Carry. Sehingga total 9-bit yang digeser. Masing-masing akan dijelaskan satu per satu.

 

Merotasi Bit dalam A ke kanan dan ke kiri

 

 

Rotate Rigth A

 

 

       RR  A        ;Putar kanan A

 

 

Pada putar kanan , 8-bit dalam akumulator digeser ke kanan sejauh satu bit. Bit D0 keluar dari Least Significant Bit (LSB) dan ditempatkan pada D7 atau Most Significant Bit (MSB). Lihat Diagram dan kode-nya.

 

       MOV A,#36h   ;A = 0011 0110

       RR  A        ;A = 0001 1011

       RR  A        ;A = 1000 1101

       RR  A        ;A = 1100 0110

       RR  A        ;A = 0110 0011

 

 

Rotate Left A

 

 

       RL  A        ;Putar kiri A

 

Pada putar kiri , 8-bit dalam akumulator digeser ke kiri sejauh satu bit. Bit D7 keluar dari Most Significant Bit (MSB) dan ditempatkan pada D0 atau Least Significant Bit (LSB). Lihat Diagram dan kode-nya.

 

       MOV A,#72h   ;A = 0111 0010

       RL  A        ;A = 1110 0100

       RL  A        ;A = 1100 1001

 

Harap dicatat bahwa instruksi RL dan RR sama sekalitidak mempengaruhi matematika. Hal ini seperti instruksi logika lainnya.

 

 

 

 

Rotasi melewati Carry

 

 

Rotate Rigth A through Carry

 

 

       RRC  A        ;Putar kanan A melewati Carry

 

Instruksi RRC adalah menggeser 8-bit dalam akumulator ke kanan sejauh 1 bit melewati Carry. Bit D0 keluar dari Least Significant Bit (LSB) dan ditempatkan pada Carry. Sementara isi Carry ditempatkan pada D7 atau Most Significant Bit (MSB).

 

       CLR  C        ;CY=0

       MOV  A,#26h   ;A = 0010 0110

       RRC  A        ;A = 0001 0011  CY=0

       RRC  A        ;A = 1000 1001  CY=1

       RRC  A        ;A = 1100 0100  CY=1

 

 

Rotate Left A through Carry

 

 

       RLC  A        ;Putar kanan A melewati Carry

 

Instruksi RRC adalah menggeser 8-bit dalam akumulator ke kanan sejauh 1 bit melewati Carry. Bit D0 keluar dari Least Significant Bit (LSB) dan ditempatkan pada Carry. Sementara isi Carry ditempatkan pada D7 atau Most Significant Bit (MSB).

 

       SETB C        ;CY=1

       MOV  A,#15h   ;A = 0001 0110

       RLC  A        ;A = 0010 1101  CY=0

       RLC  A        ;A = 0101 1010  CY=0

       RLC  A        ;A = 1011 0100  CY=0

       RLC  A        ;A = 0110 1000  CY=1

 

 

 

SWAP A

 

Instruksi penting lainnya dalam 8051 adalah instruksi SWAP. Dia hanya bekerja untuk akumulator. Dia akan men-swap (ind=menukar balik) nible bawah dan nible atas. Dengan kata lain, D3-D0 ditempatkan pada D7-D4, dan D7-D4 sebelumnya ditempatkan pada D3-D0. Lihat diagram dan contoh 7-12.

 

 

 

Contoh 7-12

 

(a) Cari isi register A dari contoh di bawah ini.

(b) Dengan tanpa menggunakan instruksi SWAP, bagaimana caranya kita men-exchange(menukar) dua nible?

Tulis Kode sederhanna untuk menunjukkan prosesnya.

 

Jawaban:

 

(a)      MOV  A,#72h      ;A = 72h

         SWAP A           ;A = 27h

 

(b)      MOV  A,#72h      ;A = 0111 0010 = 72h

         RL   A           ;A = 1110 0100

         RL   A           ;A = 1100 1001

         RL   A           ;A = 1001 0011

         RL   A           ;A = 0010 0111 = 27h

 

 

 

Contoh 7-13

 

Tulis program untuk mencari jumlah 1’s (bit yang high) pada byte yang dimaksud.

 

Jawaban:

 

         MOV  R1,#0         ;R1 nantinya sebagai jumlah 1’s

         MOV  R7,#8         ;R7 sbg Counter pengulangan 8 x

         MOV  A,#97h        ;Cari jumlah 1’s dari 97h

LAGI:    RLC  A             ;putar A lewat CY

         JNC  LANJUT        ;periksa CY

         INC  R1            ;jika CY=1, maka tambahkan R1

LANJUT:  DJNZ R7,LAGI       ;Terus mengulang sampai 8 x ( R7=0 )

 

 

Catatan Penterjemah: Harap tidak mencampur adukkan SWAP pada 8051 dengan SWAP pada 486. Karena SWAP pada 8051 adalah menukar nible, sedang SWAP pada 486 adalah menukar byte dalam sebuah word.

 

Untuk mentransfer data secara serial, data dapat dikonversi dari data parallel menjadi data serial dengan menggunakan instruksi seperti di bawah ini.

 

            RRC  A            ;masukkan Bit pertama pada CY

            MOV  P1.3,C       ;kirim CY ke port P1.3

            RRC  A            ;masukkan Bit kedua pada CY

            MOV  P1.3,C       ;kirim CY ke port P1.3

            RRC  A            ;masukkan Bit ketiga pada CY

            MOV  P1.3,C       ;kirim CY ke port P1.3

            …

kode seperti di atas banyak digunakan untuk mengirim data pada memory EEPROM serial.

 

Catatan penterjemah: Cara serupa yang lebih lengkap dapat anda temukan dengan membaca buku tentang “BUS I2C”, “datasheet DS1302”, dan “datasheet AT24C04”. Informasi semacam ini dapat dengan mudah anda temukan lewat internet.

 



 

 

SubBAB 7.3: PEMROGRAMAN APLIKASI BCD DAN ASCII

 

Bilangan BCD kita ingat pernah dibahas pada BAB 6. Dan seperti yang kita ketahui, banyak aplikasi yang membutuhkan Real Time Clock (RTC). Mulai yang parallel seperti chip DS1387 atau yang serial seperti chip DS1302 dapat kita gunakan. Bahkan RTC dan 8051 yang dikemas dalam satu chip seperi DS5000T (pen: saya juga belum pernah menggunakan chip ini). RTC selalu mencacah detik, menit, jam, tanggal, dan alarm setiap saat walaupun listrik dimatikan. Umumnya RTC mendukung format data biner dan BCD sekaligus. Jika disetting berformat biner maka kita perlu untuk mengkonversi menjadi BCD. Namun saat kita hendak menampilkan data BCD tersebut pada display seperti LCD, data harus diubah menjadi karakter ASCII. Di bawah ini ditunjukkan bagaimana aplikasi logika dan instruksi ratate dilakukan untuk melakukan konversi BCD ke dalam karakter ASCII.

 

Tabel 7-2, Kode ASCII untuk digit 0 – 9

Tombol  ASCII  Biner       BCD Unpacked

1       31h    0011 0001   0000 0001

2       32h    0011 0010   0000 0010

3       33h    0011 0011   0000 0011

4       34h    0011 0100   0000 0100

5       35h    0011 0101   0000 0101

6       36h    0011 0110   0000 0110

7       37h    0011 0111   0000 0111

8       38h    0011 1000   0000 1000

9       39h    0011 1001   0000 1001

0       30h    0011 0000   0000 0000

 

 

Bilangan ASCII

 

Pada keyboard ASCII yang ada di depan saat ini, saat anda menekan tombol “0” data “0011 0000” (30h) dikirm secara serial dari keyboard ke komputer. Hal yang sama juga untuk tombol “1”, dan selanjutnya, dan selanjutnya. Seperti pada Tabel 7-2.

Harap dicatat bahwa ASCII adalah singkatan dari American Standard Code for Information Interchange, yaitu sebuah standar yang tadinya dibuat hanya untuk Amerika Serikat. Namun sekarang standar ini diadopsi oleh sebagian besar negara termasuk Indonesia. Sedang BCD adalah standar universal. Menginggat hampir semua peralatan seperti keyboard, printer, dan monitor semuanya menggunakan ASCII, bagaimana mengubah data dari BCD ke ASCII dan sebaliknya? Topic inilah yang kita gali berikutnya.

 

Konversi Packed BCD ke ASCII

 

Mikrokontroller DS5000T emmiliki apa yang disebut Real Time Clock (RTC). RTC memberikan kita waktu harian (jam, menit, detik) dan dan tanggal ( tahun, bulan, hari) secara terus menerus, walaupun sumber day terhadap chip diputuskan. RTC tetap hidup seperti jam dinding, karena RTC menggunakan sumber daya cadangan baterei yang membuatnya selalu bekerja untuk mengaupdate register-register detik, menit, jam dan lainya terus-menerus. Namun data data register tersebut biasanya diberikan dalam bentuk BCD. Jika kita ingin menampilkan data tersebut ke dalam LCD, atau mencetaknya ke printer,, maka kita harus memisahkan setiap BCD dan mengkonversinya ke bentuk ASCII, baru kemudian ditampilkan ke dalam LCD, atau dicetak.

Untuk menkonversi packec BCD ke ASCII, kita harus menkonversi packed BCD ke bentuk unpacked BCD. Kemudian unpacked BCD kita tambahkan dengan 30h sehingga membentuk bilangan ASCII.Berikut ini mendemontrasikan bagaimana packed BCD kita konversi menjadi ASCOO. Lihatjuga contoh 7-14

 

Packed BCD        Unpacked BCD      ASCII

29h               02h   &  09h      32h   &  39h

0010 1001         0000 0010  &      0011 0010  &

                  0000 1001         0011 1001

 

Konversi ASCII ke Packed BCD

 

Untuk mengkonversi ASCII ke dalam bentuk BCD, pertama kita mengkonversinya menjadi unpaced BCD., selanjutnya kita mengabungkannya menjadi satu menjadi packed BCD. Contohnya, untuk 4 dan 7, keyboard akan memberikan masing-masing 34h dan 37h. Untuk tujuan kita mendapatkan 47h atau “0100 0111”, yang ituadalah packed BCD. Prosesnya diilustrasikan lebih jauh di bawah ini.

 

Key   ASCII       Unpacked BCD      Packed BCD 

4     34h         0000 0100

7     37h         0000 0111         0100 0111 = 47h

 

      MOV  A,#’4′       ;A=34h , bentuk ASCII bagi char 4

      MOV  R1,#’7′      ;R1=37h, bentuk ASCII bagi char 7

      ANL  A,#0Fh       ;mask nible atas (A=04h)

      ANL  R1,#0Fh      ;mask nible atas (R1=07h)

      SWAP A            ;A=40h

      ORL  A,R1         ;A=47h, packed BCD

 

Setelah konversi, bilangan Packed BCD diproses dan hasilnya kemudian dalam format Packed BCD. Seperti yang kita lihat pada BAB 6 ada instruksi khusus yaitu “DA  A”, dimana akan sangat dibutuhkan untuk operasi dengan bilangan BCD.

 

Contoh 7-14

 

Anggaplah register A memiliki Packed BCD, tulis program untuk mengkonversi packed BCD tersebut ke dalam bilangan ASCII dan menempatkannya pada R2 dan R6.

 

Jawaban:

 

         MOV  A,#29h         ;A=29h, Packed BCD

         MOV  R2,A           ;simpn nilai pada R2

         ANL  A,#0Fh         ;mask nible atas (A=09h)

         ORL  A,#30h         ;buat nilainya menjadi ASCII

         MOV  R6,A           ;kirim hasilnya pada R6

 

         MOV  A,R2           ;kembalikan nilai R2 pada A

         ANL  A,#0F0h        ;mask nible bawah (A=20h)

         RR   A              ;putar kanan

         RR   A              ;putar kanan

         RR   A              ;putar kanan

         RR   A              ;putar kanan

         ORL  A,#30h         ;buat nilainya menjadi ASCII

         MOV  R2,A           ;kirim hasilnya pada R2

 

 



 

RINGKASAN

 

BAB ini menjelaskan instruksi logika AND, OR, XOR, dan Complement. Dijelaskan pula instruksi-instruksi untuk hal tersebut dalam bahasa Assembler 8051. Termasuk juga instruksi perbandingan dan jump. Selebihnya lagi penggunaan instruksi logika tersebut untuk proses manipulasi bit.

 

Instruksi rotate (geser) dan swap (tukar nible) digunakan pada banyak aplikasi. Bab ini pula menjelaskan tentang format BCD dan ASCII serta konversinya.

 



—————————————-

|o-o| Diterjemahkan oleh Dhanny Dhuzell

—————————————-

Tinggalkan Balasan