Senin, 11 Februari 2008

Microcontroller Atmel








MCS51 Flow Control
27 September 2007 20:45
Pada dasarnya program dijalankan intruksi demi instruksi, artinya selesai menjalankan satu instruksi mikrokontroler langsung menjalankan instruksi berikutnya, untuk keperluan ini mikrokontroler dilengkapi dengan Program Counter yang mengatur pengambilan intruksi secara berurutan. Meskipun demikian, program yang kerjanya hanya berurutan saja tidaklah banyak artinya, untuk keperluan ini mikrokontroler dilengkapi dengan instruksi-instruksi untuk mengatur alur program.




Secara umum kelompok instruksi yang dipakai untuk mengatur alur program terdiri atas instruksi-instruksi JUMP (setara dengan statemen GOTO dalam Visual Basic), instruksi-instruksi untuk membuat dan memakai sub-rutin/modul (setara dengan PROCEDURE dalam Visual Basic), instruksi-instruksi JUMP bersyarat (conditional Jump, setara dengan statemen IF .. THEN dalam Visual Basic). Di samping itu ada pula instruksi PUSH dan POP yang bisa memengaruhi alur program.


Karena Program Counter adalah satu-satunya register dalam mikrokontroler yang mengatur alur program, maka kelompok instruksi pengatur program yang dibicarakan di atas, semuanya merubah nilai Program Counter, sehingga pada saat kelompok instruksi ini dijalankan, nilai Program Counter akan tidak akan runtun dari nilai instruksi sebelumnya.


Selain karena instruksi-instruksi di atas, nilai Program Counter bisa pula berubah karena pengaruh perangkat keras, yaitu saat mikrokontroler di-reset atau menerima sinyal interupsi dari perangkat input/output. Hal ini akan dibicarakan secara detail dibagian lagi.

Kelompok Instruksi JUMP


Mikrokontroler menjalankan intruksi demi instruksi, selesai menjalankan satu instruksi mikrokontroler langsung menjalankan instruksi berikutnya, hal ini dilakukan dengan cara nilai Program Counter bertambah sebanyak jumlah byte yang membentuk instruksi yang sedang dijalankan, dengan demikian pada saat instruksi bersangkutan dijalankan Program Counter selalu menyimpan nomor memori-program yang menyimpan instruksi berikutnya.


Pada saat mikrokontroler menjalankan kelompok instruksi JUMP, nilai Program Counter yang runtun sesuai dengan alur program diganti dengan nomor memori-program baru yang dikehendaki programer.


Mikrokontroler MCS51 mempunyai 3 macam intruksi JUMP, yakni instruksi LJMP (Long Jump), instruksi AJMP (Absolute Jump) dan instruksi SJMP (Short Jump). Kerja dari ketiga instruksi ini persis sama, yakni memberi nilai baru pada Program Counter, kecepatan melaksanakan ketiga instruksi ini juga persis sama, yakni memerlukan waktu 2 periode instruksi (jika MCS51 bekerja pada frekuensi 12 MHz, maka instruksi ini dijalankan dalam waktu 2 mikro-detik), yang berbeda dalam jumlah byte pembentuk instruksinya, instruksi LJMP dibentuk dengan 3 byte, sedangkan instuksi AJMP dan SJMP cukup 2 byte.

Instruksi LJMP


Kode untuk instruksi LJMP adalah 02, nomor memori-program baru yang dituju dinyatakan dengan bilangan biner 16 bit, dengan demikian instruksi ini bisa menjangkau semua memori-program MCS51 yang jumlahnya 64 KiloByte. Instruksi LJMP terdiri atas 3 byte, yang bisa dinyatakan dengan bentuk umum 02 aa aa, aa yang pertama adalah nomor memori-program bit 8 sampai dengan bit 15, sedangkan aa yang kedua adalah nomor memori-program bit 0 sampai dengan bit 7.


Pemakaian instruksi LJMP bisa dipelajari dari potongan program berikut :





LJMP TugasBaru





ORG 2000H


TugasBaru:


MOV A,P3





Dalam potongan program di atas, ORG adalah perintah pada assembler agar berikutnya assembler bekerja pada memori-program nomor yang disebut di belakang ORG (dalam hal ini minta assembler berikutnya bekerja pada memori-program nomor 2000H). TugasBaru disebut sebagai LABEL, yakni sarana assembler untuk menandai/ menamai nomor memori-program. Dengan demikian, dalam potongan program di atas, memori-program nomor 2000H diberi nama TugasBaru, atau bisa juga dikatakan bahwa TugasBaru bernilai 2000H. (Catatan : LABEL ditulis minimal satu huruf lebih kiri dari instruksi, artinya LABEL ditulis setelah menekan tombol Enter, tapi instruksi ditulis setelah menekan tombol Enter, kemudian diikuti dengan 1 tombol spasi atau tombol TAB).


Dengan demikian intruksi LJMP TugasBaru di atas, sama artinya dengan LJMP 2000H yang oleh assembler akan diterjemahkan menjadi 02 20 00 (heksadesimal).

Instruksi AJMP


Nomor memori-program baru yang dituju dinyatakan dengan bilangan biner 11 bit, dengan demikian instruksi ini hanya bisa menjangkau satu daerah memori-program MCS51 sejauh 2 KiloByte. Instruksi AJMP terdiri atas 2 byte, byte pertama merupakan kode untuk instruksi AJMP (00001b) yang digabung dengan nomor memori-program bit nomor 8 sampai dengan bit nomor 10, byte kedua dipakai untuk menyatakan nomor memori-program bit nomor 0 sampai dengan bit nomor 7.


Berikut ini adalah potongan program untuk menjelaskan pemakaian instruksi AJMP:





ORG 800H


AJMP DaerahIni


AJMP DaerahLain


ORG 900H


DaerahIni:


. . .


ORG 1000H


DaerahLain:


. . .





Potongan program di atas dimulai di memori-program nomor 800H, dengan demikian instruksi AJMP DaerahIni bisa dipakai, karena nomor-memori 800H (tempat instruksi AJMP DaerahIni) dan LABEL DaerahIni yang terletak di dalam satu daerah memori-progam 2 KiloByte yang sama dengan. (Dikatakan terletak di dalam satu daerah memori-program 2 KiloByte yang sama, karena bit nomor 11 sampai dengan bit nomor 15 dari nomor memorinya sama).


Tapi AJMP DaerahLain akan di-salah-kan oleh Assembler, karena DaerahLain yang terletak di memori-program nomor 1000H terletak di daerah memori-program 2 KiloByte yang lain.


Karena instruksi AJMP hanya terdiri dari 2 byte, sedangkan instruksi LJMP 3 byte, maka memakai instruksi AJMP lebih hemat memori-program dibanding dengan LJMP. Hanya saja karena jangkauan instrusksi AJMP hanya 2 KiloByte, pemakaiannya harus hati-hati.


Memori-program IC mikrokontroler AT89C1051 dan AT89C2051 masing-masing hanya 1 KiloByte dan 2 KiloByte, dengan demikian program untuk kedua mikrokontroler di atas tidak perlu memakai instruksi LJMP, karena program yang ditulis tidak mungkin menjangkau lebih dari 2 KiloByte memori-program.

Instruksi SJMP


Nomor memori-program dalam instruksi ini tidak dinyatakan dengan nomor memori-program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai Program Counter saat instruksi ini dilaksanakan.


Pergeseran relatip tersebut dinyatakan dengan 1 byte bilangan 2’s complement, yang bisa dipakai untuk menyakatakan nilai antara –128 sampai dengan +127. Nilai minus dipakai untuk menyatakan bergeser ke instruksi-instruksi sebelumnya, sedangkan nilai positip untuk menyatakan bergeser ke instruksi-instruksi sesudahnya.


Meskipun jangkauan instruksi SJMP hanya –128 sampai +127, tapi instruksi ini tidak dibatasi dengan pengertian daerah memori-program 2 KiloByte yang membatasi instruksi AJMP.





ORG 0F80H


SJMP DaerahLain


. . .


ORG 1000H


DaerahLain:





Dalam potongan program di atas, memori-program 0F80H tidak terletak dalam daerah memori-program 2 KiloByte yang sama dengan 1000H, tapi instruksi SJMP DaerahLain tetap bisa dipakai, asalkan jarak antara instruksi itu dengan LABEL DaerahLain tidak lebih dari 127 byte.

Kelompok Instruksi untuk sub-rutin


Instruksi-instruksi untuk membuat dan memakai sub-rutin/modul program, selain melibatkan Program Counter, melibatkan pula Stack yang diatur oleh Register Stack Pointer.


Sub-rutin merupakan suatu potong program yang karena berbagai pertimbangan dipisahkan dari program utama. Bagian-bagian di program utama akan ‘memanggil’ (CALL) sub-rutin, artinya mikrokontroler sementara meninggalkan alur program utama untuk mengerjakan instruksi-instruksi dalam sub-rutin, selesai mengerjakan sub-rutin mikrokontroler kembali ke alur program utama.


Satu-satunya cara membentuk sub-rutin adalah memberi instruksi RET pada akhir potongan program sub-rutin. Program sub-rutin di-’panggil’ dengan instruksi ACALL atau LCALL.


Agar nantinya mikrokontroler bisa meneruskan alur program utama, pada saat menerima instruksi ACALL atau LCALL, sebelum mikrokontroler pergi mengerjakan sub-rutin, nilai Program Counter saat itu disimpan dulu ke dalam Stack (Stack adalah sebagian kecil dari memori-data yang dipakai untuk menyimpan nilai Program Counter secara otomatis, kerja dari Stack dikendalikan oleh Register Stack Poiner).


Selanjutnya mikrokontroler mengerjakan instruksi-instruksi di dalam sub-rutin sampai menjumpai instruksi RET yang berfungsi sebagai penutup dari sub-rutin. Saat menerima instruksi RET, nilai asal Program Counter sebelum mengerjakan sub-rutin yang disimpan di dalam Stack, dikembalikan ke Program Counter sehingga mikrokontroler bisa meneruskan pekerjaan di alur program utama.


Instruksi ACALL dipakai untuk me-‘manggil’ program sub-rutin dalam daerah memori-program 2 KiloByte yang sama, setara dengan instruksi AJMP yang sudah dibahas di atas. Sedangkan instruksi LCALL setara dengan instruksi LJUMP, yang bisa menjangkau seluruh memori-program mikrokontroler MCS51 sebanyak 64 KiloByte. (Tapi tidak ada instruksi SCALL yang setara dengan instruksi SJMP).


Program untuk AT89C1051 dan AT89C2051 tidak perlu memakai instruksi LCALL.


Instruksi RET dipakai untuk mengakhiri program sub-rutin, di samping itu masih ada pula instruksi RETI, yakni instruksi yang dipakai untuk mengakhiri Program Layanan Interupsi (Interrupt Service Routine), yaitu semacam program sub-rutin yang dijalankan mikrokontroler pada saat mikrokontroler menerima sinyal permintaan interupsi.


Catatan : Saat mikrokontroler menerima sinyal permintaaan interupsi, mikrokontroler akan melakukan satu hal yang setara dengan intruksi LCALL untuk menjalankan Program Layanan Interupsi dari sinyal interupsi bersangkutan. Di samping itu, mikrokontroler juga me-‘mati’-kan sementara mekanisme layanan interupsi, sehingga permintaan interupsi berikutnya tidak dilayani. Saat menerima instruksi RETI, makanisme layanan interusi kembali diaktipkan dan mikrokontroler melaksanakan hal yang setara dengan instruksi RET.

Kelompok Instruksi Jump Bersyarat


Instruksi Jump bersyarat merupakan instruksi inti bagi mikrokontroler, tanpa kelompok instruksi ini program yang ditulis tidak banyak berarti. Instruksi-instruksi ini selain melibatkan Program Counter, melibatkan pula kondisi-kondisi tertentu yang biasanya dicatat dalam bit-bit tertentu yang dihimpun dalam Register tertentu.


Khusus untuk keluarga mikrokontroler MCS51 yang mempunyai kemampuan menangani operasi dalam level bit, instruksi jump bersyarat dalam MCS51 dikaitkan pula dengan kemampuan operasi bit MCS51.


Nomor memori-program baru yang harus dituju tidak dinyatakan dengan nomor memori-program yang sesungguhnya, tapi dinyatakan dengan ‘pergeseran relatip’ terhadap nilai Program Counter saat instruksi ini dilaksana­kan. Cara ini dipakai pula untuk instruksi SJMP.

Instruksi JZ / JNZ


Instruksi JZ (Jump if Zero) dan instruksi JNZ (Jump if not Zero) adalah instruksi JUMP bersyarat yang memantau nilai Akumulator A.





MOV A,#0


JNZ BukanNol


JZ Nol


. . .


BukanNol:


. . .


Nol :


. . .





Dalam contoh program di atas, MOV A,#0 membuat A bernilai nol, hal ini mengakibatkan instruksi JNZ BukanNol tidak akan pernah dikerjakan (JNZ artinya Jump kalau nilai A<>0, syarat ini tidak pernah dipenuhi karena saat instruksi ini dijalankan nilai A=0), sedangankan instruksi JZ Nol selalu dikerjakan karena syaratnya selalu dipenuhi.

Instruksi JC / JNC


Instruksi JC (Jump on Carry) dan instruksi JNC (Jump on no Carry) adalah instruksi jump bersyarat yang memantau nilai bit Carry di dalam Program Status Word (PSW).

Instruksi JB / JNB / JBC


Instruksi JB (Jump on Bit Set), instruksi JNB (Jump on not Bit Set) dan instruksi JBC (Jump on Bit Set Then Clear Bit) merupakan instruksi Jump bersyarat yang memantau nilai-nilai bit tertentu. Bit-bit tertentu bisa merupakan bit-bit dalam register status maupun kaki input mikrokontroler MCS51.

Kelompok Instruksi proses dan test


Instruksi-instruksi Jump bersyarat yang dibahas di atas, memantau kondisi yang sudah terjadi yang dicatat MCS51. Ada dua instruksi yang melakukan dulu suatu proses baru kemudian memantau hasil proses untuk menentukan apakah harus Jump. Kedua instruksi yang dimaksud adalah instruksi DJNZ dan instruksi CJNE.

Instruksi DJNZ


Instruksi DJNZ (Decrement and Jump if not Zero), merupakan instruksi yang akan mengurangi 1 nilai register serbaguna (R0..R7) atau memori-data, dan Jump jika ternyata setelah pengurangan 1 tersebut hasilnya tidak nol.


Contoh berikut merupakan potongan program untuk membentuk waktu tunda secara sederhana :





MOV R0,#23


DJNZ R0,$





Instruksi MOV R0,#23 memberi nilai 23 pada R0, selanjutnya setiap kali instruksi DJNZ R0,$ dikerjakan, MCS51 akan mengurangi nilai R0 dengan ‘1’, jika R0 belum menjadi nol maka MCS51 akan mengulang instruksi tersebut (tanda $ dalam instruksi ini maksudnya adalah kerjakan kembali instruksi ini). Selama mengerjakan 2 instruksi di atas, semua pekerjaan lain akan tertunda, waktu tundanya ditentukan oleh besarnya nilai yang diisikan ke R0.

Instruksi CJNE


Instruksi CJNE (Compare and Jump if Not Equal) membandingkan dua nilai yang disebut dan MCS akan Jump kalau kedua nilai tersebut tidak sama!





MOV A,P1


CJNE A,#0AH,TidakSama


...


SJMP EXIT


;


TidakSama:


...





Instruksi MOV A,P1 membaca nilai input dari Port 1, instruksi CJNE A,#0AH,Tidaksama memeriksa apakah nilai Port 1 yang sudah disimpan di A sama dengan 0AH, jika tidak maka Jump ke TidakSama.
MCS51 BASIC PROGRAMMING
27 September 2007 20:42
Program pengendali mikrokontroler (assembly language) disusun dari sekumpulan instruksi yang setara dengan kalimat perintah dalam bahasa manusia (yang hanya terdiri atas predikat dan objek). Dengan demikian tahap pertama pembuatan program assembly dimulai dengan pengenalan dan pemahaman ‘predikat’ (kata-kerja) dan ‘objek’ apa saja yang dimiliki mikrokontroler.

‘Objek’ dalam pemrograman mikrokontroler adalah data yang tersimpan di dalam memori, register dan input/output. Sedangkan ‘kata kerja’ secara umum dikelompokkan menjadi perintah untuk perpindahan data, arithmatik, operasi logika, pengaturan alur program dan beberapa hal khusus. Kombinasi dari ‘kata kerja’ dan ‘objek’ itulah yang membentuk perintah pengatur kerja mikrokontroler.

Misalkan, Instruksi MOV A,7FH. MOV merupakan ‘kata kerja’ yang berarti memerintahkan peng-copy-an data, sedangkan 7FH merupakan ‘objeknya’ yang berarti nomor memori (alamat) 7FH. Jadi kesimpulannya, Instruksi MOV A,7FH mempunyai arti data yang berada di alamat 7FH di-copy-kan ke Akumulator A. Untuk lebih jelasnya lihat contoh dibawah ini :

ORG 00H
; Isi alamat 7FH dengan data 45H
MOV 7FH,#45H
; Copy-kan data dari alamat 7FH (yaitu data 45H) ke Akumulator A. Jadi, Akumulator A sekarang isinya sama dengan isi register 7FH yaitu 45H
MOV A,7FH
END


A. ADDRESSING MODE

Data bisa berada diberbagai tempat yang berlainan, dengan demikian dikenal beberapa cara untuk menyebut mode pengalamatan data (‘Addressing Mode’), antara lain sebagai berikut :

* Penyebutan data konstan (immediate addressing mode)
Data konstan merupakan data yang berada di dalam instruksi (bagian dari instruksi).

Contoh instruksi : MOV A,#2FH.

Instruksi ini mempunyai makna data konstan 2FH (sebagai data konstan ditandai dengan ‘#’) di-copy-kan ke Akumulator A.

* Penyebutan data secara langsung (direct addressing mode)
Cara ini dipakai untuk menunjuk data yang berada di dalam memori dengan cara menyebut nomor memori tempat data tersebut berada

Contoh instruksi : MOV A,2FH.

Instruksi ini mempunyai makna data yang berada di dalam nomor memori 2FH di-copy-kan ke Akumulator A. Sekilas intruksi ini sama dengan instruksi data konstan di atas, perbedaannya instruksi di atas memakai tanda ‘#’ yang menandai 2FH adalah data konstan, sedangkan dalam instruksi ini karena tidak ada tanda ‘#’ maka 2FH adalah nomor memori (alamat).

* Penyebutan data secara tidak langsung (indirect addressing mode)
Cara ini dipakai untuk menunjuk data yang berada di dalam alamat memori yang mana letaknya selalu berubah-ubah, sehingga nomor memori tidak disebut secara langsung tapi di-‘titip’-kan ke register lain.

Contoh instruksi :
MOV R0,#7FH
MOV A,@R0

Dalam instruksi ini register serba guna R0 dipakai untuk mencatat nomor memori, sehingga instruksi ini mempunyai makna memori yang nomornya tercatat dalam R0 (yaitu memori alamat 7FH) isinya di-copy-kan ke Akumulator A.

Tanda ‘@’ dipakai untuk menandai nomor memori yang disimpan di dalam R0. Bandingkan dengan instruksi penyebutan nomor memori secara langsung di atas, dalam instruksi ini nomor memori terlebih dulu disimpan di R0 dan R0 berperan menunjuk memori mana yang dipakai (R0 sebagai pointer = penunjuk alamat memori), sehingga kalau nilai R0 berubah memori yang ditunjuk juga akan berubah pula (data ikut berubah).

Register serba guna R0 berfungsi dengan register penampung alamat (indirect address register), selain R0 register serba guna R1 juga bisa dipakai sebagai register penampung alamat.

* Penyebutan data dalam register (register addressing mode)
Instruksi ini membuat register serba guna R0 sampai R7 sebagai tempat penyimpan data yang sangat praktis yang kerjanya sangat cepat.

Contoh instruksi : MOV A,R0

Instruksi ini mempunyai arti data dalam register R0 di-copy-kan ke Akumulator A.
Data yang dimaksud dalam bahasan di atas termasuk register, semuanya berada di dalam memori data (RAM = Random Access Memory). Itu berarti data tersebut nilainya dapat diubah-ubah selama program berjalan (data variable).

Dalam penulisan program, sering diperlukan tabel baku (Define Byte = DB) yang disimpan bersama dengan program tersebut. Tabel semacam ini sesungguhnya merupakan data yang berada di dalam memori program (ROM = Read Only Memory), yaitu data yang nilainya tidak bisa diubah sewaktu program berjalan (data constant).

Untuk keperluan ini, MCS51 mempunyai cara penyebutan data dalam memori program yang dilakukan secara indirect (code indirect addressing mode) : MOVC A,@A+DPTR.

Perhatikan dalam instruksi ini MOV digantikan dengan MOVC, tambahan huruf C tersebut dimaksud untuk membedakan bahwa instruksi ini dipakai di memori program. (MOV tanpa huruf C artinya instruksi dipakai di memori data).

Tanda ‘@’ pada A+DPTR dipakai untuk menyatakan nomor memori yang ditunjuk pointer (berupa nilai yang tersimpan dalam DPTR (Data Pointer Register - 2 byte) ditambah dengan nilai yang tersimpan dalam Akumulator A sebesar 1 byte), datanya di-copy-kan ke Akumulator A.


B. INSTRUCTION

Secara keseluruhan AT89Cx051 mempunyai sebanyak 255 macam instruksi, yang dibentuk dengan mengkombinasikan ‘kata kerja’ dan ‘objek’. ‘Kata kerja’ tersebut secara kelompok dibahas sebagai berikut :

1. KELOMPOK PENG-COPY-AN DATA

Kode dasar untuk kelompok ini adalah MOV, singkatan dari MOVE yang artinya memindahkan, meskipun demikian lebih tepat dikatakan perintah ini mempunyai makna peng-copy-an data. Hal ini bisa dijelaskan berikut: setelah instruksi MOV A,R1 dikerjakan, Akumulator A dan register serba guna R1 berisikan data yang sama, yang awalnya tersimpan di dalam R1.

Perintah MOV dibedakan sesuai dengan jenis memori AT89Cx051. Perintah ini pada memori data dituliskan menjadi MOV, misalkan :
MOV A,#20H
MOV A,@R1
MOV A,P1
MOV P2,A

Untuk pemakaian pada memori program, perintah ini dituliskan menjadi MOVC, hanya ada 2 jenis instruksi yang memakai MOVC, yakni:
MOVC A,@A+DPTR ; DPTR sebagai register indirect
MOVC A,@A+PC ; PC sebagai register indirect

Selain itu, masih dikenal pula perintah MOVX, yakni perintah yang dipakai untuk memori data eksternal (X singkatakan dari External). Perintah ini hanya dimiliki oleh anggota keluarga MCS51 yang mempunyai memori data eksternal AT89C51 dan lain sebagainya, dan jelas tidak dikenal oleh kelompok AT89Cx051 yang tidak punya memori data eksternal. Hanya ada 6 macam instruksi yang memakai MOVX, instruksi-instruksi tersebut adalah:
MOVX A,@DPTR
MOVX A,@R0
MOVX A,@R1
MOVX @DPTR,A
MOVX @R0,A
MOVX @R1,A

2. KELOMPOK ARITMATIK (ADD, ADDC, SUBB, DA, MUL dan DIV)

-> Perintah ADD dan ADDC

Isi Akumulator A ditambah dengan bilangan 1 byte, hasil penjumlahan akan ditampung kembali dalam Akumulator. Dalam operasi ini bit Carry (C flag dalam PSW – Program Status Word) berfungsi sebagai penampung limpahan hasil penjumlahan. Jika hasil penjumlahan tersebut melimpah (nilainya lebih besar dari 255) bit Carry akan bernilai ‘1’, kalau tidak bit Carry bernilai ‘0’. ADDC sama dengan ADD, hanya saja dalam ADDC nilai bit Carry dalam proses sebelumnya ikut dijumlahkan bersama.

Bilangan 1 byte yang ditambahkan ke Akumulator A, bisa berasal dari bilangan konstan, dari register serba guna, dari memori data yang nomor memorinya disebut secara langsung maupun tidak langsung, seperti terlihat dalam contoh berikut :
ADD A,R0 ; register serba guna
ADD A,#0FFH ; bilangan konstan
ADD A,@R0 ; no memori tak langsung
ADD A,P1 ; no memori langsung (port 1)

-> Perintah SUBB

Isi Akumulator A dikurangi dengan bilangan 1 byte berikut dengan nilai bit Carry, hasil pengurangan akan ditampung kembali dalam Akumulator A. Dalam operasi ini bit Carry juga berfungsi sebagai penampung limpahan hasil pengurangan. Jika hasil pengurangan tersebut melimpah (nilainya kurang dari 0) bit Carry akan bernilai ‘1’, kalau tidak bit Carry bernilai ‘0’.
SUBB A,R0 ; A = A - R0 - C
SUBB A,#24H ; A = A – 24 - C
SUBB A,@R1
SUBB A,P1

-> Perintah DA

Perintah DA (Decimal Adjust) dipakai setelah perintah ADD, ADDC atau SUBB, dipakai untuk merubah nilai biner 8 bit yang tersimpan dalam Akumulator menjadi 2 buah bilangan desimal yang masing-masing terdiri dari nilai biner 4 bit.

-> Perintah MUL AB

Bilangan biner 8 bit dalam Akumulator A dikalikan dengan bilangan biner 8 bit dalam register B. Hasil perkalian berupa bilangan biner 16 bit, 8 bit bilangan biner yang bobotnya lebih besar ditampung di register B, sedangkan 8 bit lainnya yang bobotnya lebih kecil ditampung di Akumulator A.

Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai hasil perkalian yang ada dalam register B. Bit OV akan bernilai ‘0’ jika register B bernilai ‘0’, kalau tidak bit OV bernilai ‘1’.
MOV A,#30H
MOV B,#0DH
MUL AB

-> Perintah DIV AB

Bilangan biner 8 bit dalam Akumulator A dibagi dengan bilangan biner 8 bit dalam register B. Hasil pembagian berupa bilangan biner 8 bit ditampung di Akumulator, sedangkan sisa pembagian berupa bilangan biner 8 bit ditampung di register B.

Bit OV dalam PSW (Program Status Word) dipakai untuk menandai nilai sebelum pembagian yang ada dalam register B. Bit OV akan bernilai ‘1’ jika register B asalnya bernilai ‘0’.


3. KELOMPOK LOGIKA (ANL, ORL dan XRL)

Kelompok perintah ini dipakai untuk melakukan operasi logika mikrokontroler MCS51, operasi logika yang bisa dilakukan adalah operasi AND (kode operasi ANL), operasi OR (kode operasi ORL) dan operasi Exclusive-OR (kode operasi XRL).

Data yang dipakai dalam operasi ini bisa berupa data yang berada dalam Akumulator atau data yang berada dalam memori data, hal ini sedikit berlainan dengan operasi aritmatik yang harus melihatkan Akumulator secara aktif. Hasil operasi ditampung di sumber data yang pertama.

-> Operasi logika AND

Banyak dipakai untuk me-‘0’-kan beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-ANL-kan bilangan asal. Bit yang ingin di-‘0’-kan diwakili dengan ‘0’ pada data konstan, sedangkan bit lainnya diberi nilai ‘1’, misalnya

Instruksi ANL P1,#01111110B akan mengakibatkan bit 0 dan bit 7 dari Port 1 (P1) bernilai ‘0’ sedangkan bit-bit lainnya tetap tidak berubah nilai.

-> Operasi logika OR

Banyak dipakai untuk me-‘1’-kan beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-ORL-kan bilangan asal. Bit yang ingin di-‘1’-kan diwakili dengan ‘1’ pada data konstan, sedangkan bit lainnya diberi nilai ‘0’, misalnya

Instruksi ORL A,#01111110B akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator bernilai ‘1’ sedangkan bit-bit lainnya tetap tidak berubah nilai.

-> Operasi logika Exclusive OR (XOR)

Banyak dipakai untuk membalik nilai (complement) beberapa bit tertentu dari sebuah bilangan biner 8 bit, caranya dengan membentuk sebuah bilangan biner 8 bit sebagai data konstan yang di-XRL-kan bilangan asal. Bit yang ingin dibalik-nilai diwakili dengan ‘1’' pada data konstan, sedangkan bit lainnya diberi nilai ‘0’,

misalnya,
Instruksi XRL A,#01111110B akan mengakibatkan bit 1 sampai dengan bit 6 dari Akumulator berbalik nilai, sedangkan bit-bit lainnya tetap tidak berubah nilai.

Tidak ada komentar: