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
—————————————-