Anda di halaman 1dari 38

Bahasa Assembler 8051 Dalam menjalankan program, mikrokontroler akan melakukan pembacaan data yang tersimpan dalam memori

program (internal atau eksternal). Alamat memori yang harus dibaca disimpan dalma sebuah register yang dinamakan program counter (PC). Data yang terbaca akan diartikan sebagai perintah yang harus dikerjakan oleh mikrokontroler. Perintah ini bias berbebtuk pemindahan data (data transfer), pengolahan data(dta rocessing) atau mengubah alur program (program control). Setelah melaksanakan perintah , mikrokontroler akan memperbaharui isi PC dengan alamat memori selanjutnya. Perintah-perintah mikrikontroler bias dikodekan dalam 1 byte data lebih sehingga mikrokontroler harus bias membaca beberapa byte intruksi sebelum benar-benar mengekskusi sebuah perintah. Kode-kode ini biasanya merupakan data heksadesimal dan dinamakan sebagai bahasa mesin (machine code). Setiap perintah mempunyai kode data yang unik, sebagai contoh Inc A

Dikodekan dengan byte 04H,sebuah intruksi 1 byte. Artinya, setiap mikrokontroler membaca data 04H dari memori program, isi regrister A (akumulator) akan ditambah 1. Setelah itu isi PC juga akan ditambah 1 dan mikrokontroler akan melaksanakan intruksi selanjutnya, contoh lain Inc 35H

Arti perintah ini adalah mikrokontroler akan menambah 1 nilai RAM internal di alamat 35H. Perintah ini memerlukan 2 byte data, byte pertama adalah byte yang menyatakan perintah untuk menambah nilai RAM internal di sebuah alamat yang dinyatakan dalam byte selanjutnya (dikodekan dengan 35H).Setiap mikrokontroler membaca data 05H artinya mikrokontroler harus menambah 1 nilai yang ada di alamat sebuah RAM internal. Untuk mengetahui alamat RAM yang dimaksud, setelah membaca 05h PC akan ditambah 1 dan mikrokontroler akan membaca nilai, dalam contoh ini . 35H Isi PC pun dinaikan sekali lagi untuk membaca byte perintah selanjutnya.Dalam melaksanakan perintah ini PC dinaikan 2 kali. Keluarga MC-51 dilengkapi dengan intruksi-intruksi untuk memindahkan data (data teranfer), pengolahan data (data processing) Dan pengendalian program (program control). Setiap intruksi dinyatakan dalam 1 baris asslember, yang terdiri atas setiap kode operasi (operation code/opcode) atau pseudo-operation (pseudo-op) yang diikuti 1 atau lebih operand untuk menyatakan lokasi alamat di memori, regrister atau sebuah konstanta. Opcode adalah sebuah intruksi bahasa assembler unik yang ditulis dalam bentuk mnemonic, misalnya miv atau inc. Sedangkan pseudo-op hamper sama dengan opcode, tetapi tidak akan dicodekan ke dalam bahasa mesin pada saat diassembler. Misalnya pernyataan yang menyatakan alamat awal program

Org

0000H

Mnemonic org berarti origin, artinya program ini di awali di alamat 0000H. Selain opcode, pseudo-op atau operand, bahasa assembler juga bias mempunyai sebuah label atau catatan (comment). Satu baris bahasa assembler biasa dicontohkan sebagai berikut Star : Mov A, #45H ; isi register A dengan 45H

Intruksi ini akan mengisi register A dengan data 45H. Disini, Start adalah label yang pada dasarnya adalah sama dengan alamat awal dari intruksi tersebut. Label berguna dalam intruksi pemanggilan sebuah subrutin dimana label adalah nama dari sebuah subrutin. Sedangkan mov adalah opcode untuk intruksi inidan memiliki dua operand (A dan #45H). Operand pertama, A, menyatakan register tujuan pemindahan data sedangkan operand kedua, #45H, merupakan data yang akan dipindahkan. Tanda pagar (#) menyatakan bahwa 45H adalah sebuah konstanta bukan alamat memori (jilka tidak ada tanda pagar 45H berarti alamat memori). Setelah kalimat tanda titik koma (;) adalah catatan. Biasanya digunakan untuk memberikan catatan terhadan intruksi yang bersangkutan. Assembler 8051 akan mengabaikan setiap kata atau hutuf yang terletak setelah tanda titik komadalam satu baris. Perhatiakn notasi-notasi yang digunakan untuk operand: 1. Rn adalah satu register R0 R7 dari bank register yang aktif 2. Direct adalah alamat 8 bit RAM internal (00H FFH) atau SFR 3. @Ri adalah alamat 8 bit RAM internal (00H FFH) atau SFR yang ditunjukan oleh R0 atau R1 4. #data adalah konstanta 8 bit (1 byte) 5. # data 16 adalah konstanta 16 bit (2 byte) 6. Addr16 adalah 16 bit alamat tujuan yang dipakai oleh intruksi ajmp, ljmp dan lcall. Alamat ini bias di mana saja dalam daerah 64 KB memori program. 7. Addr11 adalah 11 bit alamat tujuan yang dipakai oleh intruksi ajmp dan acall. Alamat ini harus berada dalam blok 2 KB yang sama. 8. Rel adalah alamat relative, dipakai oleh intruksi sjmp dan semua intruksi lompat persyarat. Alamat ini akan berada 128 byte sebelum intruksi yang sekarang atau 127 byte setelahnya. 9. Bit adalah alamat bit dari RAM yang bias dialamati per bit (20H 2 FH) atau SFR yang bias diakses per bit.

PEMINDAHAN DATA

MCS-51 memiliki intruksi-intruksi pemindahan data yang sangat berguna dan bisa digunakan untuk memindahkan data byte atau bit. Sumber atau tujuan bisa berupa data konstanta, register fungsi khusus (SFR) atau alamat di memori data atau program (internal maupun eksternal). Bagian penting dari konsep pemindahan data MCS-51 adalah mode-mode pengalamatan yang dimilikinya. Kode pengalamatan merupakan cara bagaimana byte atau bit sumber dan tujuan ditentukan. Sebagai contoh, dalam sebuah operasi pemindahan data, byte data sumber bias tersimpan dalam sebuah register, RAM internal, memori program dan memori data eksternal. Sementara byte alamat sumber bias dituliskan langsung sebagai bagian dari intruksi assembler atau disimpan dalam sebuah register. Intruksi Pemindahan Data Mode Bentuk Perintah mov A, #data Segera (Immediate) mov Rn, #data Keterangan Simpan 1 byte data konstanta kre A Simpan 1 byte data ke RN (n=0,1,2,7) dari bank register yang aktif Simpan 1 byte Internal/SFR data ke Ram

mov direct,#data mov DPTR, #data16 Langsung (Direct) mov A, direct mov direct, A mov direct, direct mov A, Rn register mov Rn, A mov direct, Rn mov Rn, direct mov A, @Ri Tak Langsung (Indirect) mov @Ri, A mov direct, @Ri mov @Ri, direct

Simpan konstanta 16 bit ke DPTR Isi A dengan RAM/SFR Isi RAM/SFR dengan A Isi RAM/SFR dengan Isi A dengan R0 R7 Isi R0 R7 dengan A Isi RAM/SFR dengan R0 R7 Isi R0 R7 dengan RAM/SFR Isi A dengan RAM yang ditunjukan oleh R0 atau R1 Isi RAM yang ditunjukan oleh R0 atau R1 dengan A Isi RAM/SFR dengan RAM yang ditunjukan oleh R0 atau R1 Isi RAM yang ditunjukan oleh R0

atau R1 denagn RAM/SFR mov @Ri, #data movx A, @DPTR Isi RAM yang ditunjukan oleh R0 atau R1 dengan konstanta Baca alamat RAM eksternal di DPTR dan simpan di A (16 bit alamat) Kirim A ke RAM eksternal di DPRT (16 bit alamat) Baca RAM eksternal di alamat R) atau R1 dan simpan di A (8 bit alamat) Kirim A ke RAM eksternal di R0 ( 8 bit) Baca byte data dari memori program dengan alamat awal di DPTR dan alamat offset di A. data disimpan di A. Baca byte data dari memori program dengan alamat awal di PC dan alamat offset di A. data disimpan di A. Simpan RAM/SFR di alamat stack (SP) Ambil RAM/SFR yang tersimpan di stack Pertukaran A dengan R0 R7 Pertukaran A dengan RAM/SFR Pertukaran A dengan RAM yang ditunjukan oleh R0 atau R1 Pertukaran nibble rendah A dengan RAM yang ditunjukan oleh R0 atau R1 Isi bit C (carry) dengan bit di RAM/SFR Isi bit RAM/SFR dengan C

movx @DPTR, A movx A, @Ri

movx @Ri, A Berindeks (indexed) movc A, @A+DPRT

movc A, @A+PC

Operasi Stack push direct pop direct Pertukaran Data (Data Exchange) xch A, Rn xch A, direct xch A, @Ri xchd A, @Ri

Operasi bit

mov C, bit mov bit, C

MCS-51 memiliki 5 mode pengalamatan:

1. Pengalamatan segera (immediate) 2. Pengalamatan langsung (direct) 3. Pengalamatan register 4. Pengalamatan tak langsung (indirect) 5. Pengalamatan berindeks (indexed) Selain mode-mode pengalamatan tersebut di atas (yang semuanya menggunakan mnemonic mov, movx atau movc). MCS-51 juga memiliki intruksi pemindahan data berorientasi memori stack (stack oriented)dan pertukaran data (data exchange)antarregister serta pemindahan data beorienterasi bit. Tabel 4.1 memperlihatkan rangkuman intruksi pemindahan data. MODE PENGALAMATAN SEGERA Mode pengalamatan segera (immediate addressing mode) adalah mode pengalamatan di mana byte sumber dinyatan sebagai sebuah konstanta dalam baris bahasa assembler, sedangkan tujuan bias sebuah bank register (R0 R7),SRF atau sebuah alamat RAM internal. Sebagai contoh org mov mov mov mov mov mov end 0000h A, #45H PSW, #0 R1, #07 PSW, #8 R1, #07 ; alamat awal program ; isi register A dengan 45H ; pilih bank register 0 ; isi R1 dengan 7 (decimal) ; pilih bank register 1 ; isi R1 dengan 7 (decimal)

3 0H, #0AH ; isi register 3 0H denagn 0 AH ; akhir program

Program mempunyai awal 0000H. Program diawali dengan memberi register A dengan data 45H kemudian akan memberi register PSW dengan 0,artinya akan memiliki bank register ke-0 (RS1,RS0 = 0). Selanjutnya register R1 akan diisi dengan data 7 (decimal). R1 akan berada di alamat 01H di RAM internal (karena register bank yang aktif saat itu adalah bank register ke-0, yang beralamat 00H 07H). Kemudian program akan memilih bank register ke-1 dengan mengisi PSW dengan data 8 (RSI=0, RS0=1)dan mengisi r1 dengan data 7. Sekarang R1 berada di alamat 09H di RAM internal.Perintah selanjutnya adalah mengisi register yang beralamat di 30H dengan data 0AH. Alamat 30H adalah sebuah alamat di RAM internal. Baris terakhir program (end) menyatakan akhir dari program ini. Assembler MCS-51 mengharuskan pernyataan end di akhir program.

MCS-51 juga memiliki sebuah intruksi untuk pemindahan data 16 bitke register SFR yang berpasangan, dalam hal ini register DPTR. Sebagai contoh mov DPTR, 34578H

perintah ini akan mengisi DPRT dengan data 4578H atau sama dengan mengisis DPH dengan 45H dan DPL dengan 78H. Perintah ini sama dengan perintah mov mov DPH, #45H DPL, #78H

tetapi hanya memerlukan satu baris perintah. MODE PENGALAMATAN LANGSUNG Mode pengalamatan langsung (direct addressing mode) adalah pemindahan data antarregister(baik RAM internal maupun SFR). Data sumber disimpan di sebuah register (RAM internal maupun SFR). Misalnya: Mov Mov A, 70H

90H, A

Intruksi pertama akan mengisi register A denagn data yang tersimpan di alamat 70H (RAM internal), kemudian data di register A akan dikirimkan ke register SFR yang beralamt 90H. Alamat SFR 90H adalah alamat untuk Port 1. Pada kedua intruksi tersebut, data yang akan dipindahkan disimpan di sebuah register (register 70H dan akumulator). Dalam pemograman assembler, RAM internal bias dinyatakan dengan langsung menuliskan alamatnya seperti dicontohkan oleh program di atas atau dengan mendeklarasikan sebuah variable menggunakan pseudo-op equ (equal atau sama dengan). Penulisan langsung akan membuat listing program susah dibaca; selain itu, apabila karena sesuatu hal alamat harus diganti maka semua alamat RAM tersebut harus diganti satu persatu. Dengan menggunakan variable, program lebih mudah dipahami dan seorang progremer biasanya lebih mudah mengingat sebuah sebuah kata daripada sebuah alamat memori. Jika akan mengganti alamat RAM, cukup dengan mengganti deklarasinya saja. My_Byte equ 70H Org Mov End Baris pertama program di atas adalah pendeklarasian bahwa My_Byte adalah sebuah alamat RAM, dalam hal ini 70H. Program ini akan membaca datayang ada di My_Byte atau alamat RAM 70H dan menyimpannya di akumulator (register A). 0000H A, My_Byte

Jika alamat My_Byte akan diganti , cukup dengan mengubah pendeklarasiannya, missal My_Byte equ 71H Alamat My_Byte akan berubah menjadi 71H. SFR juga dinyatakan seperti RAM internal (denan menggunakan) alamatlangsung atau pendeklarasian) atau juga menggunakan notasi atau symbol yang telah bdidefinisikan oleh 8051 (symbol-simbol SFR bias dilihat di table 2.2). cara yang terakhir lebih banyak digunakan. Contoh: My_Byte Port1 Org Mov Mov Mov End Dua perintah terkhir memili arti yang sama, bedanya perintah terakhir memerlukan pendeklarasian bahwa Port1 mempunyai alamat 90H. MODE PENGALAMATAN REGISTER Mode pengalamatan register (register addressing mode) adalah pemindahan data di mana sumber atau tujuan adalah salah satu dari 8 register dari bank register yang aktif (R0 R7). Sebagai contoh Org Mov Mov Mov Mov End Program di atas diawali dengan memilih bank register 0 sebagai bank register yang aktif. Kemudian isi akumulator akan dibaca dan disimpan di register R0 dan R7. Selanjutnya, isi register R7 akan digandakan ke register B. MODE PENGALAMATAN TAK LANGSUNG 000H PSW, #0 R), a R7, A B, R7 equ equ 0000H A, My_Byte P1,A Port1, A 70H 90H

Mode pengalamatan atk langsung (indirect addressing mode) adalah mode pengalamatan di mana alamat sumber atau tujuan tidak dinyatan secara eksplisit. Mode pengalamatan ini menggunakan register R0 atau R1 sebagai register untuk menyimpan alamat sumber atau tujuan. Simbol @ ditulis di depan R0 atau R1 untuk menyatakan bahwa register ini menyimpan alamat sumber atau tujuan pemindahan data. Sebagai contoh My_Byte1 equ My_Byte2 equ Org Mov Mov Mov Mov Mov End My_Byte1 dan My_Byte2 adalah alamat di memori 70H dan 71H. Program diawali dengan memberi konstanta 0EH ke register My_Byte1. Kemudian register R0 menyimpan konstanta My_Byte1 (70H) dan R1 akan menyimpan konstanta My_Byte2 (71H). R0 akan menyimpan alamat register sumber pemindahan data. Baris intruksi selanjutnay, yang merupakan mode pengalamatan tak langsung, akan meminadahkan data dari alamat yang ditunjukan oleh register My_Byte1 akan dipindahkan ke akumulator. Baris terakhir prigram akan memindahkan data akumulator ke alamat yang ditunjukan oleh register R1, yaitu My_Byte2. Dari contoh program diatas terlihat, register R0 dan R1 (perlu diingat hanya 2 register ini yang bias dipakai) menyimpan alamat sumber dan tujuan pemindahan data. Oleh karena itu, dalam mode ini alamat sumber dan tujuan bias dilihat sebagai sebuah konstanta. Dengan memanipulasi isi register R0 atau R1 (dengan menambah atau mengurangi misalnya), mode ini bias dipakai untuk memindahkan data yang berulang-ulang dengan alamat sumber dan tujuan berurutan. Program cukup mendefinisikan alamat awal dan menyimpannya di R0 atau R1. Kemudian saat program berjalan, R0 atau R1 ditambahkan satu sampai alamat akhir. Program er harus memperhatikanalamat awal ini agar pada saat dijalankan, pemindahan data tidak sampai menimpa alamat memori yang menyimpan informasi penting, misalnya alamat stack yang menyimpan alamat kembali setelah perintah call. Mode pengalamatan tak langsungjuga bergunqa untuk mengaksesRAM internal tambahan AT89S52. Seperti yang telah dijelaskan pada Bab 3, RAM internal tambahan menempati alamat yang sama dengan alamat-alamat SFR. Pengalamatan langsung, pada alamat yang sama,akan mengakses SFR, 0000H My_Byte1, #0 EH R0, #My_Byte1 R1, #My_Byte2 A, @R0 @R1, A 70H 71H

sedangkan pengalamatan tak langsung akan mengakses RAM internal tambahan. Perhatikan basis program di bawah ini. Mov Mov Mov 90H, #45H R1, #90H @R1, #45H

Intruksi pertama adqalah pengalamatan langsung. Perintah ini akan memindahkan konstanta 45H ke register 90H, dalam hal ini alamat SFR untuk P1. Intruksi terakhir adalah mode pengalamatan tak langsung. Perintah ini akan mengirim konstanta 45H ke alamat yang ditunjukan oleh R0(dalam hal ini 90H). Perintah ini tidak akan mengirim data ke P1, tetapi akan mengirimdata ke alamat RAM internal tambahan di alamat 90H. Ingatlah untuk menggunakan mode pengalamatan tak langsung untuk mengakses Ram internal tambahan AT89S52. Selain untuk memindahkan data antarmemori-internal (SFR atu RAM), mode pengalamatan tak langsung juga bias digunakan untuk pemindahan data antarakumulator dan memori data (RAM) eksternal. Mnemonik yang digunakan adalah movx. Perhatikan contoh program berikut Org Mov Mov 0000H A, #45 DPRT, #0000H

Movx @DPRT, A Mov DPRT, #1234H

Movx A, @DPRT End Byte data yang akan dikirimkan disimpan di akumulator, sedangkan alamat memori eksternal disimpan di DPRT (0000H). Perintah selanjutnya adalah mengirimkan data yang disimpan di register A ke alamat memori eksternal yang tersimpan di DPRT. Dua perintah terakhir adalah perintah untuk membaca data dari memori eksternal. DPRT akan menyimpan alamat 1234H. Data yang tersimpan di alamat ini akan dibaca dan disimpan di A. Perhatikanlah bahwa perintah movx akan mengaktifkan pin P3.6 dan P3.7 sebagai sinyal kendali tulis (WR) atau baca (RD). Oleh karena itu, kedua pin ini tidak bias digunakan sebagai pin IO multiguna pada saat mengakses memeori eksternal. Begitu pual dengan P0 dan P2 karena port ini digunakan sebagai bus data dan bus alamat. Selain DPRT, register R0 atau R1 bisa digunakan untuk membaca memori eksternal melalui perintah movx. Misalnya program di atas bias diganti dengan program sebagai berikut

Org Mov Mov

0000H Mov A, #45 R0, #0 P2, #0

Movx @R0, A Mov Mov R0, #34H P2, #12H

Movx A, @R0 End R0 atau R1 hanya menyimpan alamat orde rendah (A0 A7), sedangkan orde tinggi (A8 A 15) dikirimkan secara langsung ke P2. Apabila alamat orde tinggi tidak dikirimkan (karena memori atau perangkat luar hanya memerlukan 8 bit alamat), P2 bisa digunakan sebagai port output karena mikrokontroler akan mempertahankan data sebelumnya. MODE PENGALAMATAN BERINDEKS Mode pengalamatan berideks dipakai untuk membaca byte data atau konstanta yang tersimpan dalam memori program dan menyimpannya di akumulator. Alamat memori program yang berisi byte data yang akan dibaca disimpan di dalam DPRT atau PC. Alamat ini adalah alamat dasar (base address) karena alamat yang sesungguhnya didapat dengan menjhumlahkan DPRT atau PC denagn isi akumulator (alamat offset). Intruksi yang digunakan adalah movc dengan format intruksi Movc A, @A+DPRT Atau Movc A, @+PC Dalam bahasa assembler terdapat pernyataan untuk mendefinisikan konstanta dalam memori program. Pernyataan ini adalah db (define byte). Konstanta ini misalnya digunakan untuk menyimpan data yang akan digunakan untuk menyimpan data yang akan ditampilkan melalui LCD atau menyimpan data untuk mengubah bilanagn menjadi data display 7 segmen. Sebagai contoh db db db db db 0C0H 0F9H 0A4H 0B0H 099H

db db db db db

092H 082H 0F8H 080H 090H

pendefinisian data di atas adalah pendefinisian data untuk mengubah angka 0 sampai 9 menjadi data display 7 segmen sebelum dikirimkan ke sebuah port denagn PX.0 dihubungkan ke segmen a sampai PX.6 dihubungkan denagn segmen g. Angka 0 akan dikonversi menjadi 0C0H dan angka 9 menjadi 90H. Segment_Converter: mov DPRT, #0100H

movc A, @A+DPRT ter org db db db db db db db db db db 0100H 0C0H 0F9H 0A4H 0B0H 099H 092H 082H 0F8H 080H 090H

Program di atas adalah sebuah subrutin yang akan mengkonversi angka decimal menjadi data display 7 segmen (dengan nama subrutin Segment_Converter). Misalnya jika register menyimpan angka 3, DPRT akan diisi oleh alamat awal data pendifisian data. Ketika perintah move dieksekusi. DPRT akan menyimpan 0103H (0100+0003H) sehingga dqata yang terbaca adalah 0B0h. Jika PC yang digunakan program di atas akan menjadi Segment_Converter:

inc

movc A, @A+PC ret db db db db db db db db db db 0C0H 0F9H 0A4H 0B0H 099H 092H 082H 0F8H 080H 090H

Perbedaan yang terlihat adalah, PC tidak diisi denagn alamat awal pendefisisan data tetapi dengan mengambil nilai PC yang sekarang. Perintah move dikodekan 1 byte dalam bahasa mesin (baik menggunakan DPRT atau PC). Perintah inc A diperlukan untuk menaikan isi register A ini karena asa intruksi ret sebelum pendefinisian data. Jika register A menyimpan angka 3 maka setelah dinaikan menjadi 4 oleh perintah inc, perintah movc akan membaca data di alamat perinath movc ditambah 4 (dalam hal ini menjadi 0B0H). Pendefinisian data atau disebut table data denagn menggunakan PC harus tepat setelah intruksi ret, sedangkan jika menggunakan DPRT, table data bias diletakan di mana saja dalam area program memori. PEMINDAHAN DATA BERORIENTASI STACK Pemindahan data beroerientasi stack adalah mode pemindahan data dengan SFR SP(stack pointer) sebagai register sumber dan tujuan. Intruksi yang digunakan adalah push dan pop. Perintah push akan menyimpan data ke SP (SP sebagai tujuan), sedangkan perintah pop akan mengambil data dari SP (SP sebagai sumber). SP akan ditambahkan dengan 1 setelah perintah push dan dikurangi 1 setelah perintah pop. Setelah reset SP akan menyimpan data 07H sehingga alamat awal yang dipakai adalah 08H, tetapi alamat awal bisa dimodifikasi oleh program. Seorang programmer harus berhati-hati dalam menemukan alamat awal SP. Oleh karena SP akan menempati alamat RAM internal, maka jika penempatan alamat awal salah, operasi stack bias mengakibatkan menimpa alamat RAM yang menyimpan data penting.

Pada dasarnya operasi SP menggunakan metode penaglamatan langsungmenggunakan semua register SFR dan RAM internal (termasuk SP sendiri). Khusus untuk akumulator, notasi yang digunakan harus ACC. Perintah push dan pop tidak mengenal notasi A. Sebagai contoh Push ACC Push A Perintah kedua akan mengakibatkan assembler 8051 membangkitkan pesan kesalahan. Contoh program operasi SP Org mov mov 000H SP, #2FH A, #45H

push ACC mov pop end Alamat awal SP ditentukan di alamat 2FH. Register A akan menyimpan data 45H. Kemudian perintah push diekskusi sehingga data yang sekarang disimpan di A akan disimpan di memori SP (dalam hal ini alamat 30H). Instruksi berikutnya akan menyimpan konstanta 0 ke register B. Perintah pop akan mengambil data di alamat SP (30H) dan menyimpannya ke register B. Alamat SP kemudian akan menjadi 2FH. Operasi SP adalah operasi untuk menyimpan data sementara untuk kemudian diambil kembali. Operasi ini biasanya dipakai rutin pelayanan interupsi (ISR). Sebagai contoh program berjalan sekarang menggunakan register A. kemudian interupsi eksternal diaktifkan sehingga program akan melompat ke ISR. Di dalam ISR, register A, DPRT dan register B digunakan untuk sebuah operasi aritmatika. Agar data register A, DPRT, dan register B yang lama tidak tertimpaoleh data yang baru maka di awal ISR, isi register-register tersebut harus disimpan di dalam SP untuk dibaca kembali setelah seluruh intruksi di ISR dieksekusi. Contoh programnya Org 0013H ; vector interupsi eksternal 1 B, #0 B

Externall_ISR: Push ACC Push DPH ; simpan data akumulator ; simpan data DPTR orde tinggi

Push DPL Push B INSTRUKSI Pop Pop Pop Pop Reti B DPL DPH ACC

; simpan data DPTR orde rendah ; simpan data register B

; ambil kembali data register B ; ambil kembali data DPL ; ambil kembali data DPH ; ambil kembali data akumulator ; rutin interupsi berakhir

SP , sesuai namanya, adalah tumpukan data. Menyimpan data di SP artinya membuat tumpukan data dari alamat awal SP. Untuk mengambil kembali tumpukan tersebut, harus dimulai dari tumpukan paling atas, artinya data paling akhir disimpan ke SP. Oleh karena itu, perlu diperhatikan agar perintah pop dimulai dengan register yang paling akhir disimpan, dalam contoh di atas adalah register B, diikuti DPL, DPH dan ACC PERTUKARAN DATA Salah satu bentuk pemindahan data yang lain adalah pertukaran data (data exchange) secara langsung antara akumulator dengan register yang lain tanpa harus menggunakan register tambahan. Perhatikan contoh program dibawah ini Mov Mov Mov Mov Mov A, #45H B, #34H R0, A A, B B, R0

Program di atas akan menukarkan isi register A dengan register B, data register A akan dipindahkan ke register B dan sebaliknya. Program ini menggunakan register R0 sebagai register untuk menyimpan sementara data register A. Dengan menggunakan operasi pertukaran data, penggunaan R0 bisa dihilangakan. Keluarga 8051 mengenal 2 perintah pertukaran data yaituperintah xch (semua byte) dan xchd(hanya nibble rendah). Perintah xch akan menukarkan data akumulator denagn SFR,Ram internal, salah satu dari 8 register (R0 R7) atau dengan alamat RAM yang ditunjukan oleh register R0 atau R1. Sedangkan xchd

merupakn perintah pertukaran data dengan register-register yang ditunjukan oleh R0 atau R1 (tak langsung0, tetapi hanya untuk nibble bawah (bit 0 bit 4). Perhatikan contoh program di bawah ini yang merupakan perubahan dari program di atas. Mov Mov Xch A, #45H B, #34H A, B

Penggunaan R0 dihilangkan dengan perintah xch. Perhatiakn juga contoh program di bawah ini Mov Mov Mov Mov A, #45H B, #23H R0, #0 R1, #3 0H ; simpan 45H di A ; simpan 23H di B ; simpan 0 di R0 ; simpan 3 0h di R1

Mov 3 0H, #0DH ; simpan 0 DH di alamat 3 0H Xch Xch XCh Xch A, B A, R0 A, @R1 A, @R1 ; tukarkan isi data A dengan B ; tukarkan isi data A denagn R0 ; tukarkan isi data A dengan alamat ; tukarkan nibble bawah A dengan ; nibble bawah alamat yang ada di ;R1 PEMINDAHAN DATA BERORIENTASI BIT Selain pemindahan data dalam ukuran byte, seperti yang telah dijelaskan sebelumnya, bahasa assembler 8051 juga mengenal operasi pemindahan data dalam bentuk bit. Seperti diketahui, 8051 memiliki SFR yang bias dialamati per bit. RAM internal yang beralamat di 20H 2FH juga bias dialamati per bit. SFR_SFR yang bias dialamati per bit adalah SFR yang mempunyai alamat nibble rendah 0 atau 8. Sebagai contoh Port 1 (P1) mempunyai alamat 90H, karena 90H nibbleadalah 0, maka P1 bisa dialamati per bit. Mengakses bit bias dilakukan dengan beberapa cara, yaitu dengan menggunakan notasi P1.n (dengan n = 07) atau dengan menggunakan alamat bit secara langsung. Alamat bit ke-0, 1 ,2, 7) adalah 90H, 91H, 92H, 97H. Alamat 90H bias sebagai alamat P1 pada operasi byte atau sebagai alamat P1.0 pada operasi bit. Untuk mengakses bit SFR yang lain bias juga seperti halnya mengakses P1 atau dengan menggunakan definisi bit yang telah didefinisikan oleh assembler 8051.

Sebagai contoh, untuk mengakses bit carry di PSW bias denagn notasi PSW.7 atau cukup dengan notasi C. Untuk akumulator notasi yang dipakai adalah ACC.0, ACC.1, , ACC.7. RAM internal yang bias dialamati per hit (alamat 20H 2 FH) memiliki alamat 8 x (I 20H) +j, dengan I = 20H, 21H, , 2FH, dan j = 0, 1,, 7 Sebagai contoh bit ke-2 RAM 23H akan memiliki alamat 8 x (23H 20H) + 2 = 1AH Dari persamaan di atas, bias didapatkan bahwa bit yang beralamat n adalah bit ke-j dari register I, di mana

n i = int( ) + 20 H 8

J = n -8 (I 20H), dengan n = 0, 1, , 7FH Int adalah integer (bilangan bulat). Sebagqai contoh bit yang beralamat di 65H, maka

n i = int( ) + 20 H 8 = int( 65 H ) + 20 H 8

= 2CH

Sehingga bit yang beralamat di 65H adalah bit ke-5 dari RAM 2Ch. Tabel 4.2 memperlihatkan alamat-alamat bit dari RAM internal 20H 2 FH. Selain dengan menggunakan alamat seperti ditunjukan tabel, alamat RAM 20H 2Fh bias diakses dengan menggunakan pernyataan equ, misalnya My_Flag LED_Flag Motor_Flag equ equ 20H equ My_Flag. 0

My_Flag. 1

My_Flag adalah RAM internal yang beralamat di 20H, sedangkan LED_Flag dan Motor_Flag adalah definisi bit ke-0 dan ke-1 dari regisre My_Flag. LED_Flag dalam program akan memiliki alamat yang sama dengan 20H.0 dan 20H.1 atau alamat bit 00H dan 01H.

Pada dasarnyqa alamat yang bias diakses per bit bias dibaca dan dipindahkan ke alamat bit yang lain, walaupun ada beberapa operasi bit yang tidak diizenkan oleh assembler 8051. Sebagai contoh Mov Mov Mov Mov 20H.0, C TI, C TI, 20H.0 20H.0, TI

Dua perintah terakhir akan menimbulkan pesan error oleh assembler 8051. Perhatikan contoh program di bawah LED_CTRL My_Flag equ LED_Fleg Org Mov Mov Mov End Program di a tas mengasumsikan 2 buah saklar yang terhubung ke P1.0 untuk menyalakan sebuah LED yang terhubung ke LED_CTRL (P1.1). RAM internal yang beralamat di 20H digunakan untuk menyimpan status LED dan definisikan sebagai LED_Flag(bit ke-0) PENGOLAHAN DATA Mikrokontroler 8051 memiliki sebuah unit arimatika dan logika (ALU) yang berfungsi untuk melakukan pengolahan data (data processing) melalui operasi-operasi arimatika dan logika. Oleh karena itu, 8051 dilengkapi dengan intruksi-intruksi untuk melakukan penngolahan data yang dibqagi menjadi 2, yaitu intruksi-intruksiarimatika dan intruksiintruksi logika. Intruksi-intruksi arimatika digunakan untuk melakukan operasi-operasi arimatika seperti, penjumlahan, pengurangan, dan p[erkalian. Sedangkan intruksi-intruksi logiak digunakan untuk melakukan operasi-o[perasi logika, seperti perkalian digital(intruksi AND) atau penjumlahan digital (OR). INTRUKSI-INTRUKSI ARIAMTIKA Intruksi-intruksi arimatika digunakan untuk melakukan operasi-operasi arimatika seperti, penjumlahan, pengurangan, dan perkalian. Tabel 4.3 merangkum intruksi-intruksi 8051 yang tergolong intruksi arimatika. Tabel 4.3 Intruksi-intruksi arimatika 0000H C, P1.0 LED_Flag, C LED_CTRL, C equ 20H equ My_Fleg.0 P!>!

Instruksi

Bentuk Intruksi add A,Rn

Keterangan Penjumlahan isi register R0 r2 dengan isi akumulator, hasil disimpan di akumulator Penjumlahan isi register A dengan RAM internal/SFR Penjumlahan isi register yang ditunjukan oleh R0 atau R1 denagn A Penjumalahn denagn A konstanta

add A, direct add A, @Ri

add A, #data Addc A, Rn

Penjumlahan isi register R0 R7 denagn isi akumulator dimana bit carry C ikut dijumlahkan, hasil disimpan di akumulator Penjumlahan isi register A dengan RAM internal/SFR. Bit C ikut dijumlahkan Penjumlahan isi register yang ditunjukan oleh R0 atau R1 denagn A. Bit C ikut dijumlahkan Penjumlahan konstanta dengan A. bit C ikut dijumlahkan Pengurangan A oleh R0 R7. Hasil disimpan di A Pengurangan RAM/SFR A oleh

Addc A, direct

Addc A, @Ri

Addc A, #data

Penguranaan

Subb A, Rn subb A, direct subb A, @Ri

Penguranagn A oleh register tak langsung yang ditunjukan oleh r0 atau R1 Pengurangan konstanta A oleh

subb A, #data Perkalian mul AB

Perkalian register A dengan B. hasilnya adalah bilangan 16 bit, byte orde rendah disimpan di A sedangkan byte orde tinggi disimpan di B Pembagian register A

Pembagian

div AB

dengan B. hasil pembagian disimpan d A, sedangkan B akan menyimpan sisa pembagian Penaikan (increment) inc A inc Rn iInc direct inc @Ri Naikan register A sekali Naikan register R0 R7 sekali Naikan RAM/SFR sekali Naikan isi RAM internal/SFR yang ditunjukan oleh R0 atau R1 sekali Naikan isi DPRT sekali Turunkan register A sekali Turunkan register R0 R7 sekali Turunkan Ram/SFR sekali Turunkan isi RAM internal/SFR yang ditunjukan oleh R0 atau R1 sekali Pengaturan register A, ketika pengolahan data BCD

inc DPRT Penurunan (decrement) dec A dec Rn dec direct dec @Ri

Pengaturan desimal

da A

INTRUKSI PENJUMLAHAN Ada 2 perintah untuk operasi penjumlahan, yaitu add dan addc. Perintah pertama adalah perintah penjumlahan dengan tidak mengikutsertakan bit bawaan (C = carry), sedangkan perintah kedua merupakan perintah penjumlahan dengan mengikutsertakan bit C dari hasil operasi sebelumnya.kedua perintah ini menggunakan akumulator sebagai operand pertama (operand pertama selalu akumulator), sedangkan operand kedua bias sebuah konstanta, salah satu register R1 R7 dari bank register yang aktif, alamat di RAM internal atau SFR, atau alamat RAM tak langsungyang ditunjukan oleh R0 atau R1. Hasil penjumlahan selalu disimpan di akumulator. Bit-bit PSW yang dipengaruhi oleh perintah ini adalah bit C (carry). AC (auxiliary carry), dan bit OV (overflow). Bit C akan di-set jika hasil melebihi FFH dan di-reset kalau sebaliknya. Bit AC akan di-set jika penjumlahan menghasilkan bawaan (carry) dari nibble rendah ke nibble tinggi, yaitu bawaan dari 3 ke bit 4, dan di-resset jika sebaliknya. Bit AC berguna dalam penjumlahan bilangan BCD. Sedangkan bit OV akan di-set jika ada bi7 tetapi tidak dari bit 6, atau ada bawaan dari bit 6 tetapi tidak bit 7. OV berguna dalam penjumlahan bilangan bertanda (positif atau negatif)di mana bit 7 dipakai sebagai bit yang menandakan tanda positif atau negative. Ada 2 keadaan yang bias mengeset OV. Pertama, jika hasil penjumlahan antara 2 bilangan positif melebihi 7FH tetapi kurang dari FFH, hasilnya,

dalam notasi komplemen 2, terlihat sebagai bilangan negative. Ov akan di-set untuk menandakan bahwa hasil penjumlahn bukan bilangan negative. Keadaan yang kedua , penjumlahan 2 bilangan negative akan selalu menghasilkan bit carry eksternal. Jika hasil penjumlahan tersebut berada diantara 0 dan 7FH(100H dan 17FH denagn carry eksternal), maka OV akan di-set untuk menandakan bahwa hasil penjumlahan bukan bilangan positif. Perhatikan contoh program perintah add berikut. org mov add mov add mov add mov add end perintaaaah addc (penjumlahan denagn carry), biasanya berguna untuk menjumlahkan bilangan lebih dari 8 bit, Misalnya X and Y adalah 2 bilangan bulat 16 bit denagn XL dan YL menyatakan byte rendah kedua bilangan dan XH dan YH menyatakan byte tinggi kedua bilangan. Contoh program berikut akan menjumlahkan bilanagn X dan Y. XL, Xh, Yl dan YH dinyatakan sebagai alamat RAM internal . Hasil penjumlahan akan disimpan sebagai bilangan Z, dengan ZL dan ZHmenyatakan byte rendah dan tinggi bilangan Z.keduanya juga dinyatakan sebagai alamat RAM. XL XH YL YH ZL ZH org mov mov mov mov equ equ equ equ equ equ 0000H XH, #12H XL, #34H YH, #12H YL, #0EFH ; Y=12EFH ; X=1234H 30H 31H 32H 33H 34H 35H 0000H A, #1 A, #2 R7, #2 A, R7 45H, #2 A, 45H R0, #45H A, @R0 ; simpan 1 di A, A=1 ; simpan 1 di A, A=1 ; tambahkan A denagn 2, A=3 ; simpan 2 di R7 ; tambahkan A denagn R7, A=5 ; simpan 2 di alamat 45H ; tambahkan A denagn alamat 45H, A=7 ; simpan 45 di R0 ; tambahkan A denagn RAM yang ditunjukan oleh r0, A=9

mov add mov

A, XL A, YL ZL, A

;jumlahkan byte rendah

; simpan hasil di ZL ; ZL = 34H+0EFH ; =23H

; C=1 mov addc mov A, XH A, YH ZH, A ; jumlahkan byte tinggi ; bit C juga ikut dijumlahkan ; ZH = 12H+12H=C ; End = 25H

; hasil akhir Z=2523H

Misalnya X = 1234H dan Y = 12EFH, maka XL = 34H, XH = 12H, YL = EFH dan YH = 12H.Pertama jumlahkan byte rendah kedua bilangan, hasilnya simpan sebagai byte rendah hasil(ZL). Berdasarkan hasil penjumlahan ini bit carry akan di-set atau tidak, dalam contoh program bit C akan di-set (34H + EFH = 123h, 1 adalah carry). Kemudian jumlahkan byte tinggi kedua bilangan denagn mengikutsertakan carry dari hasil penjumlahan byte rendah. INTRUKSI PENGURANGAN Operasi pengurangan menggunakan perintah sub. Seperti ahlanya operasi penjumlahan, perintah sub menggunakan akumulatorsebagai operand pertama, sedangkan operand kedua bias sebuah konstanat, salah satu register R0 R7 dari bank register yang aktif, alamat di RAM internal atau SFR, atau alamat RAM tak langsung yang ditunjukan oleh R0 atau R1. Hasil pengurangan selalu disimpan di akumulator. Dalam operasi pengurangan, bit carry (C) akan selalu diikutsertakan, dengan kata lain perintah subb adalah operasi pengurangan akumulator oleh bit carry dan alamat atau data yang ditunjukan oleh operand kedua. Artinya jika bit C di-set sebelum perintah subb, hasil pengurangan akan dikurangi 1. Bit Cakan di-set jika operasi pengurangan membutuhkan pinjaman (borrow) eksternal. Bit C ini bisa digunakan dalam operasi pengurangan bilangan bulat lebih besar daripada 256, bilanagn 16 bit misalnya. Prosesnya dilakukan seperti halnya penjumlahan 16 bit, kurangkan dulu byte rendah kemudian kurangkan byte tingginya. Namun karena bit C selalu diikutsertakan pastikan bit C ini di-reset dahului sebelum proses penguranagn pertama (byte rendah). Hal ini bisa dilakukan denagn menggunakan perintah berorientasi bit clr C

Bit AC dan OV juga akan terpenagruh oleh perintah sub. Bit AC akan di-set jika diperlukan pinjaman untuk nibble rendah ( bit 3), sedangkan bit OV akan di-set kalau diperluakn pinjaman untuk bit 7. Bit OV berguna saat bekerja denagn bilangan bulat bertanda yang dinyatakan dalam komplemen 2.] Perhatiakan contoh program berikut

org clr mov subb clr mov subb clr mov subb

0000H C A, #10 A, #2 C R7, #2 A, R7 C 45H, #7 A, 45H ; simpan 7 di alamat 45H ; kurangkan A denagn alamat 45H, ; A=FFH C akan di-set ; simpan 2 di R7 ; kurangkan A dengan R7, A=6 ; nol-kan bit C ; simpan 10 di A, A=10 ; kurangkan A dengan 2, A=8

mov mov subb C di-reset end

45H, #1 R0, #45H A, @R0

; simpan 1 di alamat 45H ; simpan 45 di R0 ; kurangkan A denagn Ram yang ditunjukan oleh R0, A=FD,

Perhatikan 5 baris progar m terakhir. Hasil perintah sebelumlnya A akan menyimpan bilangan ^ dan bit C bernilai nol. Kemudian A akan dikurangi oleh isi alamat 45H (bilangan 7). Penguranagn ini akan menghasilkan bilangan FFh dan bit C akan di-set (karena membutuhakn pinjaman eksternal). Selanjutnya A akan dikurangi lagi oleh alamat 45H melalui pengalamatan tak langsung (45H menyimpan bilanagn 1). Hasilnya adaklah FE, namun karena bit C sebelumnya di-set, maka hasil akhir adalah FDH. Perhatikan program penguranagn bilanagn 16 bit berikut XL XH YL YH ZL ZH org mov mov equ equ equ equ equ equ 0000H XH, #12H XL, #34H ; X=1234H 30H 31H 32H 33H 34H 35H

mov mov clr mov subb mov mov subb mov

YH, #11H YL, #35H C A, XL A, YL ZL, A A, XH A, YH ZH, A

; Y=1135H

; Kurangkan byte rendah ; XL YL = 34H 35H ; ZL = FFH C akan di-set ; Kurangkan byte tinggi ; XH - YH = 12H 11H =1 ; hasil akhir karena C di-set ; ZH = 1-1 =0 ; X-Y = 1234H 1135H = 00FFH

Dalam program di atas, X=1234H akan dikurangi Y=1135H. Kedua bilanagn ini dinyatakan dengan 2 byte, masing-masing XH dan XL untuk bilanagn X dan YH dan YL untuk bilangan Y. Pertama byte rendah bilangan X(XL=34H), sebelumnya bit C di-reset. Hasilnya adalah FFH dan disimpan di ZH denagn bit C di-set. Selanjutnya byte tinggi yang dikurangi. Hasilnya adalah 00H (karena C di-set). Hasil akhir penguranagn adalah 00FFH.

Intruksi Perkalian
Keluarga 8051 hanya mengenal satu perintah perkalian, yaitu Mul AB

Perintah ini akan mengalihkan bilanagn yang tersimpan di register A (8 bit) denagn bilanagn yang tersimpan di register B (juga 8 bit). Hasilnya adalah bilanagn 16 bit; A akan menyimpan byte orde rendah, sedangkan B akan menyimpan byte orde tinggi. Hasil perkalian tidak akan melebihi FFFFH (karena FFHxFFH = FE01H), sehingga bit C tidak pernak di-set. Bit OV akan di-set kalau hasil perkalian melebihi 00FFH,dalam hal ini register B menyimpan data bukan 0. Perhatiakan contoh berikut mov mov A, #1 B, #2

mul AB Hasil program di atas adalah, A akan menyimpan bilanagn 2 sedangkan B akan menyimpan bilangan 0. Bit OV tidak di-set. mov mov mul A, #0FFH B, #2 AB

Hasilnya A akan menyimpan FEH dan B menyimpan 1. Bit OV akan di-set.

Intruksi Pembagian
Bahas aassambler 8051 juga hanya mengenal satu perintah pembagian Div AB

Perintah ini akan membagi bilanagn yang tersimpan di register A denagn bilanagn yang tersimpan di register B. Register A akan menyimpan hasil pembagian, sedangkan sisa pembagian akan disimpan di register B. Jika B menyimpan bilangan 0. Maka pembagian akan menghasilkan bilangan yang tidak terdefinisi, pada keadaan ini bit OV akan di-set. mov mov div A, #7 B, #2 AB

Hasil program di atas A akan menyimpan bialnagn 3 dan B menyimpan bilanagn 1.

Intruksi Kenaikan Dan Penurunan


Intruksi penaikan (increment) dan penurunan (decrement) memungkinkan untuk menaikan atau menurunkan isi bank register. SFR atau alamat Ram internal (langsung atau tak langsung) secara langsung tanpa melalaui akumulator terlebih dahulu. Intruksi ini sama dengan penjumlahan atau pengutranagn dengan bilanagn satu dengan tidak melibatkan bit carry. Bentuk perintahnya adalah inc untuk menaikan dan dec untuk penurunan, misalnya mov mov mov mov inc inc inc inc A, #4 R7, #45 30H, #6 R0, #3 0H A R7 3 0H 2R0

Program ini akan membuat A menyimpan bilangan 5, R7 menyimpan 45, Sedangakn alamat RAM 30H akan menyimpan 8, karena dinaikan 2 akli, denagn pengalamatan langsung dan tak langsung. Contoh intruksi dec tinggal mengganti mnemonic inc dengan dec. Perintah inc juga mengijinkan untuk menaikan isi DPRT, perhatikan contoh program berikut Mov Inc DPRT, #1234H DPRT,

Hasilnya DPRT akan menyimpan data 1235H. Assembler 8051 tidak mengenal perintah dec DPRT. Perinath inc dan dec berguna dalam pencacah loop ataupenunjuk ke data, misalnya dalam pengiriman 2 byte data yang tersimpan di RAM melalui port serial. R0 dipakai sebagai penunjuk RAM(penaglamatan ytak langsung). Sedangkam R7 dipakai sebagai pecacah loop. Contoh programnya org mov mov loop1: mov mov jnb inc djnz end Data yang akan dikirim mempunyai alamat awal 30H. Denagn pengalamatan tak langsung,data yanga akn dikirim dipindahkan ke akumulator untuk kemudian dikirim ke port serial (melalui pregister SBUF). Perintah jnb (jump if no bit) digunakan untuk mengecek apakah pengiriman selesai atau belum. Sedangkan perintah djnz (decrement and jump if no zero) digunakan unyuk mengecek apakah ke-20 b yte belum terkirim , R0 akan dinaikan sehingga akan memperlihatkan alamat RAM yang akan dikirim selamjutnya. A, @R0 SBUF, A TI, $ R0 R7, Loop1 0000H R0, #3 0H R7, #20

Intruksi Pengaturan Desimal


Intruksi penagturan decimal (decimal adjust) berguna dalam memproses (operasi penjumlahan) bilangan BCD (binery coded decimal). Dalam bilangan BCD, setiap nibble akan melambangkan digit decimal, sehingga setiap nibble akn mempunyai nilai 0...9. misalnya 2 bilangan BCD 12 dan 19 dalam BCDakan dilambangkan sebagai 12H dan 19H. Penjumlahan kedua bilanagn (denagn add atau addc tanpa bit carry) akan menghasilkan bilanagn 2BH. Bilanagn 2BH bukan bilanagn BCD karena Bh melebihi bilangan 9, sehingga diperlikan wsebuah pengaturan. Penagturan ini dilakukan dengan mengurangkan nibble rendah akan bernilai (BH 10 =1) dan nibble tinggi akan bernilai (2+1=3). Jadi hasil akhir adalah 31H. Intruksi penagturan decimal (mnemonic) da) menyederhanakan proses penagturan diatas denagn menambahkan 6 ke nibble rendah atau 06H ke byte hasil (2Bh+6=31H). Pengaturan juga dilakukan jika jumlah kedua nibble rendah melebihi 16. Intruksi da memndeteteksi keadaan ini berdasarkan kenyataan bahwa bit AC akan di-set jika intruksi add atau addc menghasilkan carry dari bit 3 ke bit 4. Selain itu, jika penjumlahan nibble

tinggi melebihi 9, perintah da akan menambahkan 6 ke nibble tinggi atau menambahkan 60H ke byte hasil. Denagn demikian intruksi penagturan desimal bisa dipandang sebaga.i penambahan 0, 6 60H atau 66H ke akumulator, bergantung apda isi akumulator dan PSW. Perhatiakn contoh program berikut org mov mov add da end Setelah intruksi add, akumulator akan menyimpan 2BH (bukan bilangan BCD). Denagn intruksi da, akumulator akan menyimpan bialnagn BCD yang benar, yaitu 31H. Perhatiak contoh program berikutnya org 0000H mov mov add da end Setelah intruksi add, akumulator akan menyimpan BBh (juga bukan bilanagn BCD). Karena penjumlahan nibble tinggi sama-sama melebihi 9, maka intruksi da akan menambahkan 66H ke hasil penjumlahan, swhingga hasil akhir adalahBBH+66H=121H. Akumulator akan menyimpan 21H dan bit C akan di-set. Intruksi da tidak bisa mengubah bilangan heksadesimal ke bilanagn decimal secara langsung. A, #55H B, #66H A, B A 0000H A, #12H B, #19H A, B A

INTRUKSIIINTRUKSI LOGIKA
Intruksi logika adalah intruksi yang akan melakuakn operasi-operasi logika seperti, logika AND, OR, eksklusif-OR (XOR). Operasi komplemen akumulator, memutar bit akumulator, dan operasi swap juga termasuk ke dalam operasi logika ini. Operasi logika bisa digunakan untuk data berbentuk byte atau bit. Tabel 4.4 merangkum intruksi-intruksi logika ini. Tabel $4.4 Intruksi-intruksi logika Intruksi Bentuk Intruksi anl A, Rn Keterangan AND-kan isi akumulator denagn salah satu register (R0 R7) AND akumulator denagn

Logika AND

anl A, direct

(byte) anl A, @Ri anl A, #data anl direct, A Anl direct, #data Logika AND (bit) orl A, direct orl A, @Ri orl A, #data orl direct, A orl direct, #data Logika OR (bit) orl C, /bit Logika XOR (byte) xrl A, direct xrl A, @Ri xrl A, #data xrl direct, A xrl direct, #data cpl A Komplemen Cpl C Cpl bit Putar rl A cpl A xrl A, Rn orl C, bit orl A, Rn

RAM internal/SFR AND-kan A denagn register yang ditunjukan R0 atau R1 AND-kan konstanta A denagn

AND-kan RAM/SFR denagn A. hasil disimpan di RAN/SFR AND-kan RAM/SFR dengan konstanta OR-kan A dengan salah satu register (R0 R7) OR-kan A dengan RAM/SFR OR-kan A dengan R0 atau R1 OR-kan A denagn konstanta OR-kan RAM/SFR dengan A OR-kan RAM/SFR konstanta OR-kan C (RAM/SFR) dengan bit

dengan

OR-kan C dengan komplemen bit (RAM/SFR) XOR-kan A dengan salah satu register (R0 R7) XOR-kan A dengan RAM/SFR XOR-kan A dengan register yang ditunjukan R0 atau R1 XOR-kan konstanta A dengan

XOR-kan A RAM/SFR dengan A XOR-kan A RAM/SFR dengan konstanta Komplemenkan Akumulator Komplemenkan C Komplemenkan bit Putar A ke kiri 1 bit Putar A ke kiri 1 bit melalui

carry (Rotar) rr A rrc Swap swap A Putar A ke kanan 1 bit Putar A ke kanan 1 bit Swap (tukarkan) nibble rendah denagn nibble tinggi akumulator Clear (nol-kan) akumulator Clear (reset) bit Clear (reset) C Set c Set bit

Clear

crl A crl bit crl C

Operasi Set bit

setb C setb bit

Intruksi ANG, OR, dan XOR Intruksi AND< OR< dan XOR akan melakukanoperasi logika and,or, dan xor (eksklusive
or). Opersi ini melakukan 2 operand yang bisa berupa byter atau bit (semua intruksi bisa berlaku untuk bit kecuali intruksi XOR). Pada mode byte, intruksi-inrtuksi ini menangani bit-birt operand pertama denagn op[errand kedua, perhatikan contoh berikut mov anl A, #34H A,#12H

Program ini akan meng-AND-kan akumulator dengan konstanta 12h (yaitu 34H AND12H), dalam biklangan biner dinyatakan sebagai

0011 0100 0001 0010 0001 0000

Denagn neng-AND-kan antar-bit, hasilnya adalah 10H. Tidak ada bit PSW yang terpenaruh. Perhatikan contoh lain di bawah ini org mov mov anl mov 000H R7, #0FH A, #76H A, R7 30H, #34H

orl mov mov xrl anl orl end

A, 3 0H 31h, #12H R0, #31H aA< @R0 30H, A 31H, #0FH

Register R7 dan akumulator masing-masing menyimpan 0FH dan76H. Akumulator di-AND-kan dengan R7, hasilnya akumulator akan menyimpan 06H. Perhatikan,denagn di-AND-kan denagn 0FH, isi register menjadi 06H, artinya nibble tinggi dipaksa menjadi 0 sedangkan nibble rendah tidak berubah. Selanjutnya register 30H akan menyimpan 34h DAN AKUMULATOR DI-OR-kan denagn register 30H. hasilnya akumulator akan menyimpan 36H. Baris perintah selanjutnya akan menyimpan data 12H di register 31H dan R0 dipakai untuk menyimpan 30H sebagai almat tak langsung. Akumulator akan di-XOR kan dengan alamt 31H secara tak langsung melalui R0, hasilnya akumulator akn menyimpan 24H. Register 30H akn di-AND-kan dengan akumulator , hasilnjya register 30H akn menyimpan 0FH, hasil register 31H akn menyimpan 1FH. Untuk mode bit(hanya berlaku untuk intruksi AND dan OR), C selalu menjadi operand pertama, sedangkan operand kedua adalah SFR atuau RAM yang bisa diamati per bit. Misalny anl orl C, ACC. 0 C, /ACC. 0

Baris pertama akan meng-AND-kan bit C denagn bit ke-0 akumulator, sedangkan baris kedua akn meng-OR-kan bit C dengan komplemen dari bit ke-0 akumulator. Intruksi putar Intrukisi putar (rotate) akan memutar isi akumulator 1 bit ke kiri atau ke kanan . Pemutaran ini bisa dengan atau tanpa melalui bit carry. Intruksi putar ini hampir sama dengan operasi register geser, bedanya bit yang diputar akan menjadi bit baru yang masuk, jika diputar ke kanan bit ke-0 (LSB) akan menjadi bit ke-7 (MSB) dan jika diputar ke kiri bit ke-7 (MSB) akan nmenjadi bit ke-0 (LSB). Jilka diputar melalui carry, bit yang diputar akan menempati bit carry, sedangkan bit carry akan menjadi bit baru. Perhatikan contoh program berikut , asumsi bit carry awalnya 0. mov rr rl rrc A A A, #000111001b A

rlc

Program dimulai dengan men.kyimpaan data 00111001B (39). Kemudian perintah putar ke kanan akan membuat register A menjadi 10011100B(9CH), lalu dipurat ke kiri sehingga data kembali menjadi 00111001B (39). Program selanjutnya adalah memutar akumulator melalui carry ke kanan, bit carry akan di-set, sedangkan A akan menyimpan 00011100B (1CH). Perin tah terakhir akan memutar A ke kiri melallui carry, sehingga A akan menyimpan 00111001B (39) dan bit carry 0.

Perintah putar bisa dipakai untuk mengirim data rep bit (serial). Perhatikan contoh berikut. Isi akumulator akan dikirim melalui P1.0 secara serial denagn data dikirim MSB dahulu, untuk itu A harus diputar ke kiri melalui carry, bit carry-lah yang akan dikirim ke P1.0. R1 bertindak sebagai pencacah (8 bit) sampai semua bit A terkirim.

org mov mov Loop1 rlc mov djnz end

0000H A, #45H R7, #8

A P1.0, C R7, Loop1

Komplemen, Swap, Clear, dan Set Bit Intruksi komplemen adalah intruksi untuk menngkomplemenkan akumulator (dalam bit), C atau alamat bit (dalam bit). Bit-bit yang bernilai 1 akan diubah menjadi 0 dan sebaliknya, 0 diubah menjadi 1.Perhatiakn contoh program berikut mov cpl cpl A, #1111000B A ACC. 0

Setelah di-komplemen-kan isi A akan menjadi 0000111B, dan bit ke-0 akan menjadi 0. Intruksi swap akan menuka nibble rendah dengan nibble Tinggi akumulator. Intruksi ini sama dengan register A diputar 4 kali (kea rah manapun tanpa melalui carry). Contohnya

mov swap

A, #45H A

Setelah perintah swap, A akan memnjadi 54H. Perintah clear akn membuautu akumulator atau alamat bit menjadi nol. Perintah ini sama denagn memberikan konstanta 0 ke akumulator. Contohnya mov clr mov clr A, #45H A A, #01H ACC.0

Setelah perintah clear, akumulator akan menjadi 0. Perintah terakhir adalah meng-clear bit ke 0 register A. Perinath set bit akn mengeset sebuah bit (kebalikan perintah clr). Contohnya setb clr setb C A ACC. 0

Setelah perintah terakhir, C akan di-set dan A menjadi 01H(bit ke-0 di-set) PENGATURAN ALUR PROGRAM Dalam sebuah aplikasi, mikrokontroler mungkin tidaka akn mengerjakan perintah secra berurutan, tatapi akan berpindah dari subrutin yang satu ke yang alinnya bergantung pada data yang terbaca. Misalnya mikrokontroler yang dipakai sebagai pengendali pemanas ruang akan mengerjakan hal yang berbeda, menghidupkan pemanas atu mematikan tergantung padapenagtuaarn suhunya. Mikrokontroler akn mengidupkan pemanas jika suhu ruanagn terukur daru suhu yang diinginkan dan akan mematikannyja jika suhu ruangajn telah sesuai denagn yang diinginkan . Hal ini mengharuskan mikrokontroler untuk mengambil keputusan untuk kemuduian mengerjakan subrutin yang sesuai. Seperti telah dijelaskan, mikrokontroler mengerjakan program denagn membaca isi memori program, dan data yang terbaca akan diartikan sebagai perintah yang harus dikerjakan. Alamat memori program yang harus dibaca ditunjukan oleh SFR PC (program counter). Setelah mengerjakan sebuah intruksi, PC dinaikan dan menunjukan ke alamat untuk intruksi selanjutnya. Jika sebuah intruksi menyimpan data yang berbeda ke dalam PC, maka intruksi selanjutnya yang harus dikerjakan oleh mikrokontroler bisa terletak di alamat manapun di memori program.

Intruksi-intruksi yang akan mengubah isi PC dinamakan intruksi pencabangan (branching intrucktions) karena intruksi ini akanmembuaut alur program percabangan. Intruksiintruksi yang termasuk ke dalam intruksi percabangan adalah intruksi lompat (jump), yang akan me3lompat ke sebuah alamat programdan intruksi panggil (call), yang akan memanggil sebuah subrutin di memori program, termasuk intruksi kembali (retrun) setelah intruksi panggil. Intruksi lompat bisa dibagi menjadi lompat tak bersyarat (unconditional jump0 dan lompat bersyarat (conditional jump).

INTRUKSI LOMPAT T5AK BERSYARAT


Inrtuksi lompat tak bersyarat digunakan untuk membuat mikrokontroler melompat ke sebuah alamat program secara langsung dengan tdak melihat kondisi sebelumnya. Tabel 4.5 merangkum intruksi lompat tak bersyarat . Pada dasarnya yang membedakan intruksi-intrukasi yang ditunjukan oleh tabel adalah jangkauan alamat tujuan lompatan. Intruksi sjmp memiliki jangkau An lompat yang terendah, hanya 127 alamat ke depan dan 128 alamat ke belakang. Jika alamat tujuan melebihi batas tersebut , assembler 8051 akan menimbulkan error. Intruksi ljmp dan jmp mempunyai alamat tujuan ke semua lokasi memori program (64 KB). Intruksi ini bisa menggantikan intruksi sjmp dan ljmp secara langsung, namun yang perlu diperhatikan, intruksi jmp dan ljmp dikodekan dengan lebih banyak byte daripada sjmp dan ajmp. Perhatikan contoh program berikut: org mov mov sjmp 0000H A, P1 P0, A 0000H

Tabel 4.5 Intruksi-intruksi lompat atk bersyarat Bentuk Intruksi sjmp rel Keterangan Lompat pendek (short jump). Alamat tujuan didapatkan dengan menjumlahkan rel ( relative) denagn pc setelah PC dinaikan 2 kali. Alamat tujuan akan berada 127 byte ke depan atau 128 byte ke belakang. Lompat absalu (absolute jump). Alamat tujuan adalah alamat 11 bit dan harus berada dalam blok 2 KB memori program yang sama. Lompat jauh (long jump). Alamat tujuan berada di mana saja dalam 64 KB memori program. Sama dengan ljmp Lompat berindeks. Alamat tujuan adalah isi

ajmp addr11

ljmp addr16

jmp addr16 jmp @A+DPRT

DPRT setelah akumulator.

dijumlahkan

dengan

Alamat program dimulai di 0000H.Pro gram ini akan memba ca P1 untuk disimpan di akumulator dan dikirim ke p0. Setelah itu program akan melompat bisa langsung dituliskan alamatnya atau menuliskan label. Dengan menuliskan alamat secara lamngsung , jika alamt awal berubah, maka alamat tujuan juga diperbarui. Jika tidak, program ini tidak akan berjalan dengan baik. Dengan menggunakan label , hal itu tidak perlu dilakukan. Perhatikan contoh program berikut org Srart: mov mov sjmp A, P1 P0, A start 0000H

Jika alamat awal berubah menjadi 0100H, program tetap akan bekerja dengan baik karena label start akan menjadi 0100H. Perhatikan contoh program berikut Start sjmp start

jika program dijalankan maka akan terjadi loop yang tak berhenti. Program diatas bisa digantikan dengan mengganti alamat tujuan lompat denagn tanda $. Akan mempunyai arrti yang sama dengan program sebelumnya. Intruksi lompat berindeks cara kerjanya hampir sama denagn operasi pemindahan data modepengalamatan berindeks. Bedanya pada operasi pemindahan data, yang dilakukan adalah membaca byte konstanta deri tabel konstanta yang ada di memori program, sedangkan intruksi lompat berindeks akan membaca dan mengerjakan program atau subrutin dalam sebuah tabel intruksi. Dalam intruksi lo/mpat berindeks, digunakan DPRT daan akumulator. Dprt akan menyimpan alamat awal (base addres) dari tabel, sedangakn akumulator akan menyimpan alamat offset yaitu alamat sebenarnya ke mana program akan melompat. Perlu diperhatikan program atau subrutin dalam tabel intruksi mungkin membutuhkan bebebrapa byte intruksi, karena itu akumulator perlu disesuaikan sebelum perintah lompat berindeks dikerjakan. Perhatikan contoh program berikut org Star: mov anl mov A, P0 A, #3 B, #5 0000H

mul mov jmp

AB DPRT, #routine_table @A+DPRT

Routine_Table: mov sjmp B, P1 Routine_Table_Exit

mov sjmp mov sjmp mov

B, P2 Routine_Table_Exit B, P3 Routine_Table_Exit B, #0

Routine_Table_Exit: mov mul ljmp end Program di atas akan membaca data dari P0 dan disimpan di akumulator. Hasil Pembacaan akan Menentukan membaca P1, P2, P3 atau konstanta 0 untuk kemudian dikalikan dengan 0AH. Ini berarti aka nada 4 kemungkinan tabel intruksi yang akan dilaksanakan, karena itu akumulator di-AND-kan denagn 3 untuk memastikan akumulator yang berada di antara 0 sampai 3. Masing-masing tabel intruksi terdiri atas 2 intruksi:intruksi pemindahan data dan intruksi lompat pendek. Kedua intruksi ini akan dikodekan menjadi % byte alamat. Oleh karena itu, akumulator harus dikalikandengan 5. Jadi, perintah berindeks akan molompat dengan kelipatan 5 sesuai dengan akumulator. Jika tabel intruklsi memerlukan intruksi-intruksi yang yang mememrlukan lebih banyak byte-byte kode, program di atas bisa dimodifikasi untuk membaca tabel lompatan. Perhatikan program berikut. A, #0AH AB Start

org mov anl mov

0000H A, P0 A, #3 B, #3

mul mov jmp Jump_Tabel: ljmp ljmp ljmp ljmp First_Routine mov ljmp

AB DPRT, #jump_table @A+DPRT

First_Routine Second_Routine Third_Routine Fourth_Routine

B, P1 Jump_tabel_exit

Second_Routine mov ljmp Third_Routine mov ljmp B, P3 Jump_tabel_exit B, P2 Jump_tabel_exit

Fourth_Routine mov ljmp B, #0 Jump_tabel_exit

Jump_Tabel_Exit: mov mul ljmp end Tabel lompatan sekarang hanya terdiri atas 1 intruksi, yaitu intruksi lompatan panjang (ljmp). Intruksi ini akan dikodekan menjadi 3 byte, karena itu akumulator akan disesuaikan dengan mengalikannya dengan 3. Oleh karena intruksi yang akan dieksekusi berada dalam subrutin lain(seperti terlihat dalam tabel lompatan ada 4 subrutin), maka subrutin tersebut bisa berisi intruksi-intruksi yang panjang (selama dalam kapasitas 64 KB). INTRUKSI LOMPAT BERSYARAT A, #0AH AB Start

Intruksi lompat bersyarat digunakan untuk membuat mikrokontroler melompat ke sebuah alamat program tertentu apabila sebuah persyaratan terpenuhi. Sebagai contoh, jika isi akumulator nol maka program akan melompat ke alamat program yang dimaksud. Jika tidak nol, program akan melanjutkan ke alamat selanjutnya. Selain akumulator, persyaratan juga bisa didapatkan dari bank register, SFR, alamat RAM (langsung atatu tak langsung),atau juga didapat dari sebuah bit. Tabel 4.6 memperlihatkan intruksi-intruksi yang termaduk ke dalalm intruksi lompat bersyarat. Semua alamat tujuan lompat bersyarat adlah relative, artinya alamat lompatan akan berada 128 byte sebelum atau 127 byte sesudahnya. Tabel 4.6 Intruksi-intruksi lompatan bersyarat Bentuk Intruksi jz rel Keterangan Program akan melompat ke alamat rel jika akumulator nol. Jika tidak nol, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel jika akumulator tidak nol. Jika nol, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel kalau carry di-set. Jika tidak, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel kalau bit C tidak di-set. Jika bit C di-set, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel kalau bit (di SFR atau RAM internal yang bisa diakses per bit) di-set. Jika di-set, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel kalau bit (di SFR atau RAM internal yang bisa diakses per bit) di-set setelah itu bit akan di-nolkan(clear). Jika tidak, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel jika isi akumulator tidak sama dengan isi alamat langsung RAM dan SFR. Jika sama, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel jika isi akumulator tidak sama dengan byte konstanta.jika sma, program akan melanjutkan ke alamat selanjutnya. Program akan melompat ke alamat rel jika isi salah satu register (R0 R7) tidak sama dengan byte konstanta. Jika sama, program

jnz rel

jc rel

jnc rel

jb bit, rel

jbc bit, rel

cjne A, direct, rel

cjne A, #data, rel

cjne Rn, #data, rel

akan melanjutkan ke alamat selanjutnya. cjne @Ri, #data, rel Program akan melompat ke alamat rel jika isi alamat RAM yang ditunjukan oleh R0 atau R1 tidak dama dengan byte konstanta. Jika sama, program akan melanjutkan ke alamat selanjutnya. Kurangi satu isi register Rn (n=0,1,2,,7); jika belum nol melompati ke alamat rel, jika sudah nol lanjutkan ke alamat selanjutnya. Kurangi satu isi RAM atau SFR; jika belum nol melompat ke alamat rel, jika sudah nil lanjutkan ke alamat selanjutnya.

djnz Rn, rel

djnz direct, rel