Anda di halaman 1dari 18

Mikroprosesor 

BAB 7
BAHASA PEMROGRAMAN MIKROPROSESOR

7.1 Mengenal Bahasa Assembly


Apa itu bahasa Assembly ? Bahasa assembly adalah bahasa
pemrograman yang perintah-perintahnya hanya khusus bisa dikenali
sesuai dengan jenis mikroprosesornya.
Bahasa assembly dibuat oleh masing-masing pabrikan yang
memproduksi mikroprosesor sehingga bahasa assembly bersifat unik,
artinya masing-masing bahasa assembly belum tentu sama antara
pabrikan satu dengan yang lain. Misalnya pabrikan Intel dan Motorola
sama-sama memproduksi mikroprosesor, maka bahasa assembly untuk
mikroprosesornya pasti akan berbeda. Tidak ada peraturan khusus yang
mengatur tentang bagaimana bahasa assembly harus dibuat, pembuatan
bahasa assembly adalah hak mutlak dari pabrikan yang memproduksi
mikroprosesor dan setiap pabrikan bebas menentukan atau membuat
bahasa assemblynya.
Di bab 1 sudah disinggung bahwa sebuah mikroprosesor/mikrokontroler
tidak akan bekerja jika tidak ada daftar perintah (program) yang
diberikan kepadanya. Daftar perintah atau program tersebut merupakan
apa-apa saja yang harus dikerjakan oleh mikroprosesor/mikrokontroler.
Mikroprosesor/mikrokontroler 8031 menyediakan 256 perangkat
instruksi. Berdasarkan penggunaan memorinya, dari 256 instruksi
tersebut dikelompokkan menjadi 4 jenis perintah yaitu perintah 1 byte
sampai 4 byte. Jika frekuensi clock yang digunakan
mikroprosesor/mikrokontroler sebesar 12 MHz, maka lama waktu untuk
mengerjakan perintah tersebut bervariasi antara 1 sampai 12 mikrodetik.
Pada umumnya struktur pemrograman biasanya mencakup struktur dasar
yaitu :
- Transfer data atau assignment
- Operator aritmatika
- Operator logika
- Operator relasi dan pengambilan keputusan atau decision
- Perulangan atau looping

Putut Son Maria Bab 5 Halaman 1


Mikroprosesor 

Tetapi khusus untuk pemrograman mikroprosesor, biasanya


ditambahkan lagi dengan struktur :
- Input Output
- Sub Rutin

Pemrograman menggunakan bahasa assembly relatif lebih rumit


dibandingkan dengan pemrograman menggunakan bahasa tingkat tinggi
lain seperti bahasa C, Pascal atau Basic. Memprogram menggunakan
bahasa assembly membutuhkan usaha 2x lipat karena programmer harus
tahu tentang pengetahuan dasar tentang jenis mikroprosesor yang akan
diprogram dan fitur yang ada di dalam mikroprosesor tersebut. Belum
lagi karakter dari bahasa assembly yang tidak terstruktur membuat
programmer pemula memerlukan waktu adaptasi yang relatif lama untuk
sampai pada tahap “paham”. Itu sebabnya bahasa assembly dijuluki
sebagai “spagheti code” karena jika programmer tidak pandai
mensiasatinya maka struktur programnya akan menjadi ruwet dan kusut.
Oleh karena itu untuk memudahkan dan mengantisipasi supaya
kode program dalam bahasa assembly lebih terstruktur, biasanya
terdapat 2 kelompok perintah dalam bahasa assembly yaitu :
1. Assembly Directive (atau disebut sebagai directive) yaitu merupakan
kode yang menjadi arahan bagi assembler/compiler untuk menata
program. Directive sebenarnya bukanlah perintah utama yang akan
sering ditulis berulang-ulang, namun directive lebih kepada untuk
memudahkan programmer dalam menentukan offset data, persamaan
nama register, menentukan offset tabel data dan pengaturan-pengaturan
terhadap resource dari minimum sistem. Pada pemrograman yang
sederhana, directive tidak akan terasa efektifitasnya, tetapi pada
pemrograman yang komplek, maka directive akan sangat membantu
programmer untuk menata dan menghemat penggunaan memori dalam
otak programmer. Contoh directive untuk mikroprosesor 8031
diperlihatkan pada tabel 7.1.
2. Instruksi atau perintah yaitu kode yang harus dieksekusi oleh
mikroprosesor dengan melakukan operasi tertentu. Seorang programmer
boleh jadi tidak harus hafal dengan daftar directive, tetapi programmer
assembly wajib hafal tentang daftar perintah utama dari mikroprosesor.
Mnemonic atau daftar kode perintah utama untuk mikroprosesor 8031
diperlihatkan pada tabel 7.2.

Putut Son Maria Bab 5 Halaman 2


Mikroprosesor 

Tabel 7.1Daftar Kode Assembly Directive


Assembly Directive Keterangan
EQU Pendefinisian konstanta
DB Pendefinisian data dengan ukuran satuan 1 byte
DW Pendefinisian data dengan ukuran satuan 1 word
DBIT Pendefinisian data dengan ukuran satuan 1 bit
DS Pemesanan tempat penyimpanan data di RAM
ORG Inisialisasi alamat mulai program
END Penanda akhir program
CSEG Penanda penempatan di code segment
XSEG Penanda penempatan di external data segment
DSEG Penanda penempatan di internal direct data
segment
ISEG Penanda penempatan di internal indirect data
segment
BSEG Penanda penempatan di bit data segment
CODE Penanda mulai pendefinisian program
XDATA Pendefinisian external data
DATA Pendefinisian internal direct data
IDATA Pendefinisian internal indirect data
BIT Pendefinisian data bit
#INCLUDE Mengikutsertakan file program lain

Tabel 7.2 Daftar Kode Perintah


Instruksi Keterangan
ACALL Absolute Call
ADD Add
ADDC Add with Carry
AJMP Absolute Jump
ANL AND Logic
CJNE Compare and Jump if Not Equal
CLR Clear
CPL Complement
DA Decimal Adjust
DEC Decrement
DIV Divide

Putut Son Maria Bab 5 Halaman 3


Mikroprosesor 

DJNZ Decrement and Jump if Not Zero


INC Increment
JB Jump if Bit Set
JBC Jump if Bit Set and Clear Bit
JC Jump if Carry Set
JMP Jump to Address
JNB Jump if Not Bit Set
JNC Jump if Carry Not Set
JNZ Jump if Accumulator Not Zero
JZ Jump if Accumulator Zero
LCALL Long Call
LJMP Long Jump
MOV Move from Memory
MOVC Move from Code Memory
MOVX Move from Extended Memory
MUL Multiply
NOP No Operation
ORL OR Logic
POP Pop Value From Stack
PUSH Push Value Onto Stack
RET Return From Subroutine
RETI Return From Interrupt
RL Rotate Left
RLC Rotate Left through Carry
RR Rotate Right
RRC Rotate Right through Carry
SETB Set Bit
SJMP Short Jump
SUBB Subtract With Borrow
SWAP Swap Nibbles
XCH Exchange Bytes
XCHD Exchange Digits
XRL Exclusive OR Logic

Mnemonic untuk mikroprosesor memang tidak banyak seperti halnya


bahasa pemrograman high level language, karena mnemonic merupakan
bahasa dasar yang disesuaikan dengan resource dari mesin

Putut Son Maria Bab 5 Halaman 4


Mikroprosesor 

mikroprosesor. Namun demikian dengan menggunakan mnemonic yang


ada, maka seorang programmer dapat mengembangkannya menjadi
perintah yang komplek, seperti misalnya function, prosedur atau sub-
rutin.
7.2 Register
Jika anda pernah belajar high level language(HLL) programming,
maka biasanya akan diperkenalkan dengan variabel, cara deklarasinya,
jenisnya dan kegunaannya. Dalam bahasa assembly, tidak mengenal
yang namanya variabel, namun ada penggantinya yaitu register. Jika
dalam HLL jumlah dan jenisnya tidak terbatas, maka register dalam
bahasa assembly jumlah dan jenisnya sangat terbatas.
Biasanya jenis register dalam resource mikroprosesor ada 2
kelompok yaitu : general purpose register (GPR) dan special function
register (SFR). GPR adalah kelompok register yang penggunaannya
ditujukan untuk digunakan operasi secara umum, misalnya operasi
aritmatika, logika dan transfer data. Kurang lebih ada 10 register yang
termasuk dalam kelompok GPR yaitu accumulator (register A), register
B, register R0 sampai R7. Gambar 7.1 memperlihatkan GPR yang ada
dalam mikroprosesor 8031. GPR dapat juga disebut sebagai register
yang merupakan ekivalensi dari “variabel” dalam bahasa pemrograman
HLL, namun tentu saja jumlah register GPR tidaklah sebanyak seperti
dalam HLL.

Gambar 7.1 Daftar General Purpose Register (GPR) Dalam


Mikrokontroler 8031

Putut Son Maria Bab 5 Halaman 5


Mikroprosesor 

Gambar 7.2 Daftar Special Function Register (SFR) Dalam


Mikrokontroler 8031
Special Function Register (SFR) adalah register yang
penggunaannya ditujukan untuk operasi khusus, misalnya untuk
menyimpan alamat memori 16 bit, untuk menyimpan alamat I/O, untuk
menentukan offset pada stack memori dan lain sebagainya. Gambar 7.2
memperlihatkan beberapa SFR yang sering dipakai untuk pemrograman
tingkat dasar.
7.3 Transfer Data
Transfer data atau disebut juga sebagai addressing mode adalah
mekanisma duplikasi data dari satu operand ke operand lainnya. Tabel
7.3 memperlihatkan kategori dan contoh perintah yang termasuk
kategori transfer data :
Tabel 7.3 Daftar Kode Perintah Transfer Data
Kategori Contoh Keterangan
Register  Mov A, R1 menduplikat isi register R1 ke
Register register A
Memori  Memori Mov A, @R2 menduplikat isi memori yang
alamatnya ditunjuk oleh
register R2 ke register A
Register  Mov @R1, A Menduplikat isi register A ke
Memori memori yang alamatnya
ditunjuk oleh register R1

Putut Son Maria Bab 5 Halaman 6


Mikroprosesor 

I/O  Register Mov A, P1 Menduplikat isi register P1 ke


register A (*)
I/O  Memori Mov P1, A Menduplikat isi register A ke
register P1 (*)
(*) = P1 adalah salah satu Port I/O pada mikrokontroler 8031

Yang harus diperhatikan dalam memahami kode bahasa assembly


untuk kategori transfer data adalah bahwa arah aliran data dari kanan ke
kiri. Format transfer data pada bahasa assembly MCS-51 sebagai
berikut :
Instruction destination_operand , source_operand
Instruction adalah perintah transfer data yang digunakan
Destination operand adalah operand tujuan (penerima data)
Source operand adalah sumber data (pengirim data)
Jadi operand yang berada di sebelah kiri koma adalah destination
operand. Format seperti ini merupakan kebebasan kreasi dari pabrikan,
mirip dengan format yang digunakan oleh Zilog atau Microchip, karena
ada juga format lain yang menetapkan destination operand di sebelah
kanan koma seperti misalnya pada bahasa assembly yang digunakan
pada mikroprosesor Motorola.
7.4 Operator Aritmatika
Operator aritmatika standar mencakup 4 operasi yaitu :
penjumlahan, pengurangan, perkalian dan pembagian. Masing-masing
operasi akan dijelaskan sebagai berikut :
Penjumlahan (ADD)
Instruksi ini akan menjumlahkan sebuah byte dengan isi data pada
register A dan hasilnya disimpan di register A. Penjumlahan hanya bisa
melibatkan register A. ada 2 macam operator penjumlahan yaitu tanpa
carry dan dengan carry. Contohnya :
ADD A, #85H ; register A = register A + 85 Hex
ADDC A, #85 ; register A = register A + 85 Dec + Carry

Putut Son Maria Bab 5 Halaman 7


Mikroprosesor 

Pengurangan (SUBB)
Instruksi ini akan mengurangi isi data pada register A dengan sebuah
byte dan dikurangi lagi dengan carry dan hasilnya disimpan di register
A. Mirip dengan penjumlahan, pengurangan hanya bisa melibatkan
register A. Contohnya :
SUBB A, #85H ; register A = register A - 85 Hex - carry
Perkalian (MUL)
Instruksi ini akan mengalikan isi data pada register A dengan register B
dan hasilnya disimpan di register A. Contohnya :
MUL AB ; register A = register A * register B
Pembagian (DIV)
Instruksi ini akan membagi isi data pada register A dengan register B
dan hasilnya disimpan di register A. Contohnya :
DIV AB ; register A = register A/register B (*)
(*) = karena register merupakan tipe byte, maka hasil pembagian akan
selalu bertipe byte atau bilangan bulat.
Selain dari operator aritmatika di atas, ada operator jenis unary yang
termasuk operator aritmatika yaitu :
Penambahan Satu (INC)
INC merupakan singkatan dari Increment, instruksi ini akan menambah
isi data pada destination operand dengan konstanta 1. Contohnya :
INC A ; register A = register A + 1
Pengurangan Satu (DEC)
DEC merupakan singkatan dari decrement, instruksi ini akan
mengurangi isi data pada destination operand dengan konstanta 1.
Contohnya :
DEC A ; register A = register A - 1

Putut Son Maria Bab 5 Halaman 8


Mikroprosesor 

(*) = Operator unary menghemat pemakaian memori karena termasuk


dalam perintah 1 byte.
7.5 Operator Logika
Ada 3 operator logika dasar yang pasti ada di setiap mikroprosesor,
yaitu AND, OR dan NOT. Dalam bahasa assembly MCS-51 ditambah
dengan operator XOR.
Logika AND (ANL)
Instruksi ini melakukan proses logika AND antara source operand
dengan register, register dengan data konstanta, carry flag dengan isi
suatu alamat bit dan lain-lain. Contohnya : misalnya register A = 1011
1011 Bin, dan register R0 = 1010 1010 Bin, jika perintah :
ANL A, R0
dijalankan maka isi register A = 1011 1011 & 1010 1010 = 1010 1010
Bin.
Logika OR (ORL)
Instruksi ini melakukan proses logika OR antara source operand dengan
register, register dengan data konstanta, carry flag dengan isi suatu
alamat bit dan lain-lain. Contohnya : misalnya register A = 1011 1011
Bin, dan register R0 = 1010 1010 Bin, jika perintah :
ORL A, R0
dijalankan maka isi register A = 1011 1011 | 1010 1010 = 1011 1011
Bin.
Logika NOT (CPL)
Instruksi ini melakukan proses logika NOT terhadap source operand,
carry flag atau isi suatu alamat bit. Contohnya : misalnya register A =
0101 1100 Bin, jika perintah :
CPL A
dijalankan maka isi register A = 1010 0011 Bin = A3 Hex.

Putut Son Maria Bab 5 Halaman 9


Mikroprosesor 

Logika XOR (XRL)


Instruksi ini melakukan proses logika XOR antara source operand
dengan register, register dengan data konstanta, carry flag dengan isi
suatu alamat bit dan lain-lain. Contohnya : misalnya register A = 1011
1111 Bin, dan register B = 1111 1111 Bin, jika perintah :
XRL A, B
dijalankan maka isi register A = 0100 0000 Bin = 40 Hex.
7.6 Operator Perbandingan Dan Percabangan
Pada bahasa pemrograman HLL, pengambilan keputusan biasanya
dilakukan setelah adanya operasi perbandingan atau seleksi kondisi.
Aliran program dapat dibelokkan kemana saja setelah prasyaratnya
terpenuhi. Sebagian besar HLL menggunakan hasil dari sebuah
perbandingan sebagai prasyarat untuk menuju suatu blok perintah
tertentu, sehingga dengan demikian program terarah secara ketat dan
baik sehingga mudah dilakukan debugging jika terjadi masalah.
Berbeda dengan bahasa program HLL, bahasa assembly justru
memiliki kebebasan yang tak terbatas dalam melakukan “lompatan”
dalam program. Kebebasan disini bisa menjadi sesuatu yang
menguntungkan, tapi juga bisa merugikan. Menguntungkan karena
programmer dapat mengakses secara langsung tanpa syarat ke semua
alamat program yang manapun sehingga aliran program dapat
dimanipulasi sedemikian rupa agar tidak mudah dilacak. Tapi ini juga
merugikan karena seandainya terjadi masalah dengan program, maka
untuk melakukan debugging menjadi sangat rumit dikarenakan aliran
program yang sangat acak dan tidak pasti ujung pangkalnya.
Dalam struktur bahasa assembly dikenal 2 jenis percabangan yaitu :
percabangan bersyarat dan percabangan tidak bersyarat. Struktur
percabangan bersyarat relatif sama dengan pemrograman pada HLL,
agak sulit untuk dipahami tetapi menjadikan aliran program lebih rapi.
Sedangkan struktur percabangan tidak bersyarat lebih mudah dipelajari
tetapi membuat aliran program menjadi kusut.
Percabangan bersyarat
Beberapa contoh perintah percabangan bersyarat diantaranya adalah :

Putut Son Maria Bab 5 Halaman 10


Mikroprosesor 

CJNE : Instruksi ini membandingkan isi register atau isi memori dengan
sutau data. Jika sama, instruksi baris berikutnya akan dikerjakan, jika
tidak sama maka instruksi yang ditunjuk oleh label akan dikerjakan.
Contoh : CJNE R0, #20, tidak_sama
Keterangan : jika isi register R0 tidak sama dengan 20, maka aliran
program akan menuju ke label tidak_sama
DJNZ : Instruksi ini mengurangi isi register atau memori dengan satu,
jika = 0 maka instruksi baris berikutnya dikerjakan, jika ≠ 0 maka
instruksi diarahkan ke label.
Contoh : DJNZ R0, ulang
Keterangan : isi register R0 dikurangi 1, jika ≠ 0 maka lanjut ke label
ulang
JB : Instruksi ini menguji kondisi suatu bit, jika bit yang diuji = 1 maka
lanjut ke label. Jika bit yang diuji = 0 maka lanjut ke instruksi
berikutnya.
Contoh : JB TF0, ulang
Keterangan : jika bit pada TF0 = 1 maka lanjut ke label ulang
JC : Instruksi ini menguji kondisi carry flag, jika carry flag = 1 maka
lanjut ke label. Jika carry flag = 0 maka lanjut ke instruksi berikutnya.
JZ : Instruksi ini menguji isi register A, jika register A = 0 maka lanjut
ke label. Jika register A ≠ 0 maka lanjut ke instruksi berikutnya.
JNZ : Instruksi ini menguji isi register A, jika register A ≠ 0 maka lanjut
ke label. Jika register A = 0 maka lanjut ke instruksi berikutnya.
Percabangan tidak bersyarat
Beberapa contoh perintah percabangan tidak bersyarat diantaranya
adalah :
SJMP : Instruksi ini langsung mengarahkan aliran program menuju ke
alamat yang ditunjuk.
Contoh : SJMP mulai
Keterangan : menuju ke label mulai

Putut Son Maria Bab 5 Halaman 11


Mikroprosesor 

LJMP : Instruksi ini langsung mengarahkan aliran program menuju ke


alamat yang ditunjuk.
Contoh : LJMP mulai
Keterangan : menuju ke label mulai. Beda LJMP dengan SJMP adalah
pada jangkauan program untuk “melompat” ke alamat yang dituju. Jika
SJMP dibatasi hanya 128 alamat ke depan atau belakang, sedangkan
LJMP dibatasi sampai 16 bit maju atau mundur.

7.7 Perulangan atau looping


Pada bahasa pemrograman HLL seperti bahasa C, terdapat struktur
perulangan atau looping misalnya for, while dan do while. Struktur
perulangan dalam bahasa assembly tidak disusun secara eksplisit
menjadi sebuah instruksi khusus, sehingga jika menginginkan struktur
perulangan dalam bahasa assembly terpaksa harus dibangun
menggunakan instruksi dasar yang sudah ada. Apakah bisa ? Ya pasti
bisa. Logikanya, pada hirarki penterjemahan program (lihat lampiran A),
bahasa program HLL apapun pada saat dikompilasi akan diubah (baca :
diterjemahkan) menjadi bahasa assembly, artinya sintak perulangan
seperti yang ada dalam bahasa C (for, while,do while) itu semua
merupakan manifestasi lanjutan dari bahasa assembly. Oleh karena itu
untuk mewujudkan struktur perulangan menggunakan bahasa assembly
memerlukan kecerdasan programmer dalam membangunnya.
Pada sub bab 7.6 sebenarnya sudah disinggung tentang instruksi
yang dapat digunakan untuk membangun struktur perulangan yaitu
CJNE dan DJNZ. Kedua instruksi tersebut sebenarnya adalah kombinasi
antara instruksi perbandingan dan percabangan bersyarat. Yang harus
diingat adalah bahwa bahasa assembly berorientasi kepada mesin, bukan
kepada problem secara umum, artinya adalah struktur dalam bahasa
pemrograman yang bisa dibangun dari perintah dasar, maka tidak perlu
dibuat lagi perintah khususnya, dan penggunaan variabel yang biasa
dijumpai pada bahasa pemrograman HLL menjadi sangat dibatasi oleh
resource dari mikroprosesor yang akan menjalankan program.
CJNE
Instruksi ini merupakan kombinasi antara perintah perbandingan
dan perintah percabangan. CJNE yang merupakan akronim dari compare

Putut Son Maria Bab 5 Halaman 12


Mikroprosesor 

and jump if not equal dapat diterjemahkan menjadi : bandingkan dan


lompat jika tidak sama. Proses perbandingannya sendiri sudah dilakukan
secara internal dalam mikroprosesor, dan programmer cukup
menggunakan hasil dari perbandingan sebelumnya untuk mengarahkan
aliran program, aliran programnya diperlihatkan seperti gambar 7.3.
Sebagai contoh seperti pada pseudo code berikut :
MOV A, #0
MOV R0, #10
Naikkan: ADD A, #1
Bandingkan : CJNE A, R0, Naikkan
Sama : NOP

Gambar 7.3 Diagram Alir Perintah CJNE


Keterangan :
Baris 1  register A diisi nilai 1
Baris 2  register R0 diisi nilai 10
Baris 3  isi register A ditambah 1
Baris 4  isi register A dibandingkan dengan R0, jika tidak sama maka
lanjut ke Baris 3
Baris 5  selesai

Karena perintah CJNE mengandung operasi perbandingan, maka


CJNE termasuk perintah binary, karena harus ada 2 operand yang
menjadi subyeknya. CJNE dapat digunakan sebagai proses looping atau
tidak sangat bergantung kepada programmer. Pada contoh di atas,

Putut Son Maria Bab 5 Halaman 13


Mikroprosesor 

perintah CJNE digunakan untuk melakukan perulangan selama nilai


register A belum sama dengan register R0.

DJNZ
Instruksi ini termasuk perintah unary, yaitu hanya memerlukan satu
operand saja untuk dievaluasi. DJNZ akronim dari decrement and jump
if not zero, terjemahannya : kurangi 1 dan lompat jika tidak nol. Aliran
programnya diperlihatkan seperti gambar 7.4. Sebagai contoh seperti
pada pseudo code berikut :

MOV A, #10
Test_nilai : DJNZ A, Test_nilai
Nol : NOP

Gambar 7.4 Diagram Alir Perintah DJNZ


Keterangan :
Baris 1  register A diisi nilai 10
Baris 2  register A dikurangi 1, jika tidak nol maka lompat ke Baris 2
Baris 3  selesai

Jika dilihat dari diagram alir pada gambar 7.4, maka perintah DJNZ
dapat digunakan untuk mengarahkan program sehingga terjadi looping
selama kondisinya belum terpenuhi, pada contoh program di atas adalah
jika isi register A belum nol maka program akan terus looping.

Putut Son Maria Bab 5 Halaman 14


Mikroprosesor 

7.8 Input Output


Pengertian Input/Output yang dimaksud dalam pemrograman
bahasa assembly biasanya adalah pembacaan data dari Port atau
pengiriman data ke Port tertentu. Pada bahasa assembly MCS-51,
tersedia 2 kelompok perintah yang dapat digunakan untuk mengakses
Port, perbedannya terletak pada alamat Port yang diakses apakah 8 Bit
atau 16 Bit. Jika alamat Port-nya menggunakan 8 Bit, maka cukup
menggunakan register R0 atau R1 sebagai penunjuk alamat Port-nya,
tetapi jika alamat Port-nya 16 bit maka digunakan register DPH dan
DPL yang tergabung menjadi register DPTR. Perintah akses ke Port
diperlihatkan pada tabel 7.4
Tabel 7.4 Daftar Kode Perintah Akses ke Port
Contoh Perintah Keterangan Kategori
MOV A, P1 Menyimpan data dari Port 1 Akses
ke Reg. A Alamat Port
MOV P1, A Mengirim data dari Reg. A ke 8 Bit
Port 1

MOVX A, @DPTR Menyimpan data dari Port Akses


Peripheral ke Reg. A Alamat Port
MOVX @DPTR, A Mengirim data dari Reg. A ke 16 Bit
Port Peripheral

Alamat Port 8 Bit


Semua Port pada chip mikrokontroler 8031 menggunakan alamat 8 Bit,
artinya untuk mengakses alamat port tersebut dapat menggunakan R0
atau R1, atau bisa juga langsung menuliskan nama Port-nya, misalnya
P1 atau P3 (harus diingat bahwa pada sebuah minimum sistem berbasis
8031 maka P0 dan P2 akan terpakai untuk jalur alamat atau address
bus). Misalnya rangkaian seperti ditunjukkan pada gambar 7.5, dimana
Port 1 dihubungkan dengan lampu LED. Untuk menyalakan 1 lampu
LED yang paling kanan maka logika pada Port 1 Bit 0 harus disetting
LOW dan yang lainnya harus disetting HIGH. (Ingat ! bahwa Port 1
bersifat open drain), sehingga pseudo code-nya adalah :
MOV P1, #11111110B atau MOV P1, #0FEH

Putut Son Maria Bab 5 Halaman 15


Mikroprosesor 

X1

CRYSTAL

U1 U3 U2
C1 C2 19 39 d0 d0 3 2 a0 a0 8 9 d0
XTAL1 P0.0/AD0 D0 Q0 A0 D0
38 d1 d1 4 5 a1 a1 7 10 d1
22p 22p P0.1/AD1 D1 Q1 A1 D1
37 d2 d2 7 6 a2 a2 6 11 d2
P0.2/AD2 D2 Q2 A2 D2
18 36 d3 d3 8 9 a3 a3 5 13 d3
XTAL2 P0.3/AD3 D3 Q3 A3 D3
35 d4 d4 13 12 a4 a4 4 14 d4
P0.4/AD4 D4 Q4 A4 D4
34 d5 d5 14 15 a5 a5 3 15 d5
P0.5/AD5 D5 Q5 A5 D5
33 d6 d6 17 16 a6 a6 2 16 d6
P0.6/AD6 D6 Q6 A6 D6
9 32 d7 d7 18 19 a7 a7 1 17 d7
VCC RST P0.7/AD7 D7 Q7 A7 D7
a8 23
A8
21 a8 1 a9 22
P2.0/A8 OE A9
22 a9 11 a10 19
P2.1/A9 LE A10
23 a10 a11 21
P2.2/A10 A11
29 24 a11 74HC373
PSEN P2.3/A11
ale 30 25 a12 a12 18
ALE P2.4/A12 CE
31 26 20
EA P2.5/A13 OE/VPP
C3 P2.6/A14
27
10u 28 2732
P2.7/A15

ale
rst p10 1 10
P1.0 P3.0/RXD
p11 2 11
P1.1 P3.1/TXD
p12 3 12
P1.2 P3.2/INT0
R1 p13 4 13
P1.3 P3.3/INT1
p14 5 14
1k P1.4 P3.4/T0
p15 6 15
P1.5 P3.5/T1
p16 7 16
P1.6 P3.6/WR
p17 8 17
P1.7 P3.7/RD
80C31

D7 D6 D5 D4 D3 D2 D1 D0
p17

p16

p15

p14

p13

p12

p11

p10
Gambar 7.5 Port 1 Terhubung ke LED
Sifat open drain pada Port 1 membuat kita harus berpikir secara terbalik,
biasanya logika 1 atau HIGH ekivalen dengan tegangan 5 Volt sehingga
dapat langsung digunakan untuk menyalakan LED. Tapi karena sifat
open drain maka untuk menyalakan LED justru harus diberikan logika
LOW, dan ini hanya berlaku jika LED terhubung secara pull up.

Alamat Port 16 Bit


Satu Port I/O yang masih tersisa seperti pada gambar 7.5 mungkin tidak
akan cukup jika piranti yang harus dikontrol jumlahnya banyak. Oleh
karena itu dengan menambahkan PPI 8255 kita dapat memiliki lebih
banyak Port I/O yang bisa digunakan untuk apa saja. Penetapan alamat
peripheral seperti PPI 8255 sebenarnya tidak ada standar bakunya,
namun kita ingat bahwa tidak boleh terjadi redundansi alamat dalam
suatu sistem mikroprosesor. Itu artinya alamat peripheral akan lebih
aman jika menggunakan alamat 16 Bit seperti ditunjukkan pada gambar
7.6.

Putut Son Maria Bab 5 Halaman 16


Mikroprosesor 

Pada rangkaian gambar 7.6 alamat PPI 8255 dimulai dari 8000 Hex
dan berakhir di 8003 Hex. Karena offset alamatnya menggunakan 16
Bit, maka kode perintah yang digunakan juga harus 16 Bit.
X1
VCC

CRYSTAL

RP?
1
U1 U3 U2
C1 C2 19 39 d0 d0 3 2 a0 a0 8 9 d0 d0 2
XTAL1 P0.0/AD0 D0 Q0 A0 D0
38 d1 d1 4 5 a1 a1 7 10 d1 d1 3
22p 22p P0.1/AD1 D1 Q1 A1 D1
37 d2 d2 7 6 a2 a2 6 11 d2 d2 4
P0.2/AD2 D2 Q2 A2 D2
18 36 d3 d3 8 9 a3 a3 5 13 d3 d3 5
XTAL2 P0.3/AD3 D3 Q3 A3 D3
35 d4 d4 13 12 a4 a4 4 14 d4 d4 6
P0.4/AD4 D4 Q4 A4 D4
34 d5 d5 14 15 a5 a5 3 15 d5 d5 7
P0.5/AD5 D5 Q5 A5 D5
33 d6 d6 17 16 a6 a6 2 16 d6 d6 8
P0.6/AD6 D6 Q6 A6 D6
9 32 d7 d7 18 19 a7 a7 1 17 d7 d7 9
RST P0.7/AD7 D7 Q7 A7 D7
a8 23
A8
21 a8 1 a9 22 RESPACK-8
VCC P2.0/A8 OE A9
22 a9 11 a10 19
P2.1/A9 LE A10
23 a10 a11 21
P2.2/A10 A11
29 24 a11 74HC373
PSEN P2.3/A11
ale 30 25 18
ALE P2.4/A12 CE
31 26 20
EA P2.5/A13 OE/VPP
27
P2.6/A14
28 2732
P2.7/A15
C3

ale
1u 1 10
P1.0 P3.0/RXD U9 U6 RP1
2 11
P1.1 P3.1/TXD
rst 3 12 d0 34 4 1 20 9
P1.2 P3.2/INT0 D0 PA0
4 13 d1 33 3 2 19 8
P1.3 P3.3/INT1 D1 PA1
5 14 d2 32 2 3 18 7
P1.4 P3.4/T0 D2 PA2
R1 6 15 d3 31 1 4 17 6
P1.5 P3.5/T1 D3 PA3
7 16 wr d4 30 40 5 16 5
1k P1.6 P3.6/WR D4 PA4
8 17 rd d5 29 39 6 15 4
P1.7 P3.7/RD D5 PA5
d6 28 38 7 14 3
D6 PA6
80C31 d7 27 37 8 13 2
D7 PA7
DBG_FETCH=1 9 12
rd 5 18 10 11 1
RD PB0
wr 36 19
WR PB1
a0 9 20 LED-BARGRAPH-GRN 330
A0 PB2
a1 8 21
A1 PB3
35 22
RESET PB4
U10:A PB5
23
6 24
CS PB6
1 2 25
PB7
14
7404 PC0
15
PC1
16
PC2
17
PC3
13
PC4
12
PC5
11
PC6
10
PC7

8255A

Gambar 7.6 PPI 8255 Pada Minimum Sistem


Misalnya seperti pada gambar 7.6, Port A berada di alamat 8000 Hex
dan terhubung dengan LED. Maka untuk mengakses ke Port A harus
melibatkan register DPTR seperti pada pseudo code berikut :
MOV DPTR, #8000H
MOV A, #10H
MOVX @DPTR, A
Keterangan :
Baris 1  register DPTR diisi nilai 8000 Hex
Baris 2  register A diisi nilai 10 Hex
Baris 3  isi register A dikirim ke Port A (alamat 8000 Hex)

Cuplikan pseudo code di atas hanyalah memperlihatkan perintah untuk


mengirimkan data ke Port A dan tidak memperlihatkan program untuk
inisialisasi PPI.

Putut Son Maria Bab 5 Halaman 17


Mikroprosesor 

Register DPTR bertugas untuk “mengingat” alamat Port A (8000 Hex),


sedangkan register A bertugas untuk “membawa” data yang akan
dikirimkan. Pada saat perintah :
MOVX @DPTR, A
dijalankan, maka lampu LED pada Port A akan menyala 1 buah pada bit
ke 4. (10 Hex = 0001 0000 Bin)
Karakter Port pada PPI bukanlah open drain, sehingga logika 1 atau 0
dapat langsung digunakan untuk menyalakan atau memadamkan lampu
LED pada Port A. Dengan adanya 3 Port tambahan pada PPI, maka
sistem minimum pada gambar 7.6 menjadi “kaya” akan Port I/O, dan
dengan menambahkan PPI yang lainnya maka akan bertambah lagi 3
Port tambahan yang membuat sistem minimum memiliki 6 Port + 1 Port
= 7 Port I/O yang dapat digunakan untuk berbagai keperluan.

Brain storming
Penambahan PPI 8255 memang dapat menjadi solusi apabila minimum
sistem kekurangan Port I/O. Namun harus dipertimbangkan juga apakah
penambahan Port tersebut efisien atau tidak. Penambahan PPI berarti
menambah rumit pengkabelan pada sistem minimum, tetapi
memudahkan pemrograman. Sebaliknya jika tidak menambah PPI maka
rangkaian menjadi lebih compact, tetapi mungkin program menjadi lebih
rumit. Setiap penambahan secara hardware dan software memiliki
advantage dan disadvantage masing-masing.

Putut Son Maria Bab 5 Halaman 18

Anda mungkin juga menyukai