You are on page 1of 61

Hand Out Microcontroller

C.O.M.I.C
.: Computer and Microcontroller Community :.

Powered By:

Presented By:

Divisi Microcontroller

Computer and Microcontroller Community


C.O.M.I.C
2008-2009
BAB 1
INTRODUCTION MICROCONTROLLER
1.1 Pengenalan Microcontroller
Mikroprosesor berasal dari kata micro dan process yang dapat diartikan sebagai
suatu pemroses yang berukuran mikro (sangat kecil). Data yang akan diolah harus berupa
data digital dan kemudian dimasukkan pada saluran input. Data diolah berdasarkan rumus
atau aturan tertentu. Pusat pengolahan data disebut sebagai CPU (Central Processing
Unit). CPU sebenarnya adalah suatu chip mikroprosesor. Rumus dan aturan tertentu itu
disebut sebagai program. Program disimpan di dalam sistem memori. Setelah data input
diolah oleh suatu program, maka akan dihasilkan suatu data yang kemudian dapat
dikeluarkan melalui saluran output. Untuk lebih jelasnya, lihat gambar 1 dibawah ini.

I1 O O1
I2 I O2
U
I3 N O3
T
P CPU
P
U
U
T
In T On

MEMORI

Gambar 1
Sistem Mikroprosesor

Maka secara konseptual suatu Mikroprosesor adalah suatu alat digital yang
menerima data digital dari sejumlah saluran masukan, memproses data menurut
ketentuan-ketentuan program yang disimpan, dan kemudian menghasilkan sejumlah
sinyal keluaran pada outputnya.
Kunci dari keserbagunaan dari miroprosesor adalah bahwa dengan perangkat
keras (hardware) yang sama, dapat digunakan untuk berbagai aplikasi yang berlainan
hanya dengan merubah program yang tersimpan pada sistem memorinya.

Input/Output.
Saluran input terdiri dari beberapa saluran. Begitu juga untuk saluran output,
terdiri dari beberapa saluran. Pada perkembangannya, saluran input dan output ini dapat
disatukan ke dalam satu sistem blok yaitu sistem blok I/O (Input/Output).
Saluran input/output merupakan media penghubung dengan piranti diluar sistem
mikroprosesor. Piranti diluar sistem mikroprosesor dapat terdiri tombol/keyboard,
peralatan-peralatan sensor (transducer), speaker, buzzer, lampu, display peraga, dsb.
Dari metoda penyaluran informasinya, peralatan I/O dapat dibedakan menjadi dua
macam, yaitu peralatan I/O serial dan peralatan I/O paralel. Penyaluran data secara serial
dibedakan lagi menjadi dua yaitu secara synchronous dan asynchronous. Ada banyak
sekali standar-standar komunikasi serial yang telah dikembangkan, diantaranya adalah
standar RS-232 dan RS485. Contoh perangkat yang memanfaatkan penyaluran data
secara serial adalah mouse, monitor, card networking, modem, dsb. Sedangkan contoh
perangkat yang memanfaatkan penyaluran data secara paralel adalah printer, hardisk,
CD-ROM, dsb.
Keuntungan penggunaan komunikasi paralel dibanding serial adalah transfer data
yang lebih cepat. Sedangkan keuntungan penggunaan komunikasi secara serial selain
penggunaan kabel yang ekonomis adalah penggunaan saluran I/O pada mikroprosesor
yang lebih sedikit. Hampir seluruh perangkat telekomunikasi yang ada saat ini
menggunakan komunikasi data secara serial.

CPU.
CPU (Central Processing Unit) didalamnya berisi ALU (Aritmatic Logic Unit),
Control Unit, PC (Program Counter) dan beberapa register (diantaranya adalah register
Accumulator). ALU merupakan pusat pengolahan logika (AND, OR, NOT, Compare,
etc) dan fungsi matematis (tambah, kurang, kali, bagi). Unit Control adalah unit yang
berfungsi untuk mengambil, mengdekode dan melaksanakan urutan instruksi suatu
program yang tersimpan dalam memori. Pelaksanaan dari instruksi dilakukan dengan
cara mengatur sinyal kendali yang diperlukan dalam melakukan suatu operasi. Dapat
disimpulkan bahwa unit control adalah suatu unit yang mengatur urutan operasi seluruh
sistem mikroprosesor.
Program Counter sesuai namanya adalah suatu penghitung (counter) langkah
dalam proses pengambilan baris program dari sistem memori. Setiap selesai proses
pengambilan dan pelaksanaan satu baris program, maka PC akan menunjuk kepada baris
berikutnya dari program yang terdapat di dalam memori.
Register Accumulator adalah suatu register serbaguna karena seluruh proses yang
melibatkan ALU dan I/O akan melalui register ini. Pada dasarnya register adalah suatu
memori, dengan demikian Accumulator memiliki fungsi untuk menyimpan data. Setiap
data yang akan diproses dan data hasil pemrosesan oleh ALU akan disimpan pada
Accumulator. Begitu juga setiap data yang masuk dan keluar melalui perangkat I/O akan
melalui register Accumulator. Selain Accumulator terdapat lagi beberapa register lainnya
(tergantung pada tipe mikroprosesornya), sebagai contoh adalah register B, C, dan D
yang terdapat pada mikroprosesor Intel 8088. Semakin banyak tersedia register, akan
semakin membantu programer dalam menyelesaian tugasnya.

Memori.
Blok Memori pada gambar-1 diatas terhubung dua arah kepada blok CPU. Hal ini
mempunyai arti bahwa CPU dapat melakukan proses penulisan kepada memori maupun
melakukan proses pembacaan pada memori. Sesuatu yang dibaca pada memori biasanya
berupa program, sedangkan sesuatu yang ditulis pada memori biasanya disebut sebagai
data. Jadi perlu dibedakan antara program dengan data. Pada proses pengolahan data
input, CPU memerlukan suatu tempat untuk melakukan “coretan-coretan” kecil. Dapat
dianalogikan seorang manusia yang memerlukan kertas-kertas kerja sebagai tempat
coretan-coretan data sementara sebelum dihasilkan data yang diharapkan. Begitu pula
dengan mikroprosesor memerlukan tempat sementara penyimpanan data sebelum data
sesungguhnya dihasilkan. Tempat penyimpanan sementara pada sistem mikroprosesor
disebut dengan RAM (Random Access Memory) dan tempat penyimpanan program
disebut sebagai ROM (Read Only Memory).

ROM.
Memori ini memiliki sifat non-volatile, artinya data yang tersimpan didalamnya
tidak akan mudah hilang bila power supply dihilangkan. Dengan sifat yang dimilikinya
ini, ROM biasa digunakan sebagai media penyimpan program, bukan data.
Ada beberapa turunan memori ROM, yaitu PROM (Programable ROM). Pada
memori ini, proses penulisan program kedalamnya hanya bisa dilakukan satu kali.
Program didalamnya tidak bisa dihapus. Kemudian ada memori jenis ROM yang bisa
dihapus (EPROM – Erasable PROM) yaitu UV-EPROM dan EE-PROM. Proses
penghapusan pada memori UV-EPROM dilakukan dengan cara mengenakan suatu
cahaya ultra violet pada jendela yang terdapat pada kemasan memori. Sedangkan proses
penghapusan pada memori EE-PROM dilakukan secara elektrikal, yaitu dengan
memberikan suatu standar tegangan, arus dan batas waktu tertentu pada memori.

RAM.
Memori ini memiliki sifat volatile, artinya data yang tersimpan didalamnya akan
hilang bila power supply dihilangkan. Dengan sifat yang dimilikinya ini, RAM tidak
dapat digunakan untuk menyimpan program.
Teknologi pada RAM terbagi dua, yaitu RAM statik dan RAM dinamik. RAM
statik biasanya memiliki kapasitas yang jauh lebih kecil dibanding dengan RAM dinamik,
namun memiliki kelebihan yaitu tidak diperlukan suatu sistem refreshing (penyegaran)
pada data yang tersimpan didalamnya. Sedangkan RAM dinamik memiliki kapasitas jauh
lebih besar daripada RAM statik, namun harus memiliki sistem tambahan yang rumit
untuk proses penyegaran data yang tersimpan agar data tersebut tidak hilang.

1.2 Teori Dasar Mikrokontroller Atmel.


1. Blok Diagram Internal
Mikrokontroler ATMEL 89’Series (disingkat AT89) merupakan ”single chip
microcomputer” karena semua chip pendukung suatu sistem minimum mikroprosesor,
seperti misalnya RAM (Random Access Memory), ROM (Read Only Memory), clock
generator, dan gerbang input-output, telah terintegrasi ke dalam satu chip. Dengan kata
lain, sistem yang dibangun oleh kontroler berbasis AT89 sudah merupakan sistem
komputer dalam konfigurasi minimum.
Ada banyak tipe chip keluarga AT89 yg dirancang sedemikian rupa agar cocok
dengan kebutuhan sistem yang dirancang konsumen. Dari segi hardware, arsitektur
internal mikrokontroler keluarga AT89 dibuat sama (identik). Masing-masing tipe
dibedakan dari jumlah port, kapasitas memori, dan fasilitas yang tersedia di dalamnya.
Namun dari segi bahasa pemrogramannya dibuat sama (compatible) untuk seluruh
keluarga AT89.
Pada training ini, mikrokontroler yang digunakan adalah tipe AT89C51. Tipe ini
memiliki jumlah port sebanyak 4x 8bit (total 32 bit saluran i/o), 4KB memori program
(Flash memory), 128B memori data (RAM), 2 buah fasilitas 16-bit timer internal, 6 buah
sumber interupsi, 1 buah fasilitas port serial dan kemampuan power down modes/Low
power idle.
Adapun blok diagram arsitektur internal dari mikrokontroler keluarga AT89
adalah sebagai berikut :
External
Interupsi
I I
N N
T T
0 1

Interrupt 128 BYTES 4K BYTES TIMER


Control RAM EEPROM 1

TIMER
Internal 0
Interupsi

CPU

4
BUS SERIAL
OSCILLATOR CONTROL
INPUT-OUTPUT
PORT
PORT

P
A R
S E
L S
E A
E T
N P0 P1 P2 P3 TxD RxD

Gambar 2
Blok Diagram Internal

Pada blok diagram diatas, terlihat bagian-bagian utama di dalam mikrokontroler


AT89C51. Setiap bagian di dalam chip saling terhubung secara internal oleh suatu bus.
Otak dari chip adalah CPU (Central Processing Unit). Di dalamnya berisi register
accumulator (dikenal sebagai register ACC atau A) yang sangat berperan sekali dalam
melakukan proses aritmatika dan proses logika. Hampir seluruh instruksi pada AT89C51
terkait dengan register A. Di dalam CPU juga terdapat beberapa register lain.
Kecuali CPU, setiap bagian pada blok diagram memiliki suatu register (alamat)
tertentu di dalam memori. Sebagai contoh Port0 (P0) , Port1 (P1), Port2 (P2) dan Port3
(P3) masing-masing secara berurutan terletak pada alamat 80H, 90H, A0H dan B0H.
Begitu juga untuk port serial (TxD dan RxD), diatur oleh suatu register SCON (Serial
Control) yang terletak pada alamat 98H dan SBUF (Serial Buffer) yang terletak pada
alamat 99H.
Adapun daftar register beserta alamatnya dapat dilihat pada gambar dibawah ini :
Byte
Alamat Bit Alamat

FF
F0 7 6 5 4 3 2 1 0 B

E0 7 6 5 4 3 2 1 0 ACC

D0 7 6 5 4 3 2 1 0 PSW

B8 7 6 5 4 3 2 1 0 IP

B0 7 6 5 4 3 2 1 0 P3

A8 7 6 5 4 3 2 1 0 IE

A0 7 6 5 4 3 2 1 0 P2

99 not bit addressable SBUF


98 7 6 5 4 3 2 1 0 SCON

90 7 6 5 4 3 2 1 0 P1

8D not bit addressable TH1


8C not bit addressable TH0
8B not bit addressable TL1
8A not bit addressable TL0
89 not bit addressable TMOD
88 7 6 5 4 3 2 1 0 TCON
87 not bit addressable PCON

83 not bit addressable DPH


82 not bit addressable DPL
81 not bit addressable SP
80 7 6 5 4 3 2 1 0 P0

Gambar 3
Spesial Function Register.

2. Konfigurasi Pin.
Mikrokontroler AT89C51 dikemas dalam bentuk DIP (Dual In Package) 40 pin
(kaki) dengan penomoran dan penamaan seperti yang terlihat pada gambar 4A. Pada
gambar 4B terlihat bahwa ada 4 buah port input/output (I/O) yang masing-masing diberi
nama P0, P1, P2, dan P3. Masing-masing port memiliki 8 saluran I/O. Penulisan untuk
bit-0 pada P0 ditulis sebagai P0.0, bit-1 ditulis P0.1, bit-2 ditulis P0.2, dst. Demikian
pula untuk penamaan port lainnya ditulis sebagai P1.0 , P1.1 , P1.2 , dst.

Port-0.
Port-0 adalah port I/O 8-bit dua arah dengan output kolektor terbuka. Atau dengan
kata lain, port ini tidak mempunyai resistor pull-up internal. Oleh karena itulah
dibutuhkan suatu resistor eksternal (biasanya berkisar antara 4,7 hingga 10 K Ohm)
diluar chip yang menghubungkan setiap pin pada port-0 dengan VCC (+5 Volt).
Sebagai port output, setiap pin dapat dihubungkan kepada 8 buah input chip TTL
ketika output low (logika ‘0”). Ketika logika ‘1’ ditulis ke port-0, maka pin tersebut dapat
digunakan sebagai input high-impedance.
Selain berfungsi sebagai port I/O, port-0 dapat juga berfungsi sebagai bus alamat
atau bus data byte rendah yaitu saat dilakukan akses memori eksternal, baik akses
memori program maupun memori data. Pada mode ini, P0 memiliki resistor pull-up
internal. Atau dengan kata lain, tidak dibutuhkan resistor pull-up eksternal pada saat
sistem dikonfigurasi untuk mengakses memori eksternal.

P1.0 1 40 VCC
P1.1 2 39 P0.0 (AD0)
P1.2 3 38 P0.1 (AD1)
P1.3 4 37 P0.2 (AD2)
P1.4 5 36 P0.3 (AD3)
P1.5 6 35 P0.4 (AD4)
P1.6 7 34 P0.5 (AD5)
P1.7 8 33 P0.6 (AD6)
RST 9 32 P0.7 (AD7)
(RXD) P3.0 10 31 EA/VPP
(TXD) P3.1 11 30 ALE/PROG
(INT0) P3.2 12 29 PSEN
(INT1) P3.3 13 28 P2.7 (A15)
(T0) P3.4 14 27 P2.6 (A14)
(T1) P3.5 15 26 P2.5 (A13)
(WR) P3.6 16 25 P2.4 (A12)
(RD) P3.7 17 24 P2.3 (A11)
XTAL2 18 23 P2.2 (A10)
XTAL1 19 22 P2.1 (A9)
GND 20 21 P2.0 (A8)

(A) Konfigurasi dan penamaan kaki


AT89C51

P1 P0

P3 P2

(B) Empat Buah Port I/O

Gambar 4
Penamaan dan Konfigurasi Pin Mikrokontroler AT89C51

Port-0 juga menerima kode-kode bahasa mesin (kode heksa) selama dilakukan
proses pengisian program ke dalam memori program (E-EPROM) dan mengeluarkan
kode heksa (bahasa mesin) saat dilakukan proses verifikasi (pengujian) terhadap kode
heksa yang telah ditulis ke dalam E-EPROM. Resistor pull-up eksternal dibutuhkan saat
dilakukan proses verifikasi.

Port-1.
Port-1 adalah port 8-bit dua arah dengan resistor pull-up di dalamnya.
Penyanggah (buffer) port-1 dapat dihubungkan kepada (maksimum) 4 saluran input chip
TTL. Ketika logika ‘1’ ditulis ke port-1 maka setiap pin pada port-1 akan ditarik menuju
tegangan VCC (+5 Volt) oleh resistor pull-up internal. Sebagai input, port-1 yang secara
eksternal sedang ditarik ke ground oleh resistor pull-down akan menjadi sumber arus
(source current) IIL bagi peralatan luar.
Port-1 sama seperti halnya port-0, dapat berfungsi sebagai bus alamat byte rendah
saat dilakukan proses pengisian dan verifikasi kode heksa ke dalam E-EPROM.

Port-2.
Port-2 adalah port 8-bit dua arah yang memiliki resistor pull-up di dalamnya.
Penyanggah (buffer) port-2 dapat dihubungkan kepada (maksimum) 4 saluran input chip
TTL. Ketika logika ‘1’ ditulis ke port-2 maka setiap pin pada port-2 akan ditarik menuju
tegangan VCC (+5 Volt) oleh resistor pull-up internal. Sebagai input, port-2 yang secara
eksternal sedang ditarik ke ground oleh resistor pull-down akan menjadi sumber arus
(source current) IIL bagi peralatan luar.
Port-2 dapat berfungsi sebagai bus alamat byte tinggi saat dilakukan proses
pengambilan (fetch cycle) instruksi yang berada di memori program eksternal dan selama
mengambil data di dalam memori data dengan menggunakan pengalamatan 16-bit (MOVX
@DPTR). Selama mengakses ke memori data eksternal yang menggunakan pengalamatan
8-bit (MOVX @RI), port-2 memasukkan isi dari register P2 SFR (Special Function
Register).

Port-3.
Port-3 merupakan port 8-bit dua arah yang memiliki resistor pull-up di dalamnya.
Penyanggah (buffer) port-3 dapat dihubungkan kepada (maksimum) 4 saluran input chip
TTL. Ketika logika ‘1’ ditulis ke port-3 maka setiap pin pada port-3 akan ditarik menuju
tegangan VCC (+5 Volt) oleh resistor pull-up internal. Sebagai input, port-3 yang secara
eksternal sedang ditarik ke ground oleh resistor pull-down akan menjadi sumber arus
(source current) IIL bagi peralatan luar.
Selain sebagai port I/O, port-3 juga mempunyai fungsi-fungsi lain yang
merupakan fasilitas khusus yang dimiliki oleh AT89C51, yaitu :
Tabel 1. Fungsi lain dari Port-3
Port Pin Fungsi lain
P3.0 RXD (input port serial)
P3.1 TXD (output port serial)
P3.2 INT0 (eksternal interupsi 0)
P3.3 INT1 (eksternal interupsi 1)
P3.4 T0 (input eksternal timer-0)
P3.5 T1 (input eksternal timer-1)
P3.6 WR (write strobe memori data eksternal)
P3.7 RD (read strobe memori data eksternal)
Port-3 juga menerima beberapa sinyal kendali selama dilakukan proses pengisian
data heksa dan verifikasinya di E-EPROM.

RST.
Input reset. Suatu sinyal high (tegangan 5 Volt) pada pin ini yang diberikan
selama minimum 2 siklus mesin pada saat oscilator sedang bekerja, akan menyebabkan
mikrokontroler AT89C51 di-reset. Atau dengan kata lain sistem AT89C51 memulai
kembali eksekusi programnya pada alamat 000H.

ALE/PROG.
ALE merupakan singkatan dari Address Latch Enable. Pin ALE merupakan pin
output yang mengeluarkan pulsa untuk menyimpan (latching) byte alamat bawah saat
mengakses memori eksternal. Pin ini juga berfungsi sebagai pin input untuk pulsa PROG
saat dilakukan pemrograman AT89C51.
Pada saat operasi normal, ALE mengeluarkan secara konstan suatu pulsa dengan
frekuensi 1/6 dari frekuensi oscilator yang dapat digunakan untuk tujuan pewaktuan dan
sumber detak peralatan eksternal. Catatan : satu pulsa ALE hilang pada setiap akses
memori data eksternal.
Jika diinginkan, operasi ALE dapat dihilangkan (disable) dengan mensetting bit 0
dari SFR pada alamat 8EH. Dan bila bit 0 di set menjadi ‘1’ maka ALE diaktifkan hanya
pada eksekusi instruksi MOVX atau MOVC. Mensetting bit disable ALE tidak akan
berpengaruh kepada sistem jika mikrokontroler difungsikan dengan mode mengakses
memori eksternal.

PSEN.
PSEN merupakan singkatan dari Program Store Enable yang merupakan strobe
untuk membaca memori program eksternal. Ketika AT89C51 sedang mengeksekusi kode
heksa dari memori program eksternal, maka PSEN akan diaktifkan sebanyak 2 kali untuk
setiap siklus mesin. Kecuali pada saat mengakses memori data eksternal, dua sinyal
PSEN dihilangkan.

EA/Vpp.
EA merupakan singkatan dari External Address. Pin EA harus dihubungkan ke
GND (ground) pada saat menginginkan sistem mengambil kode heksa (bahasa mesin)
dari memori program eksternal. Dimana lokasi awal terletak di alamat 0000H hingga
maksimum FFFFH. EA harus dihubungkan ke VCC (5 Volt) jika diinginkan sistem
mengambil kode heksa dari memori program internal.
Pin ini juga berfungsi sebagai tegangan pemrograman (Vpp) pada saat dilakukan
proses pengisian kode heksa ke dalam E-EPROM. Tegangan pemrograman yang
diberikan adalah DC 12-Volt.

XTAL1.
Pin ini merupakan pin input untuk inverting oscilator internal dan dapat juga
berfungsi sebagai input untuk rangkaian detak eksternal.
XTAL2.
Pin ini merupakan pin output dari oscilator.

VCC.
Pin ini dihubungkan dengan sumber tegangan (catu daya) arus searah sebesar 5
Volt.

GND.
Pin ini dihubungkan dengan ground (0 Volt) dari catu daya.

3. Rangkaian Minimal.
Untuk membuat suatu sistem berbasis mikrokontroler AT89C51 diperlukan dua
rangkaian dasar yaitu rangkaian POR (Power On Reset) dan rangkaian On-chip
Oscillator.

Power On Reset.
Sesuai dengan namanya, rangkaian ini berfungsi untuk memberikan sinyal ‘reset’
kepada mikrokontroler AT89C51 pada saat catu-daya dihidupkan. Reset disaat mulai
dihidupkan merupakan keharusan bagi sistem-sistem berbasis mikroprosesor/
mikrokontroler.
Dengan adanya reset maka mikrokontroler memulai mengeksekusi instruksi pada
baris pertama program yang tersimpan di dalam memorinya. Atau dengan kata lain,
adanya POR dapat dipastikan mikrokontroler langsung memulai eksekusi program pada
baris pertama, bukan pada sembarang baris.
Pada kondisi reset, maka isi dari setiap register di dalam SFR akan berubah
seperti tabel dibawah ini :
Tabel 2
Nilai yang terisi pada SFR saat POR
Reg SFR Nilai saat reset
PC 0000H
ACC 00H
B 00H
PSW 00H
SP 07H
DPTR 0000H
P0 - P3 FFH
IP XXX00000B
IE 0XX00000B
TMOD 00H
TCON 00H
TH0 00H
TL0 00H
TH1 00H
TL1 00H
SCON 00H
SBUF Tidak tentu
PCON 0XXX0000B
Adapun rangkaian Power On Reset untuk mikrokontroler Atmel 89C51 dapat
dilihat pada gambar di bawah ini :
VCC

40
VCC

10uF +
/12v AT89C51
9
RST

8K2

20
GND

Gambar 5

Rangkaian POR

Pada saat catu-daya dihidupkan, rangkaian menjaga pin RST pada kondisi high.
Hal ini disebabkan karena muatan pada kapasitor masih kosong sehingga arus dapat
mengalir menuju pin RST. Beberapa mili detik kemudian (tergantung kepada nilai
kapasitor dan nilai resistor), pada saat muatan pada kapasitor penuh maka arus tidak lagi
dapat mengalir menyebrang kapasitor. Sehingga pin RST saat ini ditarik ke bawah
(ground) melalui resistor pull-down 8K2.
Untuk memastikan sinyal reset yang valid, maka pin RST harus dijaga pada
kondisi high sampai rangkaian On-chip Oscillator bekerja plus dua siklus mesin. Dalam
hal ini pin RST minimal dijaga pada kondisi high selama 10 ms. Waktu start-up untuk
On-chip Oscillator tergantung kepada frekuensi kristal. Bila digunakan kristal 10 MHz,
maka waktu untuk start-up selama 1 ms. Untuk kristal 1 MHz, waktu untuk start-up
selama 10 ms.

On-chip Oscillator.
Sesuai dengan namanya, rangkaian ini berfungsi untuk membangkitkan sinyal
detak (clock) kepada sistem mikrokontroler AT89C51. Hampir seluruh rangkaian
Oscilator terletak di dalam mikrokontroler AT89C51, kecuali 3 komponen yang perlu
ditambahkan di luar chip AT89C51. Ketiga komponen tersebut adalah 2 buah kapasitor
30 pF dan 1 buah kristal. Lihat gambar 6.
AT89C51
30 pF
19
XTAL1
XTAL

18
XTAL2

30 pF

Gambar 6
On-chip Oscillator

Frekuensi kristal dapat dipilih antara 1 Mhz hingga 20 MHz tergantung kepada
spesifikasi yang tertera pada tulisan di body chip AT89C51. Frekuensi kristal akan
mempengaruhi siklus mesin (machine cycle) dan menentukan baud-rate pada saat
berkomunikasi melalui serial port. Pembahasan mengenai baud-rate ada pada topik
mengenai port serial.

AT89C51

POR RST Konektor


PORT-0 Port 0

Konektor
PORT-1
Port 1
ON-CHIP XTAL1
OSCILLATOR XTAL2
Konektor
PORT-2
Port 2

Konektor
INTERFACE TX PORT-3
PC Port 3
TTL - RS232 RX
P2.0

Speaker

Gambar 7
Blok diagram rangkaian modul kontroler

Gambar diatas memperlihatkan keseluruhan rangkaian pada modul kontroler


perangkat percobaan-percobaan yang akan kita lakukan. Terlihat adanya beberapa blok
yang menyusun modul kontroler seperti blok POR dan On-chip Oscillator yang telah
dibahas sebelumnya. Pembahasan untuk blok interface TTL – RS232 akan dibahas secara
detil pada sessi-2. Terlihat pada gambar bahwa dengan adanya interface TTL – RS232
maka mikrokontroler AT89C51 dapat dihubungkan ke PC melalui port serial.
Pada mikrokontroler AT89C51 terdapat 4 buah port, yaitu Port-0, Port-1, Port-2
dan Port-3. Masing-masing port memiliki saluran untuk input/output sebanyak 8-bit. Atau
dengan kata lain maka jumlah saluran input dan output (I/O) yang tersedia adalah
sebanyak 4 x 8 saluran I/O. Total sebanyak 32 bit saluran I/O. Masing-masing bit pada
setiap port dapat dihubungkan ke berbagai peralatan input maupun output.
Pada gambar 7 diatas terlihat bahwa masing-masing port pada mikrokontroler
AT89C51 langsung dihubungkan kepada konektor yang diberi nama konektor Port-0 s/d
konektor Port-3. Konektor-konektor ini kemudian dengan kabel dihubungkan ke modul
input maupun ke modul peraga untuk mensimulasikan proses input dan output.
Terlihat juga bahwa Port-2 bit-0 (P2.0) terhubung ke perangkat speaker. Dengan
demikian maka dapat dibuat suatu percobaan untuk memainkan suatu lagu atau nada-
nada pada speaker. Modul-modul lainnya yang digunakan untuk percobaan akan
dijelaskan pada sessi ke-2.

Organisasi Memori.
Memori pada mikrokontroler AT89C51 dipisah atas dua bagian, yaitu memori
untuk program yang tersimpan di dalam EEPROM (Electronically Erasable
Programmable ROM) dan memori untuk data yang tersimpan di dalam RAM (Random
Access Memory). EEPROM bersifat non-volatile yang artinya program yang tersimpan
di dalamnya tidak akan mudah hilang bila catu-data dimatikan. Sedangkan RAM bersifat
volatile yang artinya data akan hilang bila catu-daya dimatikan.
Memori program secara total dapat menyimpan program hingga mencapai 64 Kilo
Byte (64 KB) pada memori eksternal. Namun secara internal mikrokontroler AT89C51
hanya mampu menyimpan program sebesar 4 KB. Untuk dapat mengakses memori
program eksternal maka digunakan sinyal PSEN (Program Store Enable) dan sinyal EA
(Enable Address), lihat pin pada gambar-4. Instruksi yang diperlukan untuk mengakses
memori eksternal adalah MOVX.
Memori data pada AT89C51 juga mampu mengalamati hingga mencapai 64 Kilo
Byte (64 KB) pada memori eksternal. Namun secara internal mikrokontroler AT89C51
hanya mampu menyimpan data sebesar 128 byte ditambah 128 byte untuk SFR (Special
Function Register). Lihat gambar 10. Untuk dapat mengakses memori data eksternal
maka digunakan sinyal Rd (Read) dan Wr (Write).
FFFF FFFF

60KB
Eksternal

64KB
Eksternal
Atau
1000

0FFF

4KB Internal

0000 0000

PSEN EA = 1 PSEN EA = 0

Gambar 8
Struktur Program Memori

FFFF

INTERNAL
64KB
FF Eksternal
128 Bytes SFR
(Pengalamatan
Langsung)
80
DAN
7F
128 Bytes RAM
(Pengalamatan
Langsung dan
Tidak Langsung
00 0000

RD WR

Gambar 9
Struktur Data Memori

Pada gambar 9 diatas terlihat bahwa 128 byte SFR hanya dapat diakses dengan
cara pengalamatan langsung (direct addressing), yaitu dengan menggunakan instuksi
MOV data,alamat. Sedangkan 128 byte RAM selain dapat diakses secara langsung, dapat
juga diakses secara tidak langsung (indirect addressing), yaitu dengan menggunakan
instruksi MOV @Ri.

Operand dan Ekspresi.


Bentuk umum semua instruksi dalam bahasa assembler AT89C51 dapat ditulis sebagai
berikut :
[ label: ] Mnemonic [ operand ] [ ,operand ] [ ,operand ] [ ;komentar ]

Jumlah operand tergantung pada tipe mnemonic. Semua operand dapat


dibagi dalam 6 kelompok, yaitu :
1. Simbol khusus assembler
2. Pengalamatan tak langsung
3. Data langsung
4. Pengalamatan data
5. Pengalamatan bit
6. Pengalamatan kode
Pembahasan lebih detil mengenai berbagai teknik pengalamatan dibahas pada sessi-4.

Simbol Assembler Khusus.


Assembler telah menyediakan beberapa simbol untuk menunjukkan register
tertentu sebagai operand. Simbol-simbol dan nama-nama register yang telah digunakan
oleh assembler tidak boleh digunakan oleh programmer untuk mendefinisikan suatu
variabel maupun konstanta (sessi ke 8 akan dibahas mengenai pendefinisian variabel dan
konstanta). Tabel 3 dibawah ini menunjukkan simbol assembler khusus yang dimaksud.
Tabel 3
Simbol Assembler Khusus

Simbol khusus Arti

A Akumulator
R0 … R7 Register serbaguna
DPTR Data pointer. Register 16 bit
PC Program counter. Register 16 bit yang berisi alamat
Instruksi berikutnya yang akan dijalankan
C Carry flag
AB Akumulator/register B. Pasangan register untuk proses
perkalian dan pembagian.

Pengalamatan Langsung.
Pengalamatan langsung dilakukan dengan memberikan nilai ke suatu register
secara langsung. Untuk melaksanakan hal tersebut digunakan tanda #.
MOV A,#01H ; Isi akumulator dengan bilangan 01H
MOV DPTR,#19AB ; Isi register DPTR dengan bilangan 19ABH

Pengalamatan data langsung dari 0 sampai 127 akan mengakses RAM internal,
sedangkan pengalamat 128 sampai 255 akan mengakses register perangkat keras.
MOV P3,A ; Pindahkan isi akumulatort ke alamat data B0H
; (B0H adalah alamat Port 3).
INC 50 ; Naikkan isi suatu alamat 50 pada memori

Pengalamatan Tidak Langsung.


Operand pengalamatan tidak langsung menunjuk ke sebuah register yang berisi
lokasi suatu alamat memori yang akan digunakan dalam suatu operasi. Lokasi yang nyata
tergantung pada isi register saat instruksi dijalankan. Untuk melaksanakan pengalamatan
tidak langsung digunakan simbol @.

ADD A, @R0 ; Tambahkan isi RAM yang lokasinya ditunjuk oleh


; register R0 ke akumulator
DEC @R4 ; Kurangi satu isi RAM yang alamatnya ditujuk oleh
; register R4
MOVX @DPTR, A ; Pindahkan isi dari akumulator ke memori luar yang
; lokasinya ditunjuk oleh pointer (DPTR)
Pengalamatan Bit.
Pengalamatan bit merupakan pengalamatan untuk merubah 1 bit data dari satu
lokasi memori. Satu lokasi memori dapat menampung 8 bit informasi atau sebesar 1 byte.
Pengalamatan bit dapat dilakukan untuk merubah port i/o, namun dapat juga dilakukan
internal di dalam RAM. Namun tidak semua alamat pada RAM dapat diakses secara bit.
Hanya alamat yang dimulai dari 20H sampai 2F yang bisa dialamati secara bit (lihat
gambar dibawah ini).
7F

LOKASI RAM
SERBAGUNA

30
2F

LOKASI
PENGALAMATAN
BIT

20
1F
Bank 3
18
17
Bank 2
10
0F
Bank 1
08
07 Default register bank
00 for R0 - R7

Gambar 10
Peta Memori RAM AT89C51

Untuk melakukan pengalamatan bit digunakan simbol (.) Contoh pengalamatan


bit adalah sebagai berikut :
• FLAGS.3
• 40.5
• 21H.5
• ACC.7
Selain contoh diatas, ada beberapa register internal (lihat gambar 3) pada
AT89C51 yang dapat diakses secara bit. Register-register tersebut adalah :
• register PSW (Program Status Word, yang berisi 7 buah flag)
• register TCON (Timer/counter Control, untuk mengatur fungsi Timer/Counter)
• register SCON (Serial Control, untuk mengatur proses transfer data serial)
• register IE (Interrupt Enable, untuk mengatur pengggunaan sistem interupsi)
• register IP (Interrupt Priority, untuk mengatur prioritas apabila terjadi 2 interupsi
secara bersamaan).
BAB 2
PERANGKAT INSTRUKSI

Dilihat dari Mode Pengalamatannya, perangkat instruksi mikrokontroler


AT89C51 dibedakan menjadi enam (6) macam yaitu : Pengalamatan Langsung,
Pengalamatan Tidak Langsung, Pengalamatan Bit, Immediate Data, Pengalamatan
Indeks, Pengalamatan Register.
 Pengalamatan Langsung (Direct Addressing).
Dalam pengalamatan langsung, operand di dalam field instruksi menunjuk ke suatu
alamat tertentu. Hanya internal data RAM dan SFR yang dapat dialamati secara
langsung.
 Pengalamatan Tidak Langsung (Indirect Addressing).
Pada pengalamatan tidak langsung, instruksi mengandung suatu register yang berisi
alamat dari data yang akan dipindahkan.
 Pengalamatan Bit.
Pengalamatan ini dapat merubah 1 bit informasi dari total 8 bit (1 byte) data yang
terdapat pada suatu alamat memori. Pengalamatan ini hanya bisa dilakukan pada
internal RAM pada lokasi tertentu dan pada SFR.
 Immediate Data.
Pengalamatan ini mengisi langsung suatu alamat dengan suatu data (konstanta). Data
immediate ini dibedakan menjadi data desimal, heksadesimal, dan biner.
 Pengalamatan Indeks.
Program memori dapat diakses melalui pengalamatan indeks. Pengalamatan ini
digunakan untuk membaca tabel look-up (Look-up table) di dalam program memori.
Pengalamatan ini menggunakan register 16-bit (DPTR atau PC = Program Counter)
untuk menunjuk ke alamat awal dari suatu tabel, dan kemudian register Akumulator
di isi untuk menunjuk baris keberapa dari tabel yang datanya akan diambil.
 Pengalamatan Register.
Pengalamatan ini menggunakan Register Bank (R0-R7), dapat diakses oleh instruksi-
instruksi yang opcode-nya mengandung satu dari 32 buah register bank (R0-R7 yang
terdapat pada 4 buah bank).

Tabel berikut memperlihatkan operand-operand yang digunakan pada seluruh


instruksi yang dikenal pada AT89C51.
@Ri L okasi RA M i nternal 8-bi t ( 0-255) yang di al amati secara
ti dak l angsung mel al ui regi ster R1 atau R0
#data K onstanta 8-bi t
#data16 K onstanta 16-bi t
addr16 Operand al amat tuj uan (desti nati on) 16-bi t. D i gunakan
i nstruksi L CA L L dan L JM P.
addr11 Operand al amat tuj uan (desti nati on) 11-bi t. D i gunakan
i nstruksi A CA L L dan A JM P.
rel A l amat (l abel ) yang di gunakan untuk i nstruksi SJM P
dan sel uruh i nstruksi l ompat bersyarat l ai nnya
bi t Pengal amatan l angsung bi t di dal am RA M i nternal atau

Bila dilihat dari Perangkat Instruksi (Instruction Set) yang dimiliki oleh
mikrokontroler AT89C51, instruksi-instruksi dapat digolongkan menjadi lima (5)
kategori, yaitu : Operasi Aritmatika, Operasi Logika, Transfer Data, Manipulasi Boolean
dan Pencabangan Program.
Baiklah mari kita bahas satu persatu instruksi yang dikenal oleh mikrokontroler
AT89C51 berdasarkan 5 kategori diatas.
1. Instruksi Operasi Aritmatika.
Instruksi operasi aritmatika meliputi seluruh operasi matematis (jumlah, kurang,
kali, bagi) dan operasi increment dan decrement.

1.1.Operasi Penjumlahan.
Terdapat 2 kelompok utama instruksi penjumlahan yaitu penjumlahan tanpa bit
carry dan penjumlahan bersama bit carry.
1.1.1. Penjumlahan tanpa bit carry.
Sintaks : ADD A, <source-byte>
Deskripsi : Instruksi ADD akan menjumlahkan suatu nilai byte dengan isi register A
dan menyimpan hasil penjumlahan itu ke dalam register A. Flag bit carry
dan bit auxiliary carry akan diset (bersesuaian) jika terjadi limpahan pada
bit 7 atau bit 3. Jika tidak terjadi limpahan, kedua bit tersebut akan di-
clear.
Field Source Byte dapat berupa pengalamatan: register, langsung, tidak
langsung atau immediate.

Contoh : Diasumsikan register A sedang menyimpan data 0C3H (11000011B), dan


R0 menyimpan 0AAH (10101010B). Maka dengan instruksi : ADD
A, R0
akan menghasilkan 6D (01101101B) di dalam register A, dan bit AC dan
C di-clear

Varian : ADD A, Rn
ADD A, direct
ADD A, @Ri
ADD A, #data

1.1.2. Penjumlahan bersama bit carry.


Sintaks : ADDC A, <source-byte>
Deskripsi : Instruksi ADDC secara simultan akan menjumlahkan suatu nilai byte
dengan isi register A dan juga dengan bit carry. Dan kemudian
menyimpan hasil penjumlahan itu ke dalam register A. Flag bit carry dan
bit auxiliary carry akan diset (bersesuaian) jika terjadi limpahan pada bit 7
atau bit 3. Jika tidak terjadi limpahan, kedua bit tersebut akan di clear.

Field Source Byte dapat berupa pengalamatan: register, langsung, tidak


langsung atau immediate.

Contoh : Diasumsikan register A sedang menyimpan data 0C3H (11000011B), R0


menyimpan 0AAH (10101010B) dan bit carry. Maka dengan instruksi :
ADDC A,R0 akan menghasilkan 6E (01101110B) di dalam register A,
dan bit AC dan C di-clear.

Varian : ADDC A, Rn
ADDC A, direct
ADDC A, @Ri
ADDC A, #data

1.2.Operasi Pengurangan.
Sintaks : SUBB A, <source-byte>
Fungsi : Mengurangi beserta bit Borrow
Deskripsi : Instruksi SUBB akan mengurangi suatu nilai byte beserta bit carry dengan
isi register A dan menyimpan hasil pengurangan itu ke dalam register A.
Flag bit carry (borrow) akan diset apabila operasi itu membutuhkan suatu
‘pinjaman’ (borrow) pada bit ke 7 dan akan meng-clear C jika tidak terjadi
‘pinjaman’. Bit AC akan diset (bersesuaian) jika dibutuhkan pinjaman
pada bit ke 3 atau akan di-clear jika tidak dibutuhkan pinjaman.
Field Source Byte dapat berupa pengalamatan: register, langsung, tidak
langsung atau Immediate.

Contoh : Diasumsikan register A sedang menyimpan data 0C3H (11000011B), dan


R0 menyimpan 0AAH (10101010B). Maka dengan instruksi : ADD A,
R0 akan menghasilkan 6D (01101101B) di dalam register A, dan bit AC
dan C di-clear.

Varian : SUBB A, Rn
SUBB A, direct
SUBB A, @Ri
SUBB A, #data
1.3.Operasi Perkalian.
Sintaks : MUL AB
Fungsi : Melakukan proses perkalian
Deskripsi : Instruksi MUL AB akan mengalikan suatu nilai byte yang berada di dalam
register A dan B. 8-bit bobot terendah dari 16 bit hasil perkalian akan
disimpan di dalam register A, dan 8 bit bobot tertinggi akan disimpan di
dalam register B. Jika hasil perkalian lebih besar dari 255 (0FFH), maka
flag bit overflow akan diset. Begitu pula sebaliknya jika lebih kecil dari
255, flag bit overflow akan di-clear.

Contoh : Diasumsikan register A sedang menyimpan data 80 (50H), dan register B


menyimpan data 160 (0A0H). Maka dengan instruksi : MUL AB akan
menghasilkan 12.800 (3200H), sehingga B akan dirubah menjadi 32H
(00110010B) dan A akan berisi 00H. Flag overflow akan diset dan carry
akan di-clear.

1.4.Operasi Pembagian.
Sintaks : DIV AB
Fungsi : Melakukan proses pembagian
Deskripsi : Instruksi DIV AB akan membagi suatu nilai byte yang berada di dalam
register A dengan nilai byte yang terkandung di dalam register B. Register
A akan menyimpan hasil pembagian dan register B akan menyimpan sisa
dari proses pembagian. Bit carry dan overflow di-clear.
Pengecualian : Jika B mengandung 00H, maka suatu nilai yang tidak
terdefinisi akan mengisi register A dan B. Namun bit overflow akan diset
dan bit carry di-clear.

Contoh : Diasumsikan register A menyimpan data 251 (0FBH), dan register B


menyimpan data 18 (12H). Maka dengan instruksi : DIV AB akan
menghasilkan 13 (0DH) dan 17 (11H) di dalam register B. Kedua bit carry
dan overflow akan di-clear.

1.5.Operasi Increment.
Sintaks : INC <Byte>
Fungsi : Menambah satu (menaikkan) isi suatu variabel/register
Deskripsi : Instruksi INC akan menaikkan suatu nilai byte pada variabel yang
ditunjuk. Suatu nilai 0FFH akan overflow ke 00H. Tidak ada flag yang
dipengaruhi oleh instruksi ini.
Field Byte dapat berupa pengalamatan: register, direct, langsung, tidak
langsung.

Contoh : Diasumsikan register R0 sedang menyimpan data 7EH (01111110B).


Lokasi internal RAM pada alamat 7EH dan 7FH berisi data 0FFH dan
40H. Maka instruksi berikut secara berutan :
INC @R0
INC R0
INC @R0
akan menyebabkan R0 tetap menyimpan 7EH. Namun lokasi 7EH dan
7FH akan berubah menjadi 0FFH dan 40H

Varian : INC A
INC Rn
INC direct
INC @Ri
INC DPTR

1.6.Operasi Decrement.
Sintaks : DEC <Byte>
Fungsi : Mengurangi satu (menurunkan) isi suatu variabel/register
Deskripsi : Instruksi DEC akan menurunkan suatu nilai byte pada variabel yang
ditunjuk. Suatu nilai 00H akan underflow ke 0FFH. Tidak ada flag yang
dipengaruhi oleh instruksi ini.

Field Byte dapat berupa pengalamatan: register, direct, langsung, atau


tidak langsung.

Contoh : Diasumsikan register R0 sedang menyimpan data 7FH (01111111B).


Lokasi internal RAM pada alamat 7EH dan 7FH berisi data 00H dan 40H.
Maka instruksi berikut secara berutan :
DEC @R0
DEC R0
DEC @R0
akan menyebabkan R0 tetap menyimpan 7EH. Namun lokasi 7EH dan
7FH akan berubah menjadi 0FFH dan 3FH

Varian : DEC A
DEC Rn
DEC direct
DEC @Ri

2. Instruksi Operasi Logika


2.1.Operasi AND Logic.
Sintaks : ANL <dest-byte>,<source-byte>
Fungsi : Melakukan operasi AND antara dua byte suatu variabel/register
Deskripsi : Instruksi ANL membentuk operasi bit logika AND antara dua variabel
(destination-byte dan source-byte) dan menyimpan hasilnya di dalam
variabel destination. Tidak ada flag yang berubah dengan operasi ini.
Dua operand memungkinkan terjadinya 6 kombinasi mode-pengalamatan.
Bila variabel destination berupa register A, maka source variabel dapat
berupa pengalamatan register, direct, indirect atau berupa pengalamatan
immediate.

Catatan: Ketika instruksi ini digunakan untuk memodifikasi suatu port


output, suatu nilai yang digunakan sebagai data original port akan dibaca
dari latch data output, bukan dari pin input.

Contoh : Jika register A sedang menyimpan 0C3H (11000011B), dan register 0


(R0) menyimpan 55H (01010101B), maka instruksi berikut : ANL A,R0
akan merubah isi register A dengan nilai 41H (01000001B).

Ketika byte destination merupakan byte pengalamatan langsung, maka


instruksi ANL men-clear kombinasi bit di setiap lokasi atau register.
Proses penghalangan (mask) bit dalam suatu register menghasilkan pola
bit pada posisi tertentu yang akan di-clear.

Contoh lainnya :
ANL P1,#01110011B akan meng-clear bit 7, 3 dan 2 dari port P1.

Varian : ANL A, Rn
ANL A, direct
ANL A, @Ri
ANL A, #data
ANL direct, A
ANL direct, #data

2.2.Operasi OR Logic.
Sintaks : ORL <dest-byte>,<source-byte>
Fungsi : Melakukan operasi OR antara dua byte suatu variabel/register
Deskripsi : Instruksi ORL membentuk operasi bit logika OR antara dua variabel
(destination-byte dan source-byte) dan menyimpan hasilnya di dalam
variabel destination. Tidak ada flag yang berubah dengan operasi ini.

Dua operand memungkinkan terjadinya 6 kombinasi mode-pengalamatan.


Bila variabel destination berupa register A, maka source variabel dapat
berupa pengalamatan register, direct, indirect atau berupa pengalamatan
immediate.

Catatan: Ketika instruksi ini digunakan untuk memodifikasi suatu port


output, suatu nilai yang digunakan sebagai data original port akan dibaca
dari latch data output, bukan dari pin input.
Contoh : Jika register A sedang menyimpan 0C3H (11000011B), dan register 0
(R0) menyimpan 55H (01010101B), maka instruksi berikut : ORL A,R0
akan merubah isi register A dengan nilai 0D7H (11010111B).

Pola bit yang akan di-set oleh operasi ini ditentukan oleh byte penghalang
(mask), yang bisa berupa data tetap ataupun variabel

Contoh lainnya : ORL P1,#00110010B akan meng-set bit 5, 4


dan 1 dari port P1.

Varian : ORL A, Rn
ORL A, direct
ORL A, @Ri
ORL A, #data
ORL direct, A
ORL direct, #data

2.3.Operasi Exclusive OR Logic.


Sintaks : XRL <dest-byte>,<source-byte>
Fungsi : Melakukan operasi XOR antara dua byte suatu variabel/register
Deskripsi : Instruksi XRL membentuk operasi bit logika XOR antara dua variabel
(destination-byte dan source-byte) dan menyimpan hasilnya di dalam
variabel destination. Tidak ada flag yang berubah dengan operasi ini.

Dua operand memungkinkan terjadinya 6 kombinasi mode-pengalamatan.


Bila variabel destination berupa register A, maka source variabel dapat
berupa pengalamatan register, direct, indirect atau berupa pengalamatan
immediate.

Catatan: Ketika instruksi ini digunakan untuk memodifikasi suatu port


output, suatu nilai yang digunakan sebagai data original port akan dibaca
dari latch data output, bukan dari pin input.

Contoh : Jika register A sedang menyimpan 0C3H (11000011B), dan register 0


(R0) menyimpan AAH (10101010B), maka instruksi berikut : XRL
A,R0 akan merubah isi register A dengan nilai 69H (01101001B).

Ketika operand kedua merupakan data langsung, instruksi ini dapat


mengkomplemen kombinasi bit pada setiap lokasi RAM atau register. Pola
dari bit yang dikomplemenkan ditentukan oleh byte penghalang (mask)
atau suatu konstanta tertentu.

Contoh XRL P1,#00110001B akan mengkomplemen bit 5, 4 dan 0 pada P1.

Varian : XRL A, Rn
XRL A, direct
XRL A, @Ri
XRL A, #data
XRL direct, A
XRL direct, #data

2.4.Operasi Clear Akumulator.


Sintaks : CLR A
Fungsi : Melakukan operasi menghapus setiap bit pada register A
Deskripsi : Instruksi ini akan membuat seluruh bit di dalam register A menjadi ‘0’.
Tidak ada flag yang dipengaruhi oleh instruksi ini.

Contoh : Register A=5CH (01011100B). Maka Instruksi CLR A akan membuat


A=00H.

2.5.Operasi Komplemen Akumulator.


Sintaks : CPL A
Fungsi : Membalik (NOT) nilai logika pada setiap bit di dalam register A.
Deskripsi : Instruksi ini akan membuat seluruh bit di dalam register A terbalik dari
nilai semula. Bila ‘1’ menjadi ‘0’, dan sebaliknya. Tidak ada flag yang
dipengaruhi oleh instruksi ini.

Contoh : Register A=5CH (01011100B). Maka Instruksi CPL A akan membuat


A=0A3H

2.6.Operasi Geser Bit.


Sintaks : RL A
Fungsi : Menggeser satu bit ke kiri isi register A.
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kiri. Bit 7 dirotasi ke
posisi bit 0. Tidak ada flag yang dipengaruhi oleh instruksi ini.
Contoh : Register A=0C5H (11000101B), maka dengan instruksi RL A akan
menyebabkan register A=8BH (10001011B). Flag carry tidak berubah.

Sintaks : RLC A
Fungsi : Menggeser satu bit ke kiri isi register A dan flag carry
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kiri. Bit 7 register A
masuk ke flag (bit) carry dan isi flag carry pindah ke register A pada
posisi bit 0.
Contoh : Register A=0C5H (11000101B) dan C=0, maka dengan instruksi RLC A
akan menyebabkan register A=8BH (10001011B) dan C=1.

Sintaks : RR A
Fungsi : Menggeser satu bit ke kanan isi register A.
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kanan. Bit 0 dirotasi ke
posisi bit 7. Tidak ada flag yang dipengaruhi oleh instruksi ini.
Contoh : Register A=0C5H (11000101B), maka dengan instruksi RR A akan
menyebabkan register A=0E2H (11100010B). Flag carry tidak berubah.

Sintaks : RRC A
Fungsi : Menggeser satu bit ke kanan isi register A dan flag carry
Deskripsi : Delapan bit di dalam register A digeser satu bit ke kanan. Bit 0 register A
masuk ke flag (bit) carry dan isi flag carry pindah ke register A pada
posisi bit 7.
Contoh : Register A=0C5H (11000101B) dan C=0, maka dengan instruksi RRC A
akan menyebabkan register A=62H (01100010B) dan C=1.

Sintaks : SWAP A
Fungsi : Menukar posisi 4 bit nibel bawah (bit 0-3) dengan 4 bit nibel atas (4-7).
Deskripsi : Instruksi ini menukar posisi bit 0-3 dengan posisi bit 4-7 data yang
terdapat di dalam register A. Tidak ada flag yang dipengaruhi oleh operasi
ini.
Contoh : Register A=0C5H (11000101B) maka dengan instruksi SWAP A akan
menyebabkan register A=5CH (01011100B).

3. Instruksi Transfer Data


Instruksi transfer data meliputi seluruh operasi pemindahan data antar register,
pemindahan data dari suatu alamat memori internal/eksternal ke alamat lainnya
(pengalamatan tidak langsung), pengisian data langsung (immediate data), dsb.

3.1.Operasi MOV.
Terdapat 5 kelompok utama instruksi transfer data yaitu transfer data 8-bit,
transfer data 1-bit, transfer data 16-bit, transfer data berbentuk tabel dan transfer data dari
memori eksternal.

3.1.1. Transfer data 8-bit


Sintaks : MOV <Dest-Byte, <Source-Byte>
Fungsi : Memindahkan data 1 byte
Deskripsi : Instruksi ini akan menyalin data yang berada pada operand kedua (source
byte) ke dalam lokasi yg ditunjuk oleh operand pertama (destination byte).
Register pada operand keduatidak berubah oleh instruksi ini. Dan tidak
ada register atau flag yang berubah.

Operasi ini merupakan operasi yang sangat fleksibel dimana terdapat 15


kombinasi mode pengalamatan untuk operand pertama dan kedua.
Contoh : Lokasi RAM beralamat 30H menyimpan 40H. Dan lokasi 40H berisi 10H.
Data yang terdapat pada input port 1 adalah 11001010B (0CAH).

MOV R0, #30H ;R0 = 30H


MOV A, @R0 ; A = 40H
MOV R1, A ;R1 = 40H
MOV B, @R1 ; B = 10H
MOV @R1, P1 ;RAM(40H) = 0CAH
MOV P2, P1 ;P2 = 0CAH

Hasil 6 baris instruksi diatas akan menghasilkan R0=30H, A=40H,


R1=40H, B=10H, Ram(40H)=0CAH dan P2=0CAH.

Varian : MOV A, Rn MOV direct, A


MOV A, direct MOV direct, Rn
MOV A, @Ri MOV direct, direct
MOV A, #data MOV direct, @Ri
MOV direct, #data

MOV Rn, A MOV @Ri, A


MOV Rn, direct MOV @Ri, direct
MOV Rn, #data MOV @Ri, #data

3.1.2. Transfer data 16-bit


Sintaks : MOV DPTR, #data16
Fungsi : Memindahkan data selebar 16-bit ke register Data Pointer
Deskripsi : Instruksi ini akan mengisi register DPTR (Data Pointer) dengan konstanta
16-bit. Nilai (konstanta) diisi pada byte kedua dan ketiga dari instruksi ini.
Byte kedua (DPH) adalah menyimpan byte yang berbobot tinggi dan byte
ketiga (DPL) menyimpan byte bobot yang rendah. Tidak ada flag yang
berubah oleh operasi ini.

Contoh : Instruksi berikut :


MOV DPTR, #1234H
akan mengisi data 1234H ke dalam Data Pointer dimana register DPH
menyimpan 12H dan DPL menyimpan 34H.

3.2.Operasi MOVC (Transfer data tabel)


Sintaks : MOVC A, @A+<base-reg>
Fungsi : Memindahkan 1 byte kode dari suatu alamat yang ditunjuk oleh operand 2.
Deskripsi : Instruksi ini akan mengisi register A dengan 1 byte kode atau konstanta
dari suatu alamat di dalam program memori. Alamat dibentuk dari
penjumlahan 8-bit register A dengan 16-bit base-register, yang bisa berupa
DPTR (Data Pointer) atau PC (Program Counter).

Pada saat proses pengambilan data, register PC dinaikkan satu untuk


mengambil alamat berikutnya sebelum dijumlahkan dengan register A.
Data yang telah diambil akan berada di dalam register A.

Instruksi ini berguna untuk membuat suatu tabel data (konstanta). Tidak
ada flag yang berubah.
Contoh : Suatu nilai antara 0 dan 3 berada di dalam A. Instruksi berikut akan
merubah nilai yang berada di dalam A sesuai dengan satu atau empat nilai
yang didefinisikan oleh instruksi direktif DB (define byte) :
REL_PC INC A
MOVC A,@A+PC
RET
DB 66H, 77H
DB 88H, 99H
Jika contoh subrutin diatas dijalankan dimana register A berisi 01H, maka
pemanggilan subrutin tersebut akan menghasilkan A=77H. Instruksi INC
A sebelum instruksi MOVC diperlukan untuk mengambil data berikutnya
dari tabel. Data harus diletakkan tepat setelah instruksi RET. Setiap pindah
baris harus diawali dengan instruksi direktif DB. Setiap akhir baris, tanpa
diberikan tanda ‘,’

Varian : MOVC A, @A+DPTR


MOVC A, @A+PC

3.3.Operasi MOVX.
Sintaks : MOVX <dest-byte>, <source-byte>
Fungsi : Memindahkan 1 byte kode ke alamat eksternal
Deskripsi : Instruksi ini akan mentransfer data antara register A dengan memori data
eksternal. Itulah sebabnya mengapa ‘X’ digandeng dengan MOV.

Contoh : Suatu chip memori data eksternal (RAM) sebesar 256 byte terhubung
dengan bus data dan bus alamat yang terhubung pada P0 dan P3 berfungsi
sebagai bus kendali untuk RAM eksternal. Register R0 berisi 12H dan R1
berisi 34H. Alamat 34H dari RAM Eksternal menyimpan 56H. Urutan
instruksi berikut akan menyalin nilai 56H ke dalam register A dan RAM
eksternal pada lokasi 12H
MOVX A, @R1 ; A = 56H
MOVX @R0, A ;RAM(12) = 56H

Varian : MOVX A, @Ri


MOVX A, @DPTR
MOVX @Ri, A
MOVX @DPTR, A

3.4.Operasi PUSH.
Sintaks : PUSH direct
Fungsi : Mendorong (menyimpan) data direct ke dalam RAM melalui proses stack.
Deskripsi : Isi register SP (Stack Pointer) ditambah satu. Dan isi suatu register
pengalamatan langsung (operand direct) disalin ke dalam lokasi RAM
internal yang dialamati oleh register SP. Tidak ada flag yang dipengaruhi
oleh operasi ini.

Contoh : Saat masuk ke dalam rutin interupsi, register SP berisi 09H dan register
Data Pointer (DPTR) menyimpan 0123H. Maka dengan 2 instruksi
dibawah ini :
PUSH DPL
PUSH DPH
akan menyebabkan SP=0BH dan menyimpan 23H dan 01H di dalam
RAM internal pada lokasi 0AH dan 0BH.

3.5.Operasi POP.
Sintaks : POP direct
Fungsi : Mengeluarkan data melalui proses stack.
Deskripsi : Isi suatu lokasi di dalam RAM internal yang dialamati oleh register SP
dibaca dan disalin ke dalam suatu register yang ditunjuk oleh operand
direct. Isi register SP (Stack Pointer) dikurangi satu. Tidak ada flag yang
dipengaruhi oleh operasi ini.

Contoh : Register SP menyimpan nilai 32H, dan lokasi RAM internal 30H hingga
32H menyimpan data 20H, 23H dan 01H. Maka instruksi dibawah ini :
POP DPH
POP DPL
akan menyebabkan SP=30H dan mengisi register DPTR dengan data
0123H. Pada posisi ini, instruksi berikut : POP SP akan mengisi register
SP dengan data 20H. Dalam contoh ini khusus ini, isi SP sebelumnya telah
dikurangi menjadi 2FH dan kemudian diisi dengan 20H.

3.6.Operasi Exchange antar Register.


Sintaks : XCH A, <byte>
Fungsi : Saling menukar isi data register A dengan isi data suatu register yang
berada pada operand kedua.
Deskripsi : XCH mengisi register A dengan isi register yang ditunjuk oleh operand 2.
Pada saat yang sama isi register pada operand 2 akan diisi oleh data yang
berada di dalam register A. Operand pertama dan kedua dapat berupa
register, direct atau pengalamatan tidak langsung.

Contoh : R0 = 20H. Register A = 3FH (00111111B). Lokasi internal RAM 20H


menyimpan data 75H (01110101B). Maka instruksi : XCH A,@R0 akan
menyebabkan lokasi 20H RAM berisi data 3FH (00111111B) dan register
A menyimpan data 75H (01110101B).

Varian : XCH A, Rn
XCH A, direct
XCH A, @Ri

3.7.Operasi Exchange Digit.


Sintaks : XCHD A, @Ri
Fungsi : Saling menukar isi data nibel bawah (bit 3 hingga bit 0) register A

Deskripsi : Saling menukar isi data nibel bawah (bit 3 hingga bit 0) register A, yang
secara umum berupa data heksadesimal atau BCD, dengan nibel bawah
dari suatu lokasi RAM yang dialamati secara tidak langsung oleh operand
kedua.

Contoh : R0 = 20H. Register A = 36H (00110110B). Lokasi internal RAM 20H


menyimpan data 75H (01110101B). Maka instruksi : XCHD A,@R0
akan menyebabkan lokasi 20H RAM berisi data 76H (01110110B) dan
register A menyimpan data 35H (00110101B).

4. Instruksi Manipulasi Boolean


4.1.Operasi OR dengan bit Carry.
Sintaks : ORL C,<source-bit>
Fungsi : Melakukan operasi OR antara source-bit dengan bit Carry (C)
Deskripsi : Jika nilai source bit adalah logika 0, maka ORL C akan membuat C tetap
pada isinya semula.Tanda slash (/) diawal operand dalam bahasa
assembly, mencirikan logika komplemen (pembalikan bit) dari nilai
source-bit. Tetapi isi dari source-bit itu sendiri tidak berubah. Tidak ada
flag yang dipengaruhi oleh operasi ini.

Hanya pengalamatan langsung yang bisa digunakan untuk operand source.

Contoh : Tiga baris program dibawah ini akan men-set bit carry jika, P1.0 = 1,
ACC.7 = 1 dan OV=0 :
ANL C,P1.0 ;Pindahkan status P1 bit 0 ke bit carry
ANL C,ACC.7 ;AND antara C dengan Akumulator bit 7
ANL C,/OV ;AND antara C dengan flag Overflow yang
;telah dikomplemen sebelumnya
Varian : ANL C, bit
ANL C, /bit

4.2.Operasi AND dengan bit Carry.


Sintaks : ANL C,<source-bit>
Fungsi : Melakukan operasi AND antara source-bit dengan bit Carry (C)
Deskripsi : Jika nilai source bit adalah logika 0, maka ANL C akan meng-clear flag
carry. Tanda slash (/) diawal operand dalam bahasa assembly, mencirikan
logika komplemen (pembalikan bit) dari nilai source-bit. Tetapi isi dari
source-bit itu sendiri tidak berubah. Tidak ada flag yang dipengaruhi oleh
operasi ini.

Hanya pengalamatan langsung yang bisa digunakan untuk operand source.

Contoh : Tiga baris program dibawah ini akan men-set bit carry jika, P1.0 = 1,
ACC.7 = 1 dan OV=0 :
ANL C,P1.0 ;Pindahkan status P1 bit 0 ke bit carry
ANL C,ACC.7 ;AND antara C dengan Akumulator bit 7
ANL C,/OV ;AND antara C dengan flag Overflow yang
;telah dikomplemen sebelumnya
Varian : ANL C, bit
ANL C, /bit

4.3.Operasi Clear Bit.


Sintaks : CLR bit
Fungsi : Melakukan operasi menghapus bit.
Deskripsi : Instruksi ini akan membuat bit di operand menjadi ‘0’. Tidak ada flag
yang dipengaruhi oleh instruksi ini. Instruksi ini dapat bekerja pada flag
Carry atau pada setiap register pengalamatan bit langsung.

Contoh : P1 sebelumnya telah ditulis dengan 5DH (01011101B). Instruksi berikut,


CLR P1.2 akan membuat P1 menjadi 59H (01011001B)

Varian : CLR C
CLR bit

4.4.Operasi Set Bit.


Sintaks : SETB bit
Fungsi : Melakukan operasi men-set bit (membuat menjadi ‘1’)
Deskripsi : Instruksi ini akan membuat bit di operand menjadi ‘1’. Tidak ada flag
yang dipengaruhi oleh instruksi ini. Instruksi ini dapat bekerja pada flag
Carry atau pada setiap register pengalamatan bit langsung.

Contoh : Flag carry di-clear. Output P1 telah ditulis dengan nilai 34H (00110100B).
Instruksi berikut akan men-set flag carry menjadi ‘1’ dan merubah output
data pada P1 menjadi 35H (00110101B).

Varian : SETB C
SETB bit

4.5.Operasi Komplemen Bit.


Sintaks : CPL bit
Fungsi : Melakukan pembalikan nilai logika suatu bit.
Deskripsi : Instruksi ini akan membalik nilai logika yang semula ‘0 menjadi ‘1’, dan
sebaliknya. Tidak ada flag yang dipengaruhi oleh instruksi ini.

Contoh: P1 telah ditulis sebelumnya dengan 5DH (01011101B). Maka urutan


instruksi berikut:
CPL P1.1
CPL P1.2
akan membuat P1 menjadi 5BH (01011011B).

Varian : CPL C
CPL bit

4.6.Transfer data 1-bit


Sintaks : MOV <Dest-Bit, <Source-Bit>
Fungsi : Memindahkan data selebar 1 bit
Deskripsi : Instruksi ini akan menyalin informasi bit dari operand kedua kepada
operand kesatu. Salah satu dari operand harus berupa flag Carry. Operand
lainnya berupa pengalamatan bit.

Contoh : Flag Carry diset ‘1’. Data yang hadir pada P3 adalah 11000101B (0C5H).
Data yang ditulis sebelumnya ke P1 adalah 35H (00110101B).

MOV P1.3, C ;P1.3 = 1


MOV C, P3.3 ; C = 0
MOV P1.2, C ;P1.2 = 0

Tiga baris instruksi diatas akan membuat bit (flag) carry menjadi ‘0’ dan
merubah P1 menjadi 39H (00111001B)

Varian : MOV C, bit


MOV bit, C

4.7.Lompat bersyarat bit.


4.7.1. Lompat jika Carry = 1.
Sintaks : JC rel
Fungsi : Lompat ke suatu alamat tertentu (operand rel) jika isi bit Carry=1.
Deskripsi : Flag carry diset, maka instruksi JC akan menyebabkan program melompat
ke alamat yang ditunjuk oleh operand. Sebaliknya jika C=0 program akan
melanjutkan instruksi berikutnya dibawah instruksi JC. Tidak ada flag
yang berubah oleh instruksi ini.

Contoh : Flag C=0. Urutan instruksi dibawah ini menyebabkan C=1 dan program
melompat ke alamat yang ditunjuk oleh LABEL2.
JC LABEL1
CPL C
JC LABEL2

4.7.2. Lompat jika Carry = 0.


Sintaks : JNC rel
Fungsi : Lompat ke suatu alamat tertentu (operand rel) jika isi bit Carry=0.
Deskripsi : Flag carry di-clear, maka instruksi JNC akan menyebabkan program
melompat ke alamat yang ditunjuk oleh operand. Sebaliknya jika C=1
program akan melanjutkan instruksi berikutnya dibawah instruksi JNC.
Tidak ada flag yang berubah oleh instruksi ini.

Contoh : Flag C=1. Urutan instruksi dibawah ini menyebabkan C=0 dan program
melompat ke alamat yang ditunjuk oleh LABEL2.

JNC LABEL1
CPL C
JNC LABEL2

4.7.3. Lompat jika suatu bit = 1.


Sintaks : JB bit, rel
Fungsi : Lompat ke suatu alamat tertentu (operand rel) jika isi suatu bit =1.
Deskripsi : Jika suatu bit bernilai ‘1’, maka instruksi JB akan menyebabkan program
melompat ke alamat yang ditunjuk oleh operand. Sebaliknya jika suatu bit
= 0 maka program akan melanjutkan instruksi berikutnya dibawah
instruksi JB. Tidak ada flag yang berubah oleh instruksi ini.

Contoh : Data yang hadir pada port input adalah 11001010B dan A=56H
(01010110B). Maka instruksi dibawah ini akan membuat program
mengeksekusi instruksi yang terdapat di LABEL2.

JB P1.2, LABEL1
JB ACC.2, LABEL2

4.7.4. Lompat jika suatu bit = 0.


Sintaks : JNB bit, rel
Fungsi : Lompat ke suatu alamat tertentu (operand rel) jika isi suatu bit =0.
Deskripsi : Jika suatu bit bernilai ‘0’, maka instruksi JNB akan menyebabkan program
melompat ke alamat yang ditunjuk oleh operand. Sebaliknya jika suatu bit
= 1 maka program akan melanjutkan instruksi berikutnya dibawah
instruksi JNB. Tidak ada flag yang berubah oleh instruksi ini.
Contoh : Data yang hadir pada port input adalah 11001010B dan A=56H
(01010110B). Maka instruksi dibawah ini akan membuat program
mengeksekusi instruksi yang terdapat di LABEL2.

JNB P1.3, LABEL1


JNB ACC.3, LABEL2

4.7.5. Lompat jika suatu bit = 1 dan hapus bit.


Sintaks : JBC bit, rel
Fungsi : Lompat ke suatu alamat tertentu (operand rel) jika isi suatu bit =1 dan
menghapus bit tersebut menjadi ‘0’.
Deskripsi : Jika suatu bit bernilai ‘1’, maka instruksi JBC akan menyebabkan program
melompat ke alamat yang ditunjuk oleh operand sekaligus membuat bit
tersebut dihapus menjadi ‘0’. Sebaliknya jika suatu bit = 0 maka program
akan melanjutkan instruksi berikutnya dibawah instruksi JBC. Tidak ada
flag yang berubah oleh instruksi ini.

Contoh : A menyimpan data 56H (01010110B). Maka instruksi dibawah ini akan
membuat program mengeksekusi instruksi yang terdapat di LABEL2 dan
akumulator dimodifikasi menjadi 52H (01010010B).

JBC ACC.3, LABEL1


JBC ACC.2, LABEL2

5. Instruksi Pencabangan.
5.1.Pemanggilan (pencabangan) Subrutin.
5.1.1. Absolute Call (Pencabangan berjangkuan 2 Kilo).
Sintaks : ACALL addr11
Fungsi : Memanggil (lompat ke) suatu subrutin berjarak maksimum 2K
Deskripsi : Instruksi ini dengan tanpa persyaratan apapun akan melompat ke suatu
subrutin yang terletak pada lokasi yang ditunjuk oleh suatu label. Instruksi
ini akan menambah 2 isi register PC untuk membentuk alamat kembali ke
program utama, lalu mem-push alamat kembali tersebut ke dalam stack
(byte terendah terlebih dulu yg di push), dan menaikkan isi register SP
tersebut 2 kali. Program akan bercabang (melompat) ke suatu alamat yang
dibentuk oleh gabungan 5 bit tertinggi PC dengan byte kedua yang
dikandung oleh instruksi. Subrutin yang dipanggil harus dalam jangkauan
2 Kilo ruang program memori dari tempat dimana subrutin itu dipanggil.
Tidak ada flag yang berubah oleh instruksi ini.

Contoh : Isi register SP pada saat sebelum terjadi pencabangan adalah 07H. Label
SUBRTN berada pada program memori dengan alamat 0345H. Setelah
mengeksekusi instruksi berikut (terletak di alamat 0123H) : ACALL
SUBRTN
SP berubah menjadi 09H, lokasi RAM alamat 08H dan 09H akan berisi
25H dan 01H, dan PC berisi 0345H (alamat awal subrutin itu berada).

5.1.2. Long Call (Pencabangan berjangkuan 64 Kilo).


Sintaks : LCALL addr16
Fungsi : Memanggil (lompat ke) suatu subrutin berjarak maksimum 64 Kilo.
Deskripsi : Instruksi ini dengan tanpa persyaratan apapun akan melompat ke suatu
subrutin yang terletak pada lokasi yang ditunjuk oleh suatu label. Instruksi
ini akan menambah 3 isi register PC untuk membentuk alamat kembali ke
program utama, lalu mem-push 16-bit alamat kembali tersebut ke dalam
stack (byte terendah terlebih dulu yg di push), dan menaikkan isi register
SP tersebut 2 kali. Program akan bercabang (melompat) ke suatu alamat
yang dibentuk oleh gabungan 2 byte PC dengan 1 byte yang dikandung
oleh instruksi. Subrutin yang dipanggil dalam jangkauan 64 Kilo ruang
alamat (ruang program memori) dari tempat dimana subrutin itu dipanggil.
Tidak ada flag yang berubah oleh instruksi ini.

Contoh : Isi register SP pada saat sebelum terjadi pencabangan adalah 07H. Label
SUBRTN berada pada program memori dengan alamat 3456H. Setelah
mengeksekusi instruksi berikut (terletak di alamat 0123H) : ACALL
SUBRTN
SP berubah menjadi 09H, lokasi RAM alamat 08H dan 09H akan berisi
26H dan 01H, dan PC berisi 3456H (alamat awal subrutin itu berada).

5.2.Penutup pencabangan subrutin.


5.2.1. Return from Call
Sintaks : RET
Fungsi : Kembali ke tempat dimana program sebelumnya bercabang.
Deskripsi : Instruksi RET mem-pop (mengeluarkan) byte tinggi dan byte rendah PC
dari tempat stack. Dua byte ini merupakan alamat tempat kembali ke
tempat sebelum pencabangan terjadi. Kemudian register SP dikurangi dua.
Tidak ada flag yang dipengaruhi oleh instruksi ini.

Contoh : Isi register SP berisi 0BH. Lokasi internal RAM 0AH dan OBH
menyimpan nilai 23H dan 01H. Instruksi berikut : RET menyebabkan
SP berisi 09H dan program melanjutkan eksekusi instruksi pada lokasi
0123H.

5.2.2. Return from interupt.


Sintaks : RETI
Fungsi : Kembali ke tempat dimana program sebelumnya bercabang akibat adanya
interupsi.
Deskripsi : Instruksi RETI mem-pop (mengeluarkan) byte tinggi dan byte rendah PC
dari tempat stack. Dua byte ini merupakan alamat tempat kembali ke
tempat sebelum pencabangan terjadi. Kemudian register SP dikurangi dua.
Tidak ada flag yang dipengaruhi oleh instruksi ini.

Contoh : Isi register SP berisi 0BH. Ketika interupsi terdeteksi, suatu instruksi
terakhir selesai dieksekusi pada alamat 0122H. Lokasi internal RAM 0AH
dan OBH menyimpan nilai 23H dan 01H. Instruksi berikut : RETI
menyebabkan SP berisi 09H dan program melanjutkan eksekusi instruksi
pada lokasi 0123H.

5.3.Lompat ke suatu alamat tertentu.


5.3.1. Absolute Jump (Pencabangan berjangkuan 2 Kilo).
Sintaks : AJMP addr11
Fungsi : Llompat ke suatu alamat tertentu berjarak maksimum 2K
Deskripsi : Instruksi ini dengan tanpa persyaratan apapun akan melompat ke suatu
alamat yang terletak pada lokasi yang ditunjuk oleh suatu label. Alamat
dibentuk oleh gabungan 5 bit tertinggi PC dengan byte kedua dari
instruksi.

Contoh : Label JMPADR berada pada program memori dengan alamat 0123H.
Instruksi berikut (terletak di alamat 0345H) : AJMP JMPADR
akan menyebabkan PC diisi dengan nilai 0123H.

5.3.2. Long Jump (Pencabangan berjangkuan 64 Kilo).


Sintaks : LJMP addr16
Fungsi : Lompat ke suatu alamat tertentu berjarak maksimum 64K
Deskripsi : Instruksi ini dengan tanpa persyaratan apapun akan melompat ke suatu
alamat yang terletak pada lokasi yang ditunjuk oleh suatu label. Alamat
dibentuk oleh gabungan 2 byte register PC dengan 1 byte byte kedua dan
ketiga dari instruksi ini. Tidak ada flag yang diberubah oleh instruksi ini.

Contoh : Label JMPADR berada pada program memori dengan alamat 1234H.
Instruksi berikut (terletak di alamat 0345H) : LJMP JMPADR
akan menyebabkan PC diisi dengan nilai 1234H.

5.3.3. Short Jump (Pencabangan berjangkuan 128 Byte).


Sintaks : SJMP rel
Fungsi : Lompat ke suatu alamat tertentu berjarak maksimum 128 byte.
Deskripsi : Instruksi ini dengan tanpa persyaratan apapun akan melompat ke suatu
alamat yang terletak pada lokasi yang ditunjuk oleh suatu label. Jarak
lompatan maksimal adalah 128 byte. Tidak ada flag yang diberubah oleh
instruksi ini.
Contoh : Label RELADR berada pada program memori dengan alamat 0123H.
Instruksi berikut (terletak di alamat 100H) : SJMP RELADR
akan menyebabkan PC diisi dengan nilai 0123H.

5.4.Lompat bersyarat.
5.4.1. Lompat jika Akumulator = 0.
Sintaks : JZ rel
Fungsi : Lompat ke suatu alamat tertentu jika isi register A=0.
Deskripsi : Jika seluruh bit di dalam register Akumulator adalah ‘0’, instruksi JZ
membuat program melompat ke suatu alamat yang ditunjuk oleh Label rel.
Namun jika Akumulator tidak sama dengan 0, maka program akan
melanjutkan instruksi berikutnya dibawah instruksi ini.

Contoh : Register Akumulator berisi 01H. Maka Instruksi berikut secara berurutan :
JZ LABEL1
DEC A
JZ LABEL2
akan merubah isi register A menjadi 00H dan menyebabkan program
melanjutkan mengeksekusi instruksi yang ditunjuk oleh LABEL2.

5.4.2. Lompat jika Akumulator tidak 0.


Sintaks : JNZ rel
Fungsi : Lompat ke suatu alamat tertentu jika isi register A <> 0.
Deskripsi : Jika seluruh bit di dalam register Akumulator tidak sama dengan 0,
instruksi JNZ membuat program melompat ke suatu alamat yang ditunjuk
oleh Label rel. Namun jika Akumulator sama dengan 0, maka program
akan melanjutkan instruksi berikutnya dibawah instruksi ini.

Contoh : Register Akumulator berisi 00H. Maka Instruksi berikut secara berurutan :
JNZ LABEL1
INC A
JNZ LABEL2
akan merubah isi register A menjadi 01H dan menyebabkan program
melanjutkan mengeksekusi instruksi yang ditunjuk oleh LABEL2.

5.4.3. Kurangi satu dan lompat jika <> 0.


Sintaks : DJNZ <byte>, <rel-addr>
Fungsi : Kurangi satu isi suatu register dan lompat ke suatu alamat tertentu jika isi
register A <> 0.
Deskripsi : DJNZ mengurangi satu suatu alamat dan melompat ke alamat lain yang
ditunjuk oleh operand kedua jika hasil pengurangan satu tersebut belum
mencapai nilai nol (zero). Bila suatu nilai yang dikurangi satu itu adalah
00H, maka akan menjadi 0FFH. Tidak ada flag yang dipengaruhi oleh
instruksi ini. Lokasi yang isinya dikurangi satu bisa berupa register atau
berupa byte pengalamatan langsung.

Contoh : Lokasi RAM internal beralamat 40H, 50H dan 60H menyimpan data 01H,
70H dan 15H. Maka Instruksi berikut secara berurutan :
DJNZ 40H, LABEL1
DJNZ 50H, LABEL2
DJNZ 60H, LABEL3
menyebabkan program melompat ke instruksi yang berada pada LABEL2
dimana lokasi RAM 40H, 50H dan 60H berubah menjadi 00H, 6FH dan
15H. Baris pertama instruksi diatas tidak melompat ke LABEL1
disebabkan hasil pengurangan satu telah mencapai nol.

Instruksi DJNZ membuat eksekusi looping program menjadi sederhana


yang umumnya untuk membentuk waktu tunda (time delay). Perhatikan
urutan instruksi dibawah ini :

MOV R2, #8
TOGGLE CPL P1.7
DJNZ R2, TOGGLE
Tiga baris instruksi diatas akan mengkomplemen (toggle) port satu bit 7
(P1.7) sebanyak delapan kali dan sekaligus menghasilkan 4 pulsa output.
Tiap pulsa membutuhkan 3 siklus mesin (2 siklus untuk DJNZ dan 1
siklus untuk CPL)
Varian : DJNZ Rn, rel
DJNZ direct, rel
5.4.4. Lompat jika hasil perbandingan tidak sama.
Sintaks : CJNE <dest-byte>,<source-byte>, rel
Fungsi : Membandingkan 2 operand dan lompat jika tidak sama.
Deskripsi : CJNE membandingkan 2 operand dan melompat jika kedua nilai operand
tersebut tidak sama. Alamat pencabangan ditunjuk oleh operand ketiga
(rel). Flag carry diset jika operand ke-1 lebih ‘<’ (lebih kecil) daripada
operand ke-2. Dan flag carry tidak akan diset bila kedua operand adalah
‘=’ atau ‘>’. Isi dari kedua operand tidak berubah oleh instruksi ini. Dua
operand pertama menyebabkan adanya 4 kombinasi mode pengalamatan.
Contoh : Diasumsikan register A sedang menyimpan data 34H dan R7 menyimpan
56H. Lihat instruksi-instruksi dibawah ini :
CJNE R7, #60H, NOT_EQ
….. ……. ;R7=60H
NOT_EQ JC REQ_LOW ;Jika R7<60H
….. ……. ;R7>60H

Baris pertama instruksi diatas akan membuat bit C=1 dan program
melompat ke instruksi yang diberi label NOT_EQ. Dengan menguji flag
carry, instruksi ini akan menentukan kondisi R7 apakah lebih besar atau
lebih kecil dari 60H. Jika lebih kecil, maka program melompat ke label
REQ_LOW. Jika lebih besar, program akan melanjutkan eksekusi di baris
berikutnya.

Varian : CJNE A, direct, rel


CJNE A, #data, rel
CJNE Rn, #data, rel
CJNE @Ri, #data, rel

5.5.Lompat dengan pengalamatan tidak langsung.


Sintaks : JMP @A+DPTR
Fungsi : Melompat ke suatu alamat yang ditunjuk oleh operand.
Deskripsi : Instruksi ini menambahkan 8-bit isi register A dengan 16 bit data pointer
dan mengisi hasil penjumlahan itu ke dalam register PC. Hasil
penjumlahan itu berguna untuk mengetahui pada Label mana program
akan melompat. Isi register A dan DPTR tidak berubah oleh eksekusi
instruksi ini. Begitu pula flag carry, juga tidak dipengaruhi oleh instruksi
ini.
Contoh : Suatu nilai di dalam Akumulator berubah dari 0 hingga 6. Instruksi berikut
menyebabkan program melompat ke satu dari empat instruksi AJMP.
Keempat instruksi AJMP berada di dalam tabel yang di mulai pada label
bernama JMP_TBL.

MOV DPTR, #JMP_TBL


JMP @A+DPTR
JMP_TBL: AJMP LABEL0
AJMP LABEL1
AJMP LABEL2
AJMP LABEL3

Jika A=04H ketika memulai urutan instruksi diatas, maka program akan
melompat pada LABEL2. Lompat ke LABEL0 terjadi bila A=0, lompat ke
LABEL1 terjadi bila A=2, lompat ke LABEL 2 terjadi bila A=4 dan
lompat ke LABEL3 terjadi bila A=6. Hal ini disebabkan karena instruksi
AJMP adalah instruksi yang panjangnya 2 byte di dalam program
memori.

5.6. No Operation.
Sintaks : NOP
Fungsi : Memberikan waktu tunda (time delay) selama 1 siklus mesin.
Deskripsi : Tidak ada register dan flag yang dipengaruhi oleh instruksi ini. Instruksi
ini berguna untuk memberikan waktu tunda yang sederhana kepada
program.

Contoh : Pulsa output yang menuju ‘0’ pada bit ke-7 port 2 akan memiliki lebar
secara tepat sebesar 5 siklus mesin. Dengan instruksi sederhana
SETB/CLR urutan program dibawah ini menghasilkan satu pulsa,
sehingga 4 instruksi NOP harus disisipkan untuk dapat menghasilkan 5
siklus mesin.

CLR P2.7
NOP
NOP
NOP
NOP
SETB P2.7

6. END
Instruksi assembler direktif END digunakan sebagai tanda bahwa tidak ada lagi
program assembly yang perlu di-assembled.

---oOo ---
BAB 3
MEMULAI MEMPROGRAM
I. Perangkat Modul Pelatihan.
Percobaan-percobaan yang akan dilakukan membutuhkan 3 modul yang dirangkai
menjadi satu diatas papan acrylic. Lihat gambar dibawah.

L1
L2
L3 SG4 SG3 SG2 SG1
74240

L4
L5
L6
L7 7447 POWER SUPPLY
L8

DESIMAL
S4 S3 S2 S1 D C B A
LSB MSB +

LED PWR 7-SEGMEN

PORT 0 PORT 2
0 7 + 7 0

PWR

R
S
2
3
2
AT89C51
MAX232

PIN-1

V G
C N
C D

0 PORT 1 7 PWR 0 PORT 3 7

+
KEYPAD DIP-SW

PWR
PUSH
ON
BUTTON

123 456 78

8 4
1 2 3

4 5 6 7 3

7 8 9
6 2
0
* #
5 1

Gambar 1
Papan Percobaan
1. Modul Kontroler.
Seperti sudah dibahas sedikit pada sessi-1, bahwa diperlukan minimal 2 rangkaian
dasar pada modul kontrolernya yaitu rangkaian POR dan rangkaian On-chip Oscillator.
Modul ini terletak di tengah, diantara modul peraga dan modul input. Lihat gambar 1.
Modul ini dibuat universal dengan cara mengeluarkan seluruh port melalui suatu
konektor. Melalui 4 buah port inilah, berbagai peralatan input dan output dapat
dihubungkan.
Terlihat pada gambar 2 dibawah ini, ada dua rangkaian tambahan selain
rangkaian POR dan On-chip Oscillator. Yaitu berupa chip interface TTL-RS232 dan
rangkaian interface speaker. Dg adanya rangkaian interface TTL-RS232 maka modul ini
dapat dihubungkan ke peralatan PC (Personal Computer). Dan dengan adanya rangkaian
AT89C51

POR RST Konektor


PORT-0 Port 0

Konektor
PORT-1
Port 1
ON-CHIP XTAL1
OSCILLATOR XTAL2
Konektor
PORT-2
Port 2

Konektor
INTERFACE TX PORT-3
PC Port 3
TTL - RS232 RX
P2.0

Speaker

interface speaker, dapat mensimulasikan bagaimana sebuah mikrokontroler dapat


memainkan sebuah lagu.
Gambar 2
Blok diagram rangkaian modul kontroler

2. Modul input.
Modul input berisi 3 macam saklar/switch yang berfungsi untuk mensimulasikan
pemasukan data ke dalam mikrokontroler AT89C51. Ketiga macam saklar tersebut
adalah Push button, Keypad dan DIP-Switch.

Resistor Pull-up dan Pull-down.


VCC

Resistor
VCC
Pull-up

Switch
SISTEM SISTEM
DIGITAL DIGITAL
Switch
Resistor
Pull-down

(i) ( ii )
Resistor Pull-up Resistor Pull-down

Gambar 3
(i) Resistor Pull-up
(ii) Resistor Pull-down

Prinsip pemasukan data ke dalam mikrokontroler dan sistem digital lainnya


adalah dengan menggunakan suatu resistor yang dikenal sebagai resistor pull-up dan
resistor pull-down. Besarnya nilai resistansi pada resistor pull-up dan pull-down berkisar
antara 4K7 hingga 10K untuk tegangan VCC sebesar 5 volt, tergantung kepada besarnya
arus yang diinginkan untuk mengalir melewati resistor pull-up/pull-down tersebut.
Pada penggunaan resistor pull-up, switch/saklar dalam kondisi off (terbuka) akan
memberikan logika ‘1’ kepada sistem digital. Hal ini terjadi karena pada saat switch off,
mengalir arus dari VCC masuk ke sistem digital melewati resistor pull-up. Pada kondisi
on (tertutup) maka sistem digital mendapat input logika ‘0’ karena switch/saklar langsung
terhubung ke ground tanpa melalui resistor apapun.
Pada penggunaan resistor pull-down terjadi sebaliknya. Pada kondisi
switch/saklar off (terbuka) maka sistem digital mendapat input logika ‘0’ karena
terhubung ke ground melalui resistor pull-down. Dan pada kondisi on (tertutup), sistem
digital mendapat input logika ‘1’ karena langsung terhubung ke VCC (dalam hal ini
tegangan +5 volt) tanpa melalui resistor apapun.
Saklar Push button dan Dip-Switch.
Pada modul input digunakan prinsip resistor pull-up karena pada setiap port
(kecuali Port-0) pada mikrokontroler AT89C51 telah terdapat resistor pull-up internal di
dalam chip mikrokontroler AT89C51 sebesar 4K7. Dengan demikian maka rangkaian
modul input untuk saklar push-button dan DIP-Switch adalah sebagai berikut :

Konektor Konektor
Push Button DIP-SW
S1 SW1
S2 SW2
S3 SW3
S4 SW4
S5 SW5
S6 SW6
S7 SW7
S8 SW8

(i) ( ii )
Rangkaian Saklar Rangkaian Saklar
Push Button DIP-Switch

Gambar 4
Rangkaian saklar Push-button dan DIP-switch

Dari gambar diatas terlihat bahwa kedua rangkaian untuk saklar push-button
maupun DIP-Switch sama persis. Yang membedakannya hanya nama dari konektornya.
Untuk saklar push-button konektor yang terhubung kepadanya dinamakan konektor
PUSH-BUTTON. Sedangkan untuk saklar DIP-Switch, konektornya dinamakan konektor
DIP-SW.
Penggunaan saklar push-button maupun dip-switch berfungsi untuk
mensimulasikan pemasukan data ke dalam mikrokontroler AT89C51. Ada suatu instruksi
pada AT89C51 yang dapat mengalamati data dalam ukuran ‘bit’. Dengan demikian dapat
dilakukan suatu simulasi pemasukan data baik dalam ukuran 1 byte data maupun 1 bit
data. Data 1 bit dapat berupa 1 titik sensor, 1 buah level switch, dsb.
Terdapat 1 macam saklar lagi yang terdapat pada modul input, yaitu keypad.
Berbeda dengan saklar push button dan dip-switch yang bersifat independen antara satu
saklar dengan saklar lain, setiap switch pada keypad tidak independen. Dalam arti bahwa
saklar-saklar yang tersusun pada keypad saling terhubung secara matrik (baris dan
kolom).

Keypad.
Keypad adalah salah satu dari sekian banyak jenis saklar/switch yang ada di
pasar. Berbeda dengan push button atau dip-switch, masing-masing saklar yang terdapat
pada keypad saling terhubung secara matrik (disusun berdasarkan baris dan kolom). Ada
dua macam keypad yang tersedia di pasar, yaitu keypad 4x3 dan keypad 4x4. Pada modul
input ini digunakan jenis keypad 4x3. Lihat gambar 5 dibawah ini.

PORT 1
0 1 2 3 4 5 6
GND
C1 C2 C3 B1 B2 B3 B4 COM

C1 C2 C3

B1
1 2 3
1 2 3

B2
4 5 6
4 5 6

B3 7 8 9
7 8 9

0 #
B4
* 0 # *
(i) ( ii )

Gambar 5
(i) Rangkaian dalam keypad 4x3
(ii) Koneksi Keypad 4x3 ke Port 1 pada modul percobaan

Gambar (i) memperlihatkan bagaimana 12 switch saling dihubungkan menjadi


susunan 4 baris dan 3 kolom. Apabila switch ‘1’ ditekan maka pin B1 dan C1 akan saling
terhubung dan bila switch ‘4’ ditekan maka pin B2 dan C1 akan saling terhubung. Begitu
seterusnya, pin Baris dan pin Kolom akan saling terhubung bila switch pada persilangan
diatasnya ditekan.
Gambar (ii) memperlihatkan bentuk fisik keypad 4x3 beserta susunan pin yang
tersedia padanya. Terdapat 7 pin pada keypad 4x3 yang mewakili 4 buah baris dan 3 buah
kolom, ditambah 1 pin yang bernama common. Pin common adalah pin yang mempunyai
koneksi kepada 12 switch yang ada. Dengan ditekannya salah satu dari 12 switch yang
tersedia, maka pin common ikut terhubung kepada baris dan kolom tempat dimana switch
tersebut berada. Hal ini sangat berguna untuk mempermudah membuat program dimana
mikrokontroler harus dapat membedakan switch mana yang ditekan tanpa melakukan
proses scanning. Terlihat pada gambar (ii) diatas bahwa pin common terhubung ke
ground. Dan secara internal di dalam AT89C51 setiap bit pada port 1 terhubung secara
pull-up melalui suatu resistor sebesar 4K7. Dengan demikian bila ada switch yang
ditekan akan memberikan nilai baris dan kolom yang berlogika ‘0’ pada posisi dimana
switch tersebut ditekan. Baris dan kolom lainnya akan berlogika ‘1’ (karena di pull-up ke
positif catu daya). Lihat tabel 1 dibawah ini.

Tabel 1
Pola biner penekanan switch pada keypad
Switch DATA PADA PORT 1
yang
ditekan
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
1 1 1 1 1 0 1 1 0
2 1 1 1 1 0 1 0 1
3 1 1 1 1 0 0 1 1
4 1 1 1 0 1 1 1 0
5 1 1 1 0 1 1 0 1
6 1 1 1 0 1 0 1 1
7 1 1 0 1 1 1 1 0
8 1 1 0 1 1 1 0 1
9 1 1 0 1 1 0 1 1
0 1 0 1 1 1 1 1 0
* 1 0 1 1 1 1 0 1
# 1 0 1 1 1 0 1 1
Dengan melakukan pembandingan bit yang masuk pada port 1, maka
mikrokontroler dapat mengenali tombol/switch mana yang ditekan. Lalu hasil pengenalan
tersebut diolah sesuai dengan kebutuhan sistem yang diinginkan.
V

+5v

2,4v

0v t

Gambar 6
Switch bounching

Hal yang perlu diperhatikan pada saat pendeteksian saklar atau switch adalah
terjadinya apa yang dikenal sebagai switch bounching (getaran saklar). Getaran saklar
adalah suatu kondisi dimana terjadi suatu pulsa liar yang dapat mengakibatkan terjadinya
kesalahan pembacaan data. Lihat gambar 6.
Pada tepi positif, getaran terjadi hingga mencapai level yang bukan lagi sebagai
logika ‘1’. Sehingga mikrokontroler menganggap peralihan ini terdiri dari banyak pulsa.
Padahal misalnya diharapkan hanya ada satu peralihan pulsa yaitu dari ‘0’ menuju ‘1’.
Begitu juga pada tepi negatif, yaitu peralihan dari ‘1’ menuju ‘0’ dapat terjadi bounching
yang tidak diharapkan.
Ada 2 cara untuk menghindari kesalahan pembacaan saklar akibat dari bounching
ini, yaitu dengan menambahkan flip-flop RS pada setiap switch dan atau secara software.
Secara software switch bounching dapat dihilangkan dengan memberi suatu delay
minimal 20 mili detik sebelum status switch/saklar dibaca oleh mikrokontroler. Dengan
adanya delay tersebut diharapkan status logika sudah mencapai kondisi stabil, sehingga
efek bounching tersebut dapat dihilangkan.

3. Modul Peraga (Output).


Modul peraga berisi 2 macam rangkaian display yang berfungsi untuk
mensimulasikan pengeluaran data dari mikrokontroler AT89C51. Kedua macam display
tersebut adalah 8 buah LED (Light Emitting Diode) dan 4 display 7-segmen.
Delapan buah LED.
Terdapat delapan buah LED yang independen. Masing-masing digerakkan oleh
suatu penyanggah (driver) inverting tiga keadaan (tri-state). Lihat gambar 7 dibawah ini :

VCC

Konektor VCC
L1 L2 L3 L4 L5 L6 L7 L8
LED 20

17 3
15 5
13 7
11 9
8 74240 12
6 14
4 16
2 18

19 10 1

Gambar 7
Rangkaian 8 buah LED

Terlihat pada gambar 7, bahwa setiap LED terhubung dengan resistor yang
besarnya masing-masing 240 Ohm. Resistor ini berfungsi untuk membatasi arus yang
diijinkan untuk mengalir melalui LED. LED akan menyala apabila input pada driver yang
bersesuai mendapat logika ‘1’. Sebagai contoh apabila pin 17 IC 74240 mendapat logika
‘1’ maka LED L1 menyala. Dan apabila mendapat logika ‘0’ maka LED akan padam.
Susunan delapan buah LED mewakili 1 byte data yang dikirim oleh
mikrokontroler AT89C51. Ada suatu instruksi pada AT89C51 yang dapat mengalamati
data dalam ukuran ‘bit’. Dengan demikian dapat dilakukan suatu simulasi pengeluaran
data baik dalam ukuran 1 byte data maupun 1 bit data. Data 1 bit dapat dianggap berupa
penggerak kontak relay, penggerak katup solenoid, dsb.

Led 7-Segmen.
Pada modul training terdapat display led yang bernama led 7-segmen. Dinamakan
7-segmen karena display tersebut terdiri atas 7 buah led, yang disusun sedemikian rupa
sehingga mampu menampilkan angka dari 0 sampai dengan angka 9. Lihat gambar 8
dibawah ini.
+5

(i)
a b c d e f g a
f b
g
e c
a b c d e f g d

(ii) (iii)

Gambar 8
Led 7-Segmen

Dilihat dari cara menyusun 7 buah led, led 7 segmen dapat dibedakan menjadi 2
jenis yaitu common anoda dan common catoda. Disebut common anoda karena seluruh
kaki anoda pada setiap led disatukan menjadi satu kaki dan pada penggunaannya harus
dihubungkan kepada positif catu daya. Lihat gambar (i). Sedangkan apabila seluruh kaki
katoda pada setiap led disatukan maka led 7-segmen tersebut dikatakan jenis common
catoda. Pada saat digunakan, kaki common catoda ini harus dihubungkan ke ground dari
catu daya. Lihat gambar (ii).
Posisi led ‘a’ sampai dengan led ‘g’ diletakkan sedemikian rupa seperti tampak
pada gambar (iii). Apabila diinginkan terperaga angka 1, maka led ‘b’ dan ‘c’ yang harus
dinyalakan. Apabila diinginkan terperaga angka 2, maka led ‘a’, ‘b’, ‘e’, ‘d’ dan ‘g’.
Led 7-segmen dapat langsung digerakkan oleh port AT89C51 melalui suatu
pembatas arus (resistor) yang diletakkan secara seri pada setiap segmen. Nilai resistor
tersebut berkisar antara 180 ohm hingga 300 ohm, tergantung dengan kecerahan yang
diinginkan. Apabila digerakkan langsung oleh port, maka secara software kita harus
mendefinisikan pola penyalaan led yang diinginkan ke dalam suatu tabel. Dimisalkan
segmen ‘a’ terhubung ke port 2.0,
segmen ‘b’ terhubung ke port 2.1,
segmen ‘c’ terhubung ke port 2.2,
segmen ‘d’ terhubung ke port 2.3,
segmen ‘e’ terhubung ke port 2.4,
segmen ‘f’ terhubung ke port 2.5,
segmen ‘g’ terhubung ke port 2.6,

Maka secara software dibuat suatu tabel yang berisi pola penyalaan seperti yang
diinginkan. Adapun algoritma tabel tersebut adalah sebagai berikut :
Apabila angka ‘1’ terperaga  maka Port 2 = 0000 0110
Apabila angka ‘2’ terperaga  maka Port 2 = 0101 1011
Apabila angka ‘3’ terperaga  maka Port 2 = 0100 1111
Apabila angka ‘4’ terperaga  maka Port 2 = 0110 0110
dan seterusnya.
Untuk mempermudah menampilkan angka pada led 7-segmen dan sekaligus dapat
menghemat penggunaan port, maka perlu ditambahkan chip TTL 7447 yang berfungsi
sebagai dekoder BCD (Binary Code Decimal) To 7-Segment. Chip ini memiliki 4 jalan
masukan BCD yaitu A,B,C,D ; 3 buah pin kendali (LT, BI, RBI) dan 7 buah pin yang
langsung terhubung pada setiap katoda led 7-segmen. Lihat gambar 9 dibawah ini.
a

f
g b

e c

+5 +5
h g e d c b a
VCC LT
BCD TO 7-SEGMEN
BI
TTL 7447
GND RBI
A B C D

Gambar 9
Decoder BCD To 7-Segmen

Dari gambar diatas terlihat bahwa pin data yang dibutuhkan hanya 4 bit untuk
dapat mendisplaykan angka-angka. Ke-empat pin BCD chip 7447 dapat langsung
dihubungkan ke salah satu port pada AT89C51. Angka yang ingin ditampilkan pada led
7-segmen dikirim secara software oleh AT89C51 melalui port yang tersedia. Data biner
yang dikirim sesuai dengan angka yang akan ditampilkan. Sebagai contoh apabila ingin
ditampilkan angka ‘3’ maka dikirim data biner xxxx 0011 melalui Port 2 (apabila P2.0
s/d P2.3 dihubungkan ke pin A s/d D pada chip 7447).
Tiga buah pin kendali, yaitu LT, BI dan RBI dapat diabaikan dengan cara
menghubungkan ketiga pin tersebut ke positif catu daya. Pembahasan ketiga pin dapat
anda baca sendiri pada buku-buku data IC-TTL yang banyak tersedia dipasaran.
Ada kalanya seorang desainer membutuhkan lebih dari satu buah led 7-segmen
sebagai display dari alat yang dirancangnya. Dengan melihat deskripsi yang telah
dijelaskan diatas, maka dapat dipilih satu dari dua cara dibawah ini :
1. Memasang 1 buah chip 7447 untuk setiap led 7-segmen. Dengan demikian apabila
dibutuhkan 10 buah peraga 7-segmen, maka akan dibutuhkan sebanyak 10 buah chip
7447.
2. Cukup memasang 1 buah chip 7447 untuk berapapun banyaknya led 7-segmen yang
dibutuhkan. Apabila dibutuhkan 10 buah peraga 7-segmen, maka cukup 1 buah chip
7447 saja yang dipakai.
Pada cara pertama diatas, jelas dibutuhkan biaya yang besar untuk dapat
menggerakkan 10 buah led 7-segmen. Disamping itu, semakin banyak jumlah chip yang
digunakan dalam suatu sistem, maka konsumsi daya sistem tersebut semakin besar.
Dengan kata lain penggunaan 10 chip akan memboroskan energi yang terpakai pada
sistem tersebut.
Selain kerugian diatas, terdapat kerugian lainnya yaitu dibutuhkan jumlah port
pada mikrokontroler sebanyak : 4 bit x 10 peraga = 40 bit. Suatu jumlah port yang tidak
mungkin tersedia pada mikrokontroler AT89C51.
Mari kita lihat cara kedua. Pada cara kedua cukup digunakan 1 buah chip 7447
untuk sekian banyak 7-segmen yang diinginkan. Bagaimana hal tersebut dapat dilakukan
?
Jawaban dari pertanyaan diatas adalah karena digunakan metode yang dinamakan
scanning (penyapuan). Setiap 7-segmen secara bergantian dinyalakan oleh
mikrokontroler. Hanya ada satu display saja yang menyala pada waktu tertentu untuk
menampilkan data yang diinginkan. Lihat gambar 10.
Dimisalkan data yang akan ditampilkan adalah “9765”. Maka pada langkah
pertama mikrokontroler akan menyalakan display pertama (SG1) dan mematikan display
lain dengan mengirim data biner 1110 pada P2.7 s/d P2.4. Lalu data biner 0101 (desimal
5) dikirim melalui P2.3 s/d P2.0 ke chip TTL 7447 (sebagai data input BCD) sehingga
display SG1 akan mendisplay angka “5”. Langkah kedua mikrokontroler menyalakan
SG2 dan mematikan display lain dengan mengirim data biner 1101 pada P2.7 s/d P2.4.
Lalu data biner 0110 (desimal 6) dikirim melalui P2.3 s/d P2.0 ke chip TTL 7447
sehingga display SG2 akan mendisplaykan angka “6”.

P2.4
P0
P2.5
P2.6
P1 AT89C51

+5 +5 +5 +5
P3
P2.7
P2.3 P2.2 P2.1 P2.0

SG4 SG3 SG2 SG1

A h g e d c b a
B
BCD TO 7-SEGMEN
C TTL 7447
D

Gambar 10
Scanning Pada Display 7-segmen
Demikian seterusnya mikrokontroler menggilir (scanning) penyalaan display
dengan data BCD tertentu. Karena mikrokontroler melakukan proses scanning ini dalam
waktu yang cepat, maka proses mati dan padamnya display tidak terlihat oleh mata.
Adapun rincian pola biner yang harus dikirim (melalui port 2 ) bila angka 9765
ingin ditampilkan pada display 7-segmen dapat dilihat pada tabel berikut :

Tabel 2
Pola biner untuk menampilkan angka ‘9765’

Angka DATA PADA PORT 2


Terperag
a
P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
9 (MSB) 0 1 1 1 1 0 0 1
7 1 0 1 1 0 1 1 1
6 1 1 0 1 0 1 1 0
5 (LSB) 1 1 1 0 0 1 0 1

4. Prosedur Percobaan.
Untuk menghubungkan antara dua modul dibutuhkan kabel penghubung. Total
terdapat 4 buah kabel penghubung berupa kabel pita berinti 8 dan 2 buah kabel
penghubung berinti 2. Kabel penghubung berinti 2 merupakan kabel catu daya yang
menyalurkan tegangan catu dari modul kontroler kepada modul input dan modul display.
Perlu diperhatikan pada saat melakukan suatu percobaan, petunjuk mengenai
hubungan antara satu konektor dengan konektor lain. Adakalanya hubungan konektor
dipindahkan ke konektor lainnya. Bacalah baik-baik langkah-langkah percobaan.
Adapun beberapa hal yang perlu diperhatikan saat menggunakan modul
praktikum adalah :
1. Matikan power supply modul praktikum saat memasang atau mencabut chip
AT89C51 ke/dari soketnya.
2. Matikan juga power supply saat memindahkan kabel penghubung dari satu konektor
ke konektor lainnya.
3. Hati-hati jangan sampai terbalik saat memasang chip AT89C51 ke soketnya pada
modul kontroler karena akan menyebabkan kerusakan pada chip. Pin satu terletak di
bawah. Lihat gambar 1.
4. Hati-hatilah saat mencabut dan memasang chip ke soketnya pada sub-modul kontroler
karena dapat menyebabkan pin pada chip bengkok/patah.
II. Penulisan Program dan Compiling.
Program ditulis dengan menggunakan aplikasi yang dimiliki oleh Windows yaitu
Notepad atau Wordpad. Dapat juga digunakan editor teks lainnya seperti editor pascal
dan basic. Namun dalam percobaan-percobaan yang akan dilakukan kita menggunakan
Notepad.
Program yang ditulis harus mengikuti aturan-aturan dan sintaks yang disyaratkan
oleh suatu compiler. Compiler adalah suatu program yang berfungsi merubah bahasa
asembler menjadi bahasa mesin. Proses merubah bahasa asembler menjadi bahasa mesin
disebut sebagai kompilasi. Program Compiler yang digunakan adalah 51XASM.EXE.
Tampilan program 51XASM adalah sebagai berikut :

Gambar 11
Tampilan Compiler 51XASM
Aturan dan Sintaks Penulisan Program.
Untuk membuat sebuah program, anda hanya harus mengikuti dua peraturan:
1. LABEL harus dimulai di column SATU(1)
2. Setiap OPERAND/VARIABLE harus dipisahkan dari operand/variable lainnya dengan
sedikitnya SATU(1) SPACE.

Untuk memberikan COMMENT/KOMENTAR diprogram anda, anda harus


mendahului COMMENT/KOMENTAR anda dengan huruf ;
Contoh:
; contoh program, LABEL LOOP dimulai di column satu(1)
; line ini and line sebelumnya adalah COMMENT
LOOP: MOV A, R0 ; A = R0
MOV A, R1 ; A = R1
dst....

Compiler 51XASM yang digunakan mengenal dua macam tipe operands/variables:


1. Variable/operand tipe ANGKA/DIGIT
Tipe ini bisa dalam bentuk hexadecimal(base 16), decimal(base 10), atau binary (base
2). Compiler 51XASM membedakan dari berbagai macam format untuk tipe
ANGKA/DIGIT berdasarkan huruf terakhir dari operand ini. Contoh:
01010011B - Binary, = 53 Hexadecimal = 83 Decimal
53H - Hexadecimal, = 01010011 Binary = 83 Dec.
83 - Decimal, = 53 Hexadecimal = 01010011 Bin.

Format angka HEXADECIMAL mempunyai komponen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B,


C, D, dan F; kalau angka HEXADECIMAL anda dimulai dengan A, B, C, D, atau F,
tambahkan angka 0 di depan angka anda. Tujuan langkah diatas adalah untuk
membedakan tipe ANGKA/DIGIT dengan tipe lainnya. Contoh:
0AAH - Hexadecimal, = 10101010 Binary = 170 Dec.
0B5AH - Hexadecimal, = 101101011010 Binary = 2906

Untuk menspesifikasi angka hexadecimal, tambahkan huruf H di belakang; untuk


menspesifikasi angka binary, tambahkan huruf B dibelakang angka anda; untuk
menspesifikasi angka decimal tidak diperlukan tambahan apapun(default).

Untuk memspecifikasi angka NEGATIVE tambahkan huruf – didepan angka anda;


contoh:
-55 - Negative 55 Decimal, = C9H = 11001001B
-0AAH - Negative AA Hex, = 56H = 01010110B

Angka NEGATIVE anda akan disimpan dalam bentuk/format yang standard, yaitu
dalam format TWO'S COMPLEMENT. Semua definisi/features 51XASM mengikuti
standard industri; jadi program assembly anda bisa di-assembled oleh CROSS
ASSEMBLER yang lain yang juga industri standard.

2. Variable/operand tipe SYMBOLIC


Dengan adanya tipe ini, desain program assembly akan relatif lebih mudah; huruf
pertama dari variable/operand tipe ini harus dimulai oleh huruf alphabet(a .. z atau A ..
Z). Contoh:
PORT_SATU
STATUS_KONDISI
TRANSMIT_BIT
PORT_DUA
REGISTER_DATA
dll.....
Pemakaian variable/operand tipe diatas itu tergantung dari faktor-faktor lainnya;
Variable tipe diatas bisa dipakai sebagai definisi untuk ADDRESS, definisi untuk
REGISTERS, definisi untuk RAM, definisi untuk PORT, atau definisi untuk BIT
operand; tipe diatas bisa juga dipakai sebagai definisi untuk CONSTANT.
Hal lain yang perlu diperhatikan adalah ada beberapa symbolic operand/variable
yang telah dipakai/ditetapkan sebagai symbolic operand/variable yang standard. Jadi
tidak boleh lagi dipakai oleh anda sewaktu anda mendesain program assembly anda.

Prosedur Compiling.
Program asembler yang ditulis dengan Notepad harus di-save dengan extension
*.H51. Program tidak akan bisa dicompile bila tidak di-save dengan extension H51. Lalu
ikuti prosedur kompilasi sebagai berikut :
1. Aktifkan program 51XASM dengan cara double click.
2. Tulislah nama file yang akan dicompile pada baris terbawah (misalnya coba.h51)
3. Perhatikan pada saat proses kompilasi sedang dilakukan, terbentuk 2 file baru yang
masing-masing berextension *.PRN dan *.HEX. File dengan extension PRN adalah
file report untuk mencari letak kesalahan aturan dan sintaks program. Sedangkan File
dengan extension HEX adalah file yang berisi bahasa mesin dengan standard format
INTEL yang akan kita download ke dalam chip mikrokontroler.
4. Diakhir proses kompilasi, apakah ada pesan error yang terjadi akibat adanya
kesalahan sintaks penulisan program. Jika tidak ada pesan error, langsung menuju
langkah 6.
5. Jika ada pesan error, buka file yang berextension *.PRN (coba.prn). Gunakan
fasilitas find yang terdapat pada menu search program Notepad. Tulis kata kunci “e r
r” untuk mencari dengan cepat di baris mana letak terjadinya kesalahan aturan dan
sintaks penulisan program. Lakukan perbaikan, dan simpan kembali. Lakukan
kembali langkah 1.
6. Program bahasa mesin (coba.hex) siap untuk di-download atau ditulis ke dalam chip
mikrokontroler dengan menggunakan alat yang bernama programmer atau writer.

Prosedur download/writing.
Program yang sudah dicompile dan bersih dari error siap untuk ditulis ke dalam
chip mikrokontroler. Programmer yang digunakan adalah ALL-11 Programmer

--- oOo ---


BAB 4
APLIKASI KEYPAD DAN 7 SEGMEN

Pada sessi memulai program sudah dibahas berbagai teori mengenai Keypad dan
Led 7-segmen. Mulai saatnya kita mencoba membuat suatu program sederhana yang
menggunakan kedua komponen ini.

1. Program Menampilkan Angka ‘9765’ Pada Led 7-Segmen.

1.1. Penjelasan Program.


Program ini bertujuan untuk memahami konsep bagaimana menampilkan suatu
angka pada Led 7-segmen dengan proses scanning. Teori proses scanning pada Led 7-
segmen dapat dilihat pada materi sessi memulai program, pasal Led 7-segmen.
Port yang digunakan untuk menyalurkan pola biner ke modul peraga adalah port
2. Untuk dapat menampilkan angka ‘9765’ pada Led 7-segmen maka pola biner yang
harus dikirimkan oleh mikrokontroler melalui port 2 adalah sebagai berikut (lihat tabel 2
sessi memulai program) :

Angka P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0


9 = 0 1 1 1 1 0 0 1
7 = 1 0 1 1 0 1 1 1
6 = 1 1 0 1 0 1 1 0
5 = 1 1 1 0 0 1 0 1

Berhubung ada 4 digit angka yang akan diperagakan, maka kita perlu membuat
suatu tempat penampungan data (buffer) di dalam RAM dengan menggunakan instruksi
assembler direktif EQU. Ada 4 buffer yang kita deklarasikan yaitu BUFF_1, BUFF_2,
BUFF_3, BUFF_4.

BUFF_1 EQU 20H


BUFF_2 EQU 21H
BUFF_3 EQU 22H
BUFF_4 EQU 23H

Selanjutnya adalah mengisi keempat buffer diatas dengan angka yang akan
ditampilkan. MSB (Most Significant Bit) berada pada buffer BUFF_4 dan LSB (Least
Significant Bit) pada bufffer BUFF_1. Lihat program Utama dibawah ini.

MAIN MOV BUFF_1,#05H


MOV BUFF_2,#06H
MOV BUFF_3,#07H
MOV BUFF_4,#09H
CALL DISP
JMP MAIN
Terlihat pada baris kelima cuplikan program diatas adanya instruksi untuk
memanggil suatu subrutin yang bernama DISP. Lalu pada baris keenam, alur program
kembali mengeksekusi baris pertama.
Langkah berikut adalah membuat subrutin yang bernama DISP yang berisi proses
manipulasi bit agar sesuai dengan tabel 2 sessi memulai program.

DISP MOV A,BUFF_1


ANL A,#0FH
ORL A,#0E0H
MOV P2,A
CALL DELAY100MILS
;-----------------
MOV A,BUFF_2
ANL A,#0FH
ORL A,#0D0H
MOV P2,A
CALL DELAY100MILS
;-----------------
MOV A,BUFF_3
ANL A,#0FH
ORL A,#0B0H
MOV P2,A
CALL DELAY100MILS
;-----------------
MOV A,BUFF_4
ANL A,#0FH
ORL A,#70H
MOV P2,A
CALL DELAY100MILS
;-----------------
RET

Dari cuplikan subrutin diatas terlihat adanya 4 kelompok manipulasi data.


Masing-masing kelompok memanipulasi data biner yang akan ditampilkan agar sesuai
dengan tabel 2 sessi memulai program. Instruksi (ANL A,#0FH) berfungsi untuk
menghalangi (mask) 4 bit tertinggi. Dan instruksi berikutnya (ORL A,#0E0H)berfungsi
untuk menyisipkan 4 bit tertinggi dengan bit ‘1110’ yaitu suatu bit scanning untuk
menyalakan peraga 7-segmen pada posisi LSB.

1.2. Prosedur Percobaan.


a. Buka program 9765.h51 anda dg menggunakan program Notepad.
b. Compile dan download program ke dalam chip AT89C51
c. Tancapkan chip pada kit praktikum saudara.
d. Hubungkan konektor PORT2 pada modul kontroler ke konektor 7-SEGMEN
pada modul modul peraga.
e. Nyalakan power supply, dan amati hasil peragaan pada led 7-segmen.
f. Mengapa masih terlihat proses scanning ?
g. Lakukan modifikasi program yaitu pada setiap baris instruksi CALL
DELAY100MILS. Ubahlah menjadi CALL DELAY2MILS. Save dengan nama
modif.h51.
h. Lakukan kembali prosedur b hingga prosedur e.
i. Terlihat bahwa kini proses scanning sudah tidak terlihat lagi oleh mata.
j. Lakukan kembali modifikasi yaitu di bagian program utama (MAIN). Rubahlah
data angka yang akan diperagakan ke 7-segmen. Dan lakukan juga kembali
prosedur b hingga e. Amati, apa yang terlihat di led 7-segmen.

2. Program memasukkan data melalui keypad dan memperagakannya ke 7-


segmen.

2.1. Penjelasan Program.


Program ini bertujuan untuk memahami konsep sederhana bagaimana mendeteksi
penekanan tombol pada keypad dan menampilkannya pada peraga 7-segmen. Teori
mengenai keypad telah dibahas pada materi sessi memulai program, pasal tentang
keypad.
Port yang digunakan untuk membaca pola biner dari keypad adalah port 1. Seperti
yang terlihat pada tabel 1 sessi 5 bahwa dengan menekan angka ‘1’ pada keypad akan
memberikan konfigurasi bit 11110110B (0F6H), angka ‘2’ menghasilkan 11110101B
(0F5H), dst. Oleh karena itu, diperlukan suatu subrutin untuk melakukan pengujian data
yang dibaca oleh port 1 setiap kali tombol keypad ditekan. Bila data yang dibaca sesuai
dengan yang diinginkan maka buffer BUFF_1 diisi data sesuai dengan angka yang akan
diperagakan.
Adapun subrutin pembacaan keypad adalah sebagai berikut :

CHECK_KEY: MOV A,P1 ;Baca data dari port 1


CJNE A,#0F6H,NXT_2 ;Cek tombol ‘1’ ditekan
MOV BUFF_1,#0E1H ; BUFF_1 = 0E1H
NXT_2 CJNE A,#0F5H,NXT_3 ;Cek tombol ‘2’ ditekan
MOV BUFF_1,#0E2H ; BUFF_1 = 0E2H
NXT_3 CJNE A,#0F3H,NXT_4 ;Cek tombol ‘3’ ditekan
MOV BUFF_1,#0E3H ; BUFF_1 = 0E3H
NXT_4 CJNE A,#0EEH,NXT_5 ;Cek tombol ‘4’ ditekan
MOV BUFF_1,#0E4H ; BUFF_1 = 0E4H
NXT_5 CJNE A,#0EDH,NXT_6 ;Cek tombol ‘5’ ditekan
MOV BUFF_1,#0E5H ; BUFF_1 = 0E5H
NXT_6 CJNE A,#0EBH,NXT_7 ;Cek tombol ‘6’ ditekan
MOV BUFF_1,#0E6H ; BUFF_1 = 0E6H
NXT_7 CJNE A,#0DEH,NXT_8 ;Cek tombol ‘7’ ditekan
MOV BUFF_1,#0E7H ; BUFF_1 = 0E7H
NXT_8 CJNE A,#0DDH,NXT_9 ;Cek tombol ‘8’ ditekan
MOV BUFF_1,#0E8H ; BUFF_1 = 0E8H
NXT_9 CJNE A,#0DBH,NXT_10 ;Cek tombol ‘9’ ditekan
MOV BUFF_1,#0E9H ; BUFF_1 = 0E9H
NXT_10 CJNE A,#0BEH,NXT_11 ;Cek tombol ‘0’ ditekan
MOV BUFF_1,#0EAH ; BUFF_1 = 0EAH
NXT_11 CJNE A,#0BDH,NXT_12 ;Cek tombol ‘*’ ditekan
MOV BUFF_1,#0E0H ; BUFF_1 = 0E0H
NXT_12 CJNE A,#0BBH,LAST ;Cek tombol ‘#’ ditekan
MOV BUFF_1,#0EBH ; BUFF_1 = 0EBH
LAST RET

Langkah berikutnya adalah membuat program utama yang akan memanggil


subrutin CHECK_KEY dan mentransfer isi BUFF_1 ke port 2 (port yang terhubung
dengan peraga 7-segmen). Adapun program utama tersebut adalah sebagai berikut :

MAIN MOV P0,#00H ;Mematikan 8 buah LED


MOV BUFF_1,#0EFH ;Mematikan 7-segmen
MOV P2, BUFF_1 ;Peragakan ke P2

ULANG CALL CHECK_KEY ;Membaca keypad


MOV P2, BUFF_1 ;Peragakan ke P2
JMP ULANG ;

2.2. Prosedur Percobaan.


a. Buka program anda yang bernama Key7seg.h51 dg menggunakan program
Notepad.
b. Compile dan download program ke dalam chip AT89C51
c. Tancapkan chip pada kit praktikum saudara.
d. Hubungkan konektor PORT2 pada modul kontroler ke konektor 7-SEGMEN
pada modul modul peraga. Tancapkan pula kabel yang menghubungkan
KEYPAD dengan PORT1.
e. Nyalakan power supply, tekan keypad dan amati hasil peragaan pada led 7-
segmen.

3. Program memasukkan data melalui keypad dan menggeser data pada peraga
7-segmen.

3.1. Penjelasan Program.


Program ini bertujuan untuk mencoba membuat program sederhana yang
memasukkan data secara berurutan melalui keypad dan menggeser data yang terperaga
pada peraga 7-segmen ke kiri. Program ini bermanfaat untuk aplikasi yang membutuhkan
entry data secara berurutan melalui keypad dan memperagakannya ke peraga.
Program yang akan dibuat ini merupakan modifikasi program kedua
(Key7Seg.h51). Inti program ini terletak pada program utama dengan adanya suatu
instruksi untuk memindahkan data dari suatu buffer ke buffer lainnya, dan
memperagakannya ke peraga 7-segmen. Lihat cuplikan program utama dibawah ini :

BUFF_1 EQU 20H


BUFF_2 EQU 21H
BUFF_3 EQU 22H
BUFF_4 EQU 23H
FLAG EQU 24H
NO_CHANGE BIT FLAG.0

MAIN MOV P0,#00H ;Mematikan 8 buah LED


MOV P2,#0EFH ;Mematikan 7-segmen

ULANG CALL DISP


CALL CHECK_KEY ;Membaca keypad
JNB NO_CHANGE,ULANG
MOV BUFF_4, BUFF_3 ;Pindahkan Buf 4 <- 3
MOV BUFF_3, BUFF_2 ;Pindahkan Buf 3 <- 2
MOV BUFF_2, BUFF_1 ;Pindahkan Buf 2 <- 1
MOV BUFF_1, A ;Pindahkan Buf 1 <- A
WAIT CALL DISP
MOV A,P1 ;Baca kembali keypad
CJNE A,#0FFH,WAIT ;Apakah sudah dilepas ?
CLR NO_CHANGE ;
JMP ULANG ;

Dari cuplikan program utama diatas terlihat ada 4 baris instruksi untuk menggeser
data yang penekanan tombol keypad yang tersimpan di suatu buffer ke buffer lainnya.
Terlihat bahwa data yang digeser pertama kali dimulai dari buffer MSB (BUFF_4 
BUFF_3). Lalu setelah proses penggeseran selesai, dilakukan proses menampilkan data
ke peraga 7-segmen.
Selain itu terdapat pula flag penanda untuk menandakan ada-tidak-nya tombol
keypad yang ditekan. Flag penanda itu dideklarasikan dengan 2 baris instruksi :
FLAG EQU 24H
NO_CHANGE BIT FLAG.0
Lalu pada program utama dan subrutin CHECK_CEK disisipkan instruksi untuk men-set
dan meng-clear flag untuk memberi tanda bahwa ada/tidak tombol keypad yang ditekan.
Bila ada tombol yang ditekan maka diprogram utama dilakukan proses penggeseran data
di dalam buffer. Namun bila tidak ada tombol yang ditekan maka proses yang dilakukan
hanyalah proses memperagakan data (CALL DISP) dan pembacaan keypad (CALL
CHECK_CEK).
Hal lain yang perlu diperhatikan adalah perlunya memodifikasi program utama
untuk menyisipkan instruksi sebelum instruksi JMP, yang berfungsi untuk mendeteksi
lepasnya penekanan tombol pada keypad. Hal ini diperlukan agar program tidak ‘liar’
yang dengan cepat mengeksekusi baris demi baris seluruh program.
Adapun subrutin CHECK_KEY dapat dilihat dibawah ini. Sedangkan untuk
subrutin DISP tidak ada yang perlu dimodifikasi.
CHECK_KEY: MOV A,P1 ;Baca data dari port 1
CJNE A,#0F6H,NXT_2 ;Cek tombol ‘1’ ditekan
MOV A,#0E1H ; BUFF_1 = 0E1H
SETB NO_CHANGE
NXT_2 CJNE A,#0F5H,NXT_3 ;Cek tombol ‘2’ ditekan
MOV A,#0E2H ; BUFF_1 = 0E2H
SETB NO_CHANGE

NXT_3 CJNE A,#0F3H,NXT_4 ;Cek tombol ‘3’ ditekan


MOV A,#0E3H ; BUFF_1 = 0E3H
SETB NO_CHANGE
NXT_4 CJNE A,#0EEH,NXT_5 ;Cek tombol ‘4’ ditekan
MOV A,#0E4H ; BUFF_1 = 0E4H
SETB NO_CHANGE

NXT_5 CJNE A,#0EDH,NXT_6 ;Cek tombol ‘5’ ditekan


MOV A,#0E5H ; BUFF_1 = 0E5H
SETB NO_CHANGE

NXT_6 CJNE A,#0EBH,NXT_7 ;Cek tombol ‘6’ ditekan


MOV A,#0E6H ; BUFF_1 = 0E6H
SETB NO_CHANGE

NXT_7 CJNE A,#0DEH,NXT_8 ;Cek tombol ‘7’ ditekan


MOV A,#0E7H ; BUFF_1 = 0E7H
SETB NO_CHANGE

NXT_8 CJNE A,#0DDH,NXT_9 ;Cek tombol ‘8’ ditekan


MOV A,#0E8H ; BUFF_1 = 0E8H
SETB NO_CHANGE

NXT_9 CJNE A,#0DBH,NXT_10 ;Cek tombol ‘9’ ditekan


MOV A,#0E9H ; BUFF_1 = 0E9H
SETB NO_CHANGE

NXT_10 CJNE A,#0BEH,NXT_11 ;Cek tombol ‘0’ ditekan


MOV A,#0EAH ; BUFF_1 = 0EAH
SETB NO_CHANGE

NXT_11 CJNE A,#0BDH,NXT_12 ;Cek tombol ‘*’ ditekan


MOV A,#0E0H ; BUFF_1 = 0E0H
SETB NO_CHANGE

NXT_12 CJNE A,#0BBH,LAST ;Cek tombol ‘#’ ditekan


MOV A,#0EBH ; BUFF_1 = 0EBH
SETB NO_CHANGE

LAST RET

3.2. Prosedur Percobaan.


a. Buka program entry.h51 dg menggunakan program Notepad.
b. Compile dan download program ke dalam chip AT89C51
c. Tancapkan chip pada kit praktikum saudara.
d. Hubungkan konektor PORT2 pada modul kontroler ke konektor 7-SEGMEN
pada modul modul peraga. Tancapkan pula kabel yang menghubungkan
KEYPAD dengan PORT1.
e. Nyalakan power supply, tekan keypad dan amati hasil peragaan pada led 7-
segmen.

--- oOo ---

You might also like