Anda di halaman 1dari 15

BAGIAN III

PORT PARALEL MIKROKONTROLER ATMEL


KELUARGA 51
III.1. PENDAHULUAN
Mikrokontroler AT89C51/52/55 (keluarga 51) mempunyai 40 kaki, 32 kaki di antaranya
digunakan sebagai Port paralel. Satu Port paralel terdiri dari 8 kaki, dengan demikian 32 kaki tersebut
membentuk 4 buah Port paralel, yang masing-masing dikenal sebagai Port 0, Port 1, Port 2 dan Port 3.
Nomor dari masing-masing jalur (kaki) dari Port paralel mulai dari 0 sampai 7, jalur (kaki) pertama
Port 0 disebut sebagai P0.0 dan jalur terakhir untuk Port 3 adalah P3.7. Perhatikan gambar III.1.A
dan III.1.B untuk diagram pin AT89C51/52, perhatikan perbedaannya.

(A) Diagram Pin AT89C51 (B)Diagram Pin AT89C52


Gambar III.1. Diagram Pin Mikrokontroler Atmel Keluarga 51
III.2. FUNGSI-FUNGSI KAKI (PIN)
Vcc
Suplai tegangan.
GND
Ground atau pentanahan.
RST
Masukan reset. Kondisi logika ’1’ selama 2 siklus mesin saat osilator bekerja akan mereset
mikrokontroler yang bersangkutan.
ALE/ PROG
Keluaran ALE atau Adreess Latch Enable menghasilkan pulsa-pulsa untuk mengancing byte rendah
(low byte) alamat selama pengaksesan memori eksternal. Kaki ini juga berfungsi sebagai masukan
pulsa program (the program pulse input) atau PROG selama pengisian flash PEROM. Pada operasi
normal, ALE akan berpulsa dengan laju 1/6 dari frekuensi kristal dan dapat digunakan sebagai
pewaktuan (timing) atau pendetakan (clocking) rangkaian eksternal. Catatan, ada satu pulsa yang
dilompati selama pengaksesan memori data eksternal.
Jika dikehendaki, operasi ALE bisa dimatikan dengan cara mengatur bit 0 dari SFR lokasi 8Eh. Jika
isinya ’1’, ALE hanya akan aktif selama dijumpai instruksi MOVX atau MOVC. Selain itu, kaki ini akan

55
secara lemah di-pulled high. Mematikan bit ALE tidak akan ada efeknya jika mikrokontroler
mengeksekusi program secara eksternal.
PSEN
Program Store Enable merupakan sinyal baca untuk memori program eksternal. Saat mikrokontroler
keluarga 51 menjalankan program dari memori eksternal, PSEN akan diaktifkan dua kali per siklus
mesin, kecuali dua aktivasi PSEN dilompati (diabaikan) saat mengakses memori data eksternal.
EA /Vpp
EA atau External Access Enable harus selalu dihubungkan ke ground, jika mikrokontroler akan
mengeksekusi program dari memori eksternal lokasi 0000h hingga FFFFh. Selain dari itu, EA harus
dihubungkan ke Vcc agar mikrokontroler mengakses program secara internal.
Kaki ini juga berfungsi menerima tegangan 12 volt (Vpp) selama pengisian flash, khususnya untuk
tipe mikrokontroler 12 volt Vpp (yaitu dengan kode IC AT89C51/52 xxxx, sedangkan yang berkode
AT89C51/52 xxxx-5, menggunakan tegangan 5 volt Vpp).
III.3. STRUKTUR PORT DAN CARA-KERJA
Pada dasarnya Mikrokontroler Atmel keluarga 51 mempunyai dua kelompok instruksi untuk
mengeluarkan data ke Port paralel (tanda ’x’ artinya sama seperti kondisi sebelumnya):
• elompok instruksi pertama bekerja pada Port seutuhnya, artinya 8 jalur dari Port
bersangkutan, misalnya MOV P3,#FFh membuat ke-delapan jalur Port 0 semuanya
dalam kondisi logika ‘1’ (atau isinya 1111 1111 dalam biner);
• elompok instruksi kedua hanya berpengaruh pada salah satu jalur atau bit dari Port,
misalnya instruksi SETB P3.4 artinya men-set bit-4 dari Port 3 (bit-4 dari Port 3 = 1
xxx1 xxxx) atau instruksi CLR P3.3 digunakan untuk me-nolkan bit-3 dari Port 3
(bit-3 dari Port 3 = 0 xxxx 0xxx).
Selain itu Port paralel bisa pula dipakai untuk menerima masukan sinyal digital dari luar
mikrokontroler:
• nstruksi MOV A,P3 digunakan untuk membaca data (digital) pada seluruh bit (bit 0
hingga 7 = 8-bit) Port 1 kemudian menyimpannya dalam akumulator;
• Pembacaan data bisa juga dilakukan hanya pada satu bit Port saja, misalnya instruksi JNB
P3.7,$ digunakan untuk memantau bit P3.7, jika P3.7=0, mikrokontroler akan
kembali melaksanakan instruksi tersebut (lompat ke label ‘$’ artinya ke lokasi tersebut
lagi), mikrokontroler akan meneruskan kembali instruksi berikutnya jika P3.7=1
(Catatan: Instruksi yang berlawanan dengan JNB adalah JB).
Satu hal yang perlu diperhatikan, agar data dari luar bisa dibaca dengan benar, sebelumnya,
jalur Port yang bersangkutan harus diinisialisasi terlebih dulu dengan cara mengisi dengan logika ‘1’
terutama jika suatu port berfungsi ganda, sebagai masukan dan keluaran sekaligus, kecuali jika sejak
awal dan seterusnya Port yang bersangkutan hanya digunakan sebagai masukan saja. Hal ini akan
dijelaskan lebih lanjut pada pasal yang membahas tentang konstruksi internal port-port pada
Mikrokontroler Atmel keluarga 51.
Keempat Port pada keluarga 51 tersebut bersifat dwi-arah dan masing-masing memiliki
sebuah pengancing (latch), perhatikan gambar III.2 (A s/d D), yang diacu dalam program sebagai
Register Fungsi Khusus (RFK atau SFR) sebagai P0, P1, P2 dan P3. Selain itu juga memiliki sebuah
penggerak keluaran (output driver) dan sebuah penyangga masukan (input buffer) pada masing-
masing kaki-kaki Port.
Penggerak-penggerak keluaran Port 0 dan 2 serta penyangga masukan dari Port 0 digunakan
dalam pengaksesan memori eksternal. Pada aplikasi semacam ini, Port 0 mengeluarkan byte rendah
alamat memori eksternal, dimultipleks secara waktu dengan byte yang akan dituliskan atau dibaca

56
(ke/dari memori eksternal). Port 2 mengeluarkan byte tinggi dari alamat memori eksternal jika lebar
alamatnya 16-bit, selain itu, kaki-kaki Port 2 tetap meneruskan menghasilkan isi SFR dari P2.
Semua kaki-kaki Port 3 dan dua kaki Port 1 (pada seri keluarga 51 yang tipe 52 memiliki 3
pewaktu) memiliki ragam-fungsi. Kaki-kaki port-port tersebut tidak hanya sekedar kaki-kaki Port
paralel, namun juga menyediakan beberapa fungsi khusus sebagaimana ditunjukkan pada Tabel III.1.
Tabel III.1. Fungsi-Fungsi Khusus Kaki-Kaki Port 3 Dan 1
Kaki Port Fungsi Keterangan
alternatif
P3.0(1) T2 masukan eksternal pewaktu/pencacah 2
P3.1(1) T2EX pemicu Capture/Reload pewaktu/pencacah 2
P3.0 RXD saluran masukan serial
P3.1 TXD saluran keluaran serial
P3.2 INT0 interupsi eksternal 0
P3.3 INT1 interupsi eksternal 1
P3.4 T0 masukan eksternal pewaktu/pencacah 0
P3.5 T1 masukan eksternal pewaktu/pencacah 1
P3.6 WR sinyal tanda baca memori data eksternal
P3.7 RD sinyal tanda tulis memori data eksternal
Catatan (1): P3.0 dan P3.1 memiliki fungsi ini hanya untuk seri 52
yang memiliki 3 pewaktu
Fungsi-fungsi alternatif tersebut, sebagaimana ditunjukkan pada tabel III.1, hanya dapat
diaktifkan jika bit-bit pengancing (latch) Port yang bersangkutan berisi ‘1’, selain itu kaki-kaki port
akan tetap terkirim ‘0’. Mengapa? Perhatikan gambar III.2.D (untuk Port 3); jika flip-flop pengancing
mendapatkan data ‘1’, maka gerbang NAND selalu meng-inversi data dari fungsi keluaran alternatif,
jika datanya ‘1’, maka keluaran NAND adalah ‘0’, sehingga mematikan transistor FET, dengan
demikian keluaran kaki port langsung tersambung ke Vcc alias terkirim ‘1’ (sesuai data yang
dituliskan ke port).

Gambar III.2. Konstruksi internal Port-port Mikrokontroler Atmel keluarga 51


Jika sekarang isi dari pengancing adalah ‘0’, maka keluaran dari gerbang NAND akan selalu
‘1’, sehingga selalu menghidupkan transistor FET, akibatnya keluaran dari kaki-kaki port akan selalu

57
terkirim ‘0’ (tidak peduli data yang dituliskan ke port). Untuk pembacaan port sebagai fungsi alternatif
tidak ada masalah, data masukan melalui kaki-kaki port kemudian masuk melalui penyangga pertama
dan diteruskan sebagai fungsi keluaran alternatif.
III.3.1. KONFIGURASI-KONFIGURASI PORT I/O
Pada gambar III.2.A sampai dengan III.2.D ditunjukkan diagram fungsional dari masing-
masing port yang masing-masing mengandung sebuah pengancing (latch) bit dan penyangga (buffer)
I/O. Penyangga bit (sama dengan satu bit register Pi) merupakan jenis D-flip-flop, yang akan
memasukkan (dengan sinyal clock) nilai atau data dari bus internal sebagai tanggapan sinyal ”tulis ke
pengancing” dari CPU. Data yang terbaca dari port itu sendiri ditempatkan dalam bus internal sebagai
tanggapan atas sinyal ”baca kaki/pin” dari CPU. Beberapa instruksi yang digunakan untuk membaca
port akan mengaktifkan sinyal ”baca pengancing” (read latch) dan lainnya mengaktifkan sinyal ”baca
kaki/pin” (read pin).
Sebagaimana ditunjukkan pada gambar III.2.A dan III.2.C, penggerak keluaran dari Port 0 dan
2 dapat diubah dari keluaran pengancing (latch) ke arah bus ALAMAT (untuk P2) dan ALAMAT/DATA
(untuk P0) internal melalui sinyal KONTROL internal yang diisi ’1’ (secara internal pula) yang
kemudian bisa digunakan dalam pengaksesan memori eksternal. Selama pengaksesan memori
eksternal tersebut, isi pengancing P2 tetap tidak berubah, tetapi ’1’ harus dituliskan ke pengancing P0,
dengan demikian P0 tidak dapat digunakan sebagai port serbaguna selama pengaksesan memori
eksternal tersebut, hal ini akan dijelaskan lebih lanjut pada alinea-alinea berikut.
Jika bit pengancing P3 berisi ’1’, maka aras keluaran dikontrol oleh sinyal fungsi alternatif
keluaran, sebagaimana ditunjukkan pada gambar III.2.D. Aras kaki P3.i yang sesungguhnya selalu
tersedia bagi kaki-kaki fungsi alternatif masukan.
Port 1, 2 dan 3 memiliki pullup internal. Port 0 memiliki keluaran saluran terbuka atau open
drain. Masing-masing jalur I/O dapat digunakan secara independen sebagai masukan atau keluaran,
hanya saja, sesuai penjelasan sebelumnya, Port 0 tidak dapat digunakan sebagai jalur I/O serbaguna
selama pengaksesan memori eksternal atau dijadikan sebagai jalur ALAMAT/DATA. Agar dapat
digunakan sebagai masukan, bit pengancing port yang bersangkutan harus diisi ’1’, yang akan
mematikan transistor FET penggerak keluaran. Sehingga, untuk Port 1, 2 dan 3, kaki-kakinya ditarik
tinggi (pulled high) oleh pullup internal, tetapi bisa juga ditarik rendah (pulled low) dengan suatu
sumber eksternal.
Port 0 tidak memiliki pullup internal. Pullup FET (FET bagian atas) di dalam penggerak
keluaran P0 digunakan hanya pada saat port mengirimkan ’1’ selama pengaksesan memori eksternal.
Selain dari itu, pullup FET akan selalu mati. Konsekuensinya, jalur-jalur P0 yang digunakan sebagai
jalur keluaran merupakan saluran terbuka (open drain). Penulisan ’1’ ke bit pengancing membuat
kedua FET keluaran menjadi mati, dengan demikian kondisi kaki-kakinya menjadi mengambang
(float). Dalam kondisi seperti ini, dapat digunakan sebagai masukan berimpedansi tinggi.
Karena Port 1, 2 dan 3 telah memiliki pullup internal yang pasti, mereka kadang dinamakan
sebagai port-port kuasi-dwi-arah (quasi-bidirectional). Saat dikonfigurasi sebagai masukan, maka
ditarik tinggi dan memberikan arus (source current – Iil) saat ditarik rendah secara eksternal. Port 0, di
sisi lain, merupakan Port 0 dwi-arah yang sebenarnya, karena akan mengambang jika dikonfigurasi
sebagi masukan.
Fungsi reset akan menuliskan ’1’ ke seluruh bit-bit pengancing port pada keluarga 51. Jika
kemudian ’0’ dituliskan ke pengancing, pengancing dapat dikonfigurasi sebagai masukan jika ’1’
dituliskan padanya.
III.3.2. RINGKASAN SPESIFIKASI MASING-MASING PORT
Berikut ini disajikan ringkasan spesifikasi dari masing-masing Port (Port 0, 1, 2 dan 3) yang
secara umum telah dibahas pada pasal-pasal sebelumnya.
III.3.2.1. Port 0
Port 0 merupakan port keluaran/masukan (I/O) bertipe open drain bidirectional (perhatikan
gambar III.2.A dan penjelasan sebelumnya). Sebagai port keluaran, masing-masing kaki dapat

58
menyerap arus (sink) delapan masukan TTL (sekitar 3,8 mA). Pada saat ’1’ dituliskan ke kaki-kaki
Port 0 ini, maka kaki-kaki Port 0 dapat digunakan sebagai masukan-masukan berimpedansi tinggi.
Port 0 juga dapat dikonfigurasikan sebagai bus alamat/data bagian rendah (low byte) selama
proses pengaksesan memori data dan program eksternal. Jika digunakan dalam mode ini Port 0
memiliki pullup internal (tapi lemah).
Port 0 juga menerima kode-kode yang dikirimkan kepadanya selama proses pengisian
program dan mengeluarkan kode-kode selama proses verifikasi program yang telah tersimpan dalam
flash. Dalam hal ini dibutuhkan pullup eksternal selama proses verifikasi program.
III.3.2.2. Port 1
Port 1 merupakan Port I/O dwi-arah yang dilengkapi dengan pullup internal (perhatikan
gambar III.2.B). Penyangga keluaran Port 1 mampu memberikan/menyerap arus empat masukan TTL
(sekitar 1,6 mA).
Jika ’1’ dituliskan ke kaki-kaki Port 1, maka masing-masing kaki akan di-pulled high dengan
pullup internal sehingga dapat digunakan sebagai masukan. Sebagai masukan, jika kaki-kaki Port 1
dihubungkan ke ground (di-pulled low), maka masing-masing kaki akan memberikan arus (source)
karena di-pulled high secara internal. Port 1 juga menerima alamat bagian rendah (low byte) selama
pengisian program dan verifikasi flash.
III.3.2.3. Port 2
Port 2 merupakan Port I/O dwi-arah dengan dilengkapi pullup internal (perhatikan gambar
III.2.C). Penyangga keluaran Port 2 mampu memberikan/menyerap arus empat masukan TTL (sekitar
1,6 mA).
Jika ’1’ dituliskan ke kaki-kaki Port 2, maka masing-masing kaki akan di-pulled high dengan
pullup internal sehingga dapat digunakan sebagai masukan. Sebagai masukan, jika kaki-kaki Port 2
dihubungkan ke ground (di-pulled low), maka masing-masing kaki akan memberikan arus (source)
karena di-pulled high secara internal.
Port 2 akan memberikan byte alamat bagian tinggi (high byte) selama pengambilan instruksi
dari memori program eksternal dan selama pengaksesan memori data eksternal yang menggunakan
perintah dengan alamat 16-bit (misalnya: MOVX @DPTR). Dalam aplikasi ini, jika ingin mengirimkan
’1’, maka digunakan pullup internal yang sudah disediakan. Selama pengaksesan memori data
eksternal yang menggunakan perintah dengan alamat 8-bit (misalnya: MOVX @Ri), Port 2 akan
mengirimkan isi dari SFR P2. Port 2 juga menerima alamat bagian tinggi selama pemrograman dan
verifikasi flash.
III.3.2.4. Port 3
Port 3 merupakan Port I/O dwi-arah dengan dilengkapi pullup internal (perhatikan gambar
III.2.D). Penyangga keluaran Port 3 mampu memberikan/menyerap arus empat masukan TTL (sekitar
1,6 mA).
Jika ’1’ dituliskan ke kaki-kaki Port 3, maka masing-masing kaki akan di-pulled high dengan
pullup internal sehingga dapat digunakan sebagai masukan. Sebagai masukan, jika kaki-kaki Port 3
dihubungkan ke ground (di-pulled low), maka masing-masing kaki akan memberikan arus (source)
karena di-pulled high secara internal.
Port 3, sebagaimana Port 1, memiliki fungsi-fungsi alternatif sebagaimana telah ditunjukkan
pada Tabel III.1, antara lain menerima sinyal-sinyal kontrol (P3.6 dan P3.7), bersama-sama dengan
Port 2 (P2.6 dan P2.7) selama pengisian program dan verifikasi flash.

59
III.4. CONTOH-CONTOH APLIKASI PENGGUNAAN PORT
III.4.1. MENGHIDUPKAN LED MELALUI KANAL PARALEL
III.4.1.1. Tujuan
Dalam pasal ini akan dijelaskan bagaimana menghidupkan (sekaligus mengendalikan)
beberapa LED melalui port paralel AT89C51 dengan berbagai macam kombinasi.
III.4.1.2. Rangkaian Aplikasi
Rangkain minimum untuk menghidupkan 8 LED melalui Port 1 ditunjukkan pada gambar
III.3. Yang perlu diperhatikan adalah konfigurasi rangkaian LED itu sendiri, yaitu Common Anode
(CA), artinya untuk menghidupkan LED pada Port 1 yang bersangkutan harus dikirim atau dituliskan
logika ‘0’. Hal ini berkaitan dengan penjelasan sebelumnya (perhatikan juga gambar III.1.B), Jika ’0’
kita tulis ke Port 0 maka keluaran dari lacth (yang Q ) akan menghidupkan FET sehingga baik kaki
Port 0 maupun resistor pullup internal akan di pulled-low (secara internal juga), sehingga LED yang
terhubungkan secara Common Anode bisa menyala. Sedangkan jika menggunakan rangkaian Common
Khatode (CK), maka untuk menyalakan LED butuh penulisan ’1’, namun penulisan ’1’ ini
menyebabkan Port 0 menjadi masukan berimpedansi (karena adanya resistor pullup internal) dan
hanya cocok untuk masukan bukan keluaran (arus dari pullup internal tidak kuat untuk menyalakan
LED karena ordenya µA, sedangkan keluarannya bisa mencapai sekitar 3,8 mA). Hal ini berlaku juga
untuk Port 2 dan Port 3. Penggunaan resistor 330 ohm sebagai pembatas arus, dengan tegangan Vcc 5
volt maka arusnya sekitar 15 mA dan ini cukup untuk menghidupkan LED (biasanya sekitar 10 mA).
39 21
38 P0.0/AD0 P2.0/A8 22
37 P0.1/AD1 P2.1/A9 23
36 P0.2/AD2 P2.2/A10 24
35 P0.3/AD3 P2.3/A11 25
34 P0.4/AD4 P2.4/A12 26
Vcc 33 P0.5/AD5 P2.5/A13 27
LED Merah Resistor 32 P0.6/AD6 P2.6/A14 28
330 ohm P0.7/AD7 P2.7/A15
1 10
2 P1.0 P3.0/RXD 11
3 P1.1 P3.1/TXD 12
4 P1.2 P3.2/INTO 13
5 P1.3 P3.3/INT1 14
6 P1.4 P3.4/TO 15
7 P1.5 P3.5/T1 16
8 P1.6 P3.6/WR 17
P1.7 P3.7/RD
19 29
18 XTAL1 PSEN
30 Pf 12 MHz 9 XTAL2 30
CRYSTAL RST ALE/PROG
Vcc 31
EA/VPP
30 Pf AT89C51

Vcc
Resistor

10 K 10 Uf

Gambar III.3 Rangkaian Aplikasi Menghidupkan LED Melalui Kanal Paralel


III.4.1.3. Program Pertama
Program bab3_01.asm merupakan aplikasi untuk membuat kelompok 4 (empat) LED mati-hidup
secara bergantian (flip-flop):

1: ;-- BAB3_01.ASM -----------------------------------------------------------


2: ;
3: ; LAMPU FLIP-FLOP PADA PORT 1
4: ;
5: ;--------------------------------------------------------------------------
6: ORG 0H ; PROGRAM DITEMPATKAN PADA LOKASI 0000H
7: ;
8: MULAI: MOV P1,#00001111B ; LED P1.4 S/D P1.7 NYALA (HEKSA= #0FH)

60
9: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT (SUB. DELAY)
10: MOV P1,#11110000B ; LED P1.0 S/D P1.3 NYALA (HEKSA= #0F0H)
11: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT (SUB. DELAY)
12: SJMP MULAI ; ULANGI LAGI DARI AWAL
13: ;
14: ;-SUBRUTIN DELAY-----------------------------------------------------------
15: ;
16: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
17: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
18: ; KONDISI TERTENTU
19: ;
20: ;--------------------------------------------------------------------------
21: DELAY: MOV R0,#5H ; ISI REGISTER R0 DENGAN 5 (5X ULANG)
22: DELAY1: MOV R1,#0FFH ; ISI REGISTER R1 DENGAN 255 (255X ULANG
23: DELAY2: MOV R2,#0 ; ISI REGISTER R2 DENGAN 0 (256X ULANG)
24: DJNZ R2,$ ; R2=R2-1, JIKA R2 BELUM 0 ULANGI LAGI
25: DJNZ R1,DELAY2 ; R1=R1-1, JIKA R1 BELUM 0 ULANGI DELAY2

26: DJNZ R0,DELAY1 ; R0=R0-1, JIKA R0 BELUM 0 ULANGI DELAY1


27: RET ; KEMBALI KE PEMANGGIL SUBRUTIN DELAY
28: END

Baris 8-12 merupakan program utama, sedangkan baris 1-5 dan 14-20 merupakan komentar sekaligus
berisi keterangan program, baris 6 digunakan agar instruksi dituliskan mulai alamat 0h. Baris 8
digunakan untuk mengirimkan data 00001111B (biner) ke Port 1 agar lampu LED4 - LED7
(berkaitan dengan P1.4-P1.7) menyala, kemudian diikuti dengan mengerjakan tundaan (baris-9)
yaitu mengerjakan sub-rutin Delay, kemudian bergantian LED0-LED3 (berkaitan dengan P1.0-
P1.3) dinyalakan (baris-10), kemudian (baris-11) tundaan lagi. Proses ini diulang dari awal dengan
instruksi SJMP MULAI pada baris 12. Baris 21-27 merupakan program sub-rutin DELAY yang
prosesnya bisa digambarkan melalui diagram yang ditunjukkan pada gambar III.4.
Perhatikan perhitungan waktu sebagai berikut:
dikerjakan cycle
1:DELAY: MOV R0,#5 1 x 1
2:DELAY1: MOV R1,#0FFH 1 x 1
3:DELAY2: MOV R2,#0 1 x 1
4: DJNZ R2,$ 256 x 255 x 5 = 326.400 x 2
5: DJNZ R1,DELAY2 255 2
6: DJNZ R0,DELAY1 5 x 2
7: RET
Baris 4 dikerjakan sebanyak 326.400x, karena instruksi tersebut dikerjakan selama 2 siklus maka
waktu totalnya 326.400 x 2 = 652.800 siklus, masih ditambah dengan pengulangan kedua (255 x 3
siklus) 765 siklus dan pengulangan yang ketiga, DELAY1, sebesar 5 x 3 siklus = 15 siklus, sehingga
total siklus = 652.800 + 765 + 15 = 653.580 siklus.
Jika menggunakan frekuensi kristal 12 MHz waktu yang dibutuhkan untuk meyelesaikan sub-rutin ini
adalah 653.580 siklus x 1 µd = 653.580 µd = 0,65 detik untuk pewaktuan yang lebih akurat bisa
digunakan timer yang akan dibahas pada bagian IV.

61
Mulai
turunkan isi
register 1
(R1 <- R1 - 1)
isi register 0
dengan 5x ulang
(R0 <- #5)

apakah isi
register 1 = 0
isi register 1
255x ulang
(R1 <- #0FFh)

turunkan isi
Tidak
isi register 2 register 0
Tidak (R0 <- R0 - 1)
dengan 256x
ulang
(R2 <- #0)

apakah isi
turunkan isi regsiter 0 = 0
register 2
(R2 <- R2 - 1)

Tidak Ya

Selesai
Ya
apakah isi
register 2 = 0

Gambar III.4 Diagram Alir Sub-rutin DELAY

III.4.1.4. Langkah-langkah Menyimpan Program ke Flash Memori


Menggunakan Easy-Programmer
• Setelah program ditulis menggunakan editor teks, lakukan kompilasi program hingga
menghasilkan berkas dalam format heksa atau biner kemudian lakukan download program
tersebut ke AT89C51/52/55 menggunakan alat pemrograman yaitu Easy-Programmer
menggunakan program EZ31.EXE, yang jika diaktifkan akan memiliki tampilan seperti pada
gambar III.5.

Gambar III.5. Tampilan EZ Uploader Versi 3.1

62
• Pilih kanal serial COM1 atau COM2 sesuai letak kabel serial Easy Programmer-nya kemudian
tunggu hingga muncul pesan yang menyatakan bahwa programmer sudah siap untuk digunakan
(tanda OFFLINE akan berganti dengan identifikasi mikrokontroler yang terpasang pada
programmer yang bersangkutan, misalnya AT89C51, dst);
• Pilih tombol SEND untuk mengirimkan berkas heksa yang akan di-download ke mikrokontroler
yang bersangkutan (Anda akan ditanya nama berkas yang akan digunakan pada jendela dialog
yang dimunculkan), jika proses pengisian program sudah selesai, jangan lupa untuk mematikan
sumber daya programmernya sebelum mencabut IC mikrokontroler yang bersangkutan. Sekarang
mikrokontroler tersebut sudah siap untuk dipindahkan ke papan percobaan Anda (breadboard,
PCB prototipe dan lain-lain);
• Buatlah rangkaian sebagaimana yang ditunjukkan pada gambar III.3 pada papan breadboard,
jangan lupa untuk menghubungkan dengan catu-daya 5 Volt (pin 20 untuk GND dan 40 untuk Vcc
pada keping mikrokontroler yang digunakan, AT89C51/52/55) serta rangkaian kristal yang
disediakan. Kemudian amati bagaimana program yang telah tersimpan di dalam mikrokontroler
tersebut dijalankan!

III.4.1.5. Program Kedua


Sekarang kita akan memodifikasi program tersebut sedemikian hingga bisa untuk menghidupkan
lampu LED (sebanyak empat) dalam kelompok genap dan ganjil secara bergantian sebagaimana
program berikut:

1: ;- BAB3_02.ASM ----------------------------------------------------------------
2: ;
3: ; LAMPU FLIP-FLOP GENAP DAN GANJIL PADA PORT 1
4: ;
5: ;-------------------------------------------------------------------------------
6: ORG 0H
7: ;
8: MULAI: MOV P1,#01010101B ; LED P1.0, P1.2, P1.4 DAN P1.6 MENYALA (=55H)
9: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
10: MOV P1,#10101010B ; LED P1.1, P1.3, P1.5 DAN P1.7 MENYALA (=0AAH)
11: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
12: SJMP MULAI ; ULANGI LAGI DARI AWAL
13: ;
14: ;-SUBRUTIN DELAY-----------------------------------------------------------
15: ;
16: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
17: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
18: ; KONDISI TERTENTU
19: ;
20: ;--------------------------------------------------------------------------
21: DELAY: MOV R0,#5H ; ISI REGISTER R0 DENGAN 5 (5X ULANG)
22: DELAY1: MOV R1,#0FFH ; ISI REGISTER R1 DENGAN 255 (255X ULANG
23: DELAY2: MOV R2,#0 ; ISI REGISTER R2 DENGAN 0 (256X ULANG)
24: DJNZ R2,$ ; R2=R2-1, JIKA R2 BELUM 0 ULANGI LAGI
25: DJNZ R1,DELAY2 ; R1=R1-1, JIKA R1 BELUM 0 ULANGI DELAY2
26: DJNZ R0,DELAY1 ; R0=R0-1, JIKA R0 BELUM 0 ULANGI DELAY1
27: RET ; KEMBALI KE PEMANGGIL SUBRUTIN DELAY

Baris 14 – 27 sama seperti program sebelumnya (BAB3_01.ASM), sedangkan baris-8 dan 10, masing-
masing digunakan untuk menghidupkan LED secara selang-seling, ingat logika ’0’ digunakan untuk
menghidupkan LED yang bersangkutan. Jika terlalu panjang konstanta #01010101B pada baris-8
dapat diganti dengan format bilangan heksa, yaitu #55H, sedangkan baris 10 dapat diganti dengan
#0AAH (awali dengan ’0’ jika bilangan heksa diawali dengan huruf).

63
III.4.1.6. Program Ketiga
Modifikasi program lainnya adalah untuk menghidupkan lampu LED (sebanyak dua) dimulai dari
LED pada posisi P1.3 dan P1.4, P1.2 dan P1.5, P1.1 dan P1.6, P1.0 dan P1.7 kemudian
menyalakan LED agar bergerak ke tengah atau kembali ke posisi awal dari LED yang menyala, dan
programnya ditunjukkan berikut ini:

1: ;- BAB3_03.ASM -----------------------------------------------------------------
2: ;
3: ; LAMPU BERGERAK DARI TENGAH KE PINGGIR KEMUDIAN KEMBALI LAGI...
4: ;
5: ;-------------------------------------------------------------------------------
6: ORG 0H
7: ;
8: MULAI: MOV P1,#11100111B ; DUA LAMPU TENGAH MENYALA, P13 DAN P1.4 (=0E7H)
9: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
10: MOV P1,#11011011B ; DUA LAMPU BERIKUTNYA MENYALA, P1.2 DAN P1.5
11: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
12: MOV P1,#10111101B ; DUA LAMPU BERIKUTNYA MENYALA, P1.1 DAN P1.6
13: ACALL DELAY
14: MOV P1,#01111110B ; DUA LAMPU BERIKUTNYA MENYALA, P1.0 DAN P1.7
15: ACALL DELAY
16: MOV P1,#10111101B ; DUA LAMPU BERIKUTNYA MENYALA, P1.1 DAN P1.6
17: ACALL DELAY
18: MOV P1,#11011011B ; DUA LAMPU BERIKUTNYA MENYALA, P1.2 DAN P1.5
19: ACALL DELAY
20: SJMP MULAI ; LOMPAT KE ALAMAT DG LABEL MULAI
21: ;
22: ;-SUBRUTIN DELAY-----------------------------------------------------------
23: ;
24: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
25: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
26: ; KONDISI TERTENTU
27: ;
28: ;--------------------------------------------------------------------------
29: DELAY: MOV R0,#5H ; ISI REGISTER R0 DENGAN 5 (5X ULANG)
30: DELAY1: MOV R1,#0FFH ; ISI REGISTER R1 DENGAN 255 (255X ULANG
31: DELAY2: MOV R2,#0 ; ISI REGISTER R2 DENGAN 0 (256X ULANG)
32: DJNZ R2,$ ; R2=R2-1, JIKA R2 BELUM 0 ULANGI LAGI
33: DJNZ R1,DELAY2 ; R1=R1-1, JIKA R1 BELUM 0 ULANGI DELAY2
34: DJNZ R0,DELAY1 ; R0=R0-1, JIKA R0 BELUM 0 ULANGI DELAY1
35: RET ; KEMBALI KE PEMANGGIL SUBRUTIN DELAY
36: END

Sekarang program tampak lebih panjang dikarenakan baris 8 – 19 digunakan untuk memberikan efek
lampu LED menyala bergeser dari tengah ke pinggir kemudian kembali ke tengah lagi, dan seterusnya
(instruksi baris-20). Perhatikan keterangan pada tiap-tiap komentar di tiap-tiap baris (baris-8, 10, 12,
14, 16 dan 18).

III.4.1.7. Program Keempat


Program berikut ini merupakan aplikasi untuk membuat LED menyala bergantian (bergeser) dari
P1.0 ke P1.7 kemudian kembali ke awal lagi secara berulang-ulang :

1: ;- BAB3_04.ASM -----------------------------------------------------------------
2: ;
3: ; LAMPU BERJALAN DARI P1.0 S/D P1.7 KEMUDIAN KEMBALI LAGI
4: ;
5: ;-------------------------------------------------------------------------------
6: ORG 0H
7: ;
8: MOV A,#11111110B ; DATA LAMPU MENYALA DIKIRIM MELALUI AKUMULATOR
9: ; AGAR P1.0 PERTAMA KALI MENYALA, AKUMULATOR
10: ; DIISI DENGAN 11111110B ATAU 0FEH
11: MULAI:

64
12: MOV P1,A ; KIRIMKAN DATA DI AKUMUALTOR KE PORT 1
13: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT
14: RL A ; ROTASIKAN ISI AKUMULATOR KE KIRI
15: ; +->------>----->----->+
16: ; | |
17: ; +<--7-6-5-4-3-2-1-0<--+
18: SJMP MULAI ; ULANGI LAGI DARI AWAL
19: ;
20: ;-SUBRUTIN DELAY----------------------------------------------------------------
21: ;
22: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
23: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
24: ; KONDISI TERTENTU
25: ;
26: ;-------------------------------------------------------------------------------
27: DELAY: MOV R0,#0 ; ISI REGISTER R0 DENGAN 0 (256X ULANG)
28: DELAY1: MOV R1,#0 ; ISI REGISTER R1 DENGAN 0 (256X ULANG)
29: DJNZ R1,$
30: DJNZ R0,DELAY1
31: RET
32: END

Pada program BAB3_04.ASM ini, digunakan instruksi untuk menggeser bit ke kiri dan sekaligus
merotasi (baris-14). Pertama siapkan data yang akan dikirimkan ke Port 1 di akumulator (baris-8),
kemudian kirimkan ke Port 1 (baris-12), lakukan tundaan sesaat supaya efek penggeseran bisa diikuti
dengan mata (jika anda menghilangkan baris-13 ini, maka mata akan melihat bahwa semua lampu
LED menyala, padahal tidak, tetap bergantian, karena terlalu cepat sehingga mata manusia melihatnya
seakan-akan menyala semua), kemudian lakukan penggeseran ke kiri sekaligus merotasi melalui
akumulator (baris-14). Perintah RL (dan RR) hanya bisa digunakan untuk akumulator saja, sehingga
sejak awal sudah kita persiapkan datanya disimpan di akumulator, Anda bisa saja menyimpan data di
tempat lain, register misalnya, tetapi saat melakukan rotasi bit ke kanan atau ke kiri salinlah dulu ke
akumulator kemudian baru disalin lagi ke tempat semula.
Kita bisa memodifikasi program agar LED menyala bergantian dengan arah berlawanan (dari
P1.7 ke P1.0), baris-8 kita ganti dengan instruksi
MOV A,#01111111B ; simpan data 0111111B (=7Fh) ke Akumulator
Baris-14 kita ganti dengan instruksi
RR A ; putar isi akumulator ke kanan 1 bit

III.4.1.8. Program Kelima


Program BAB3_05.ASM berikut ini digunakan untuk menyalakan LED dari kanan ke kiri dan dari
kiri ke kanan sehingga nampak seperti pingpong:

1: ;- BAB3_05.ASM ----------------------------------------------------------------
2: ;
3: ; LAMPU MENYALA PINGPONG KIRI KE KANAN, KANAN KE KIRI DI PORT 1
4: ;
5: ;------------------------------------------------------------------------------
6: ORG 0H
7: ;
8: MOV A, #0FEH ; SIMPAN DATA 11111110B KE AKUMULATOR (P1.0
9: ; MENYALA DULUAN)
10: MULAI:
11: MOV P1,A ; KIRIM DATA KE PORT 1
12: ACALL DELAY ; TUNDA SEBENTAR
13: RL A ; PUTAR ISI AKUMULATOR KE KIRI 1 BIT
14: CJNE A,#7FH,MULAI ; APAKAH A=01111111B ? TIDAK, ULANGI LAGI!
15: MULAI1: ; YA, LANJUTKAN KE PROSES BERIKUT...
16: MOV P1,A ; KIRIM DATA KE PORT 1
17: ACALL DELAY ; TUNDA SEBENTAR
18: RR A ; PUTAR ISI AKUMULATOR KE KANAN 1 BIT
19: CJNE A,#0FEH,MULAI1 ; APAKAH A=11111110B ? TIDAK, ULANGI LAGI!

65
20: SJMP MULAI ; YA, ULANGI LAGI DARI PALING AWAL...
21: ;
22: ;-SUBRUTIN DELAY---------------------------------------------------------------
23: ;
24: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
25: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
26: ; KONDISI TERTENTU
27: ;
28: ;------------------------------------------------------------------------------
29: DELAY: MOV R0,#0 ; ISI REGISTER R0 DENGAN 0 (256X ULANG)
30: DELAY1: MOV R1,#0 ; ISI REGISTER R1 DENGAN 0 (256X ULANG)
31: DJNZ R1,$
32: DJNZ R0,DELAY1
33: RET
34: END

Program ini mirip dengan program sebelumnya (BAB3_04.ASM). Baris 11–14 digunakan untuk
menyalakan LED secara bergantian dari P1.0 hingga P1.7, data awal disiapkan di baris 8 (melalui
akumulator seperti pada program sebelumnya). Data dikirimkan ke Port 1 (baris-11), kemudian
lakukan tundaan (baris-12), selanjutnya digeser-putar ke kiri (baris-13). Pada baris-14 dilakukan
pengujian apakah logika ’0’ yang digeser ke kiri sudah mencapai bit paling kiri, bit ke 7 atau P1.7
atau datanya adalah #0111111B (=#7FH)? Jika sudah maka lanjutkan untuk proses penggeseran ke
kanan (baris 16–19), jika belum lakukan pengulangan lagi mulai baris-11, demikian seterusnya. Untuk
proses penggeseran ke kanan (baris 16-19), sebagai data yang menunjukkan bahwa logika ’0’ yang
digeser ke kanan sudah mencapai bit ke 1 (terkanan) atau P1.0 adalah #11111110B (=#0FEH)
sebagaimana bisa dilihat pada baris-19. Proses ini diulang-ulang terus-menerus (baris-20) sehingga
diperoleh efek lampu LED menyala secara ping-pong.
III.4.2. APLIKASI PORT UNTUK PENGGERAK 7-SEGMENT
III.4.2.1. Tujuan
Program aplikasi Port 0 sebagai penggerak (driver) penampil 7-segment (7-segment display).
III.4.2.2. Rangkaian Aplikasi
Resistor
330 ohm

8.
Vcc 10 1 39 21
9 f a 2 38 P0.0/AD0 P2.0/A8 22
8 g b 3 37 P0.1/AD1 P2.1/A9 23
7 P c 4 36 P0.2/AD2 P2.2/A10 24
6 A d 5 35 P0.3/AD3 P2.3/A11 25
A e 34 P0.4/AD4 P2.4/A12 26
33 P0.5/AD5 P2.5/A13 27
7-segment P0.6/AD6 P2.6/A14
32 28
P0.7/AD7 P2.7/A15
1 10
2 P1.0 P3.0/RXD 11
3 P1.1 P3.1/TXD 12
4 P1.2 P3.2/INTO 13
5 P1.3 P3.3/INT1 14
6 P1.4 P3.4/TO 15
7 P1.5 P3.5/T1 16
8 P1.6 P3.6/WR 17
P1.7 P3.7/RD
19 29
18 XTAL1 PSEN
30 Pf 12 MHz 9 XTAL2 30
CRY STAL Vcc RST ALE/PROG
31
EA/VPP
30 Pf AT89C51

Vcc
Resistor

10 K 10 Uf

Gambar III.6.a. Rangkaian Aplikasi Penggerak 7-Segment

66
Gambar III.6.b. Struktur Penampil LED 7-segment
Catatan:
Perhatikan hubungan antara Port 0 dengan penampil 7-segment yang disusun sebagai berikut:
Mikrokontroler 7-segment (common Anoda)
P0.0 pin a
P0.1 pin b
P0.2 pin c
P0.3 pin d
P0.4 pin e
P0.5 pin f
P0.6 pin g
P0.7 pin dot_point
Rangkaian penggerak penampil 7-Segment ditunjukkan pada gambar III.6.a. Kali ini digunakan Port 0
dengan konfigurasi common Anode (seperti pada contoh sebelumnya). Dilihat dari struktur Port 0 pada
gambar III.2.A, serta sifat-sifat dari Port 0, akan lebih mudah mengkonfigurasi LED dalam 7-segment
dengan common Anode. Dengan demikian untuk menghidupkan atau menyalakan LED diperlukan
logika ’0’ pada Port 0.
Agar tampilan 7-segment menampilkan angka 0 maka LED a, b, c, d, e dan f harus
dinyalakan (perhatikan gambar III.6.b) untuk itu dikirimkan logika ’0’ pada bit-bit yang terkait yaitu
P0.0, P0.1, P0.2, P0.3, P0.4 dan P0.5, sehingga data yang terkirim adalah 11000000 =
C0h. Untuk lengkapnya perhatikan tabel III.2.
Program akan menampilkan angka 0 s/d 9 secara bergantian kemudian berulang lagi. Baris-8,
10, 12, 14, 16, 18, 20, 22, 24 dan 26 digunakan untuk menyalakan 7 segment sesuai angka 0 s/d 9.
Tabel III.2. Daftar Heksa Dari Tampilan Angka Pada 7-Segment
Tampilan P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 Heksa
Angka dp g f e d c b a
0 1 1 0 0 0 0 0 0 C0
1 1 1 1 1 1 0 0 1 F9
2 1 0 1 0 0 1 0 0 A4
3 1 0 1 1 0 0 0 0 B0
4 1 0 0 1 1 0 0 1 99
5 1 0 0 1 0 0 1 0 92
6 1 0 0 0 0 0 1 0 82
7 1 1 1 1 1 0 0 0 F8
8 1 0 0 0 0 0 0 0 80
9 1 0 0 1 0 0 0 0 90

III.4.2.3. Program Pertama


1: ;- BAB3_06.ASM ----------------------------------------------------------------
2: ;

67
3: ; MENGHIDUPKAN DISPLAY LED 7 SEGMENT UNTUK MENAMPILKAN ANGKA 0 S/D 9
4: ; CARA 1 : DATA LANGSUNG DIKELUARKAN KE PORT YANG BERSANGKUTAN
5: ;
6: ;------------------------------------------------------------------------------
7: ORG 0H
8: ;
9: MULAI:
10: MOV P0,#0C0H ; KELUARKAN KODE ANGKA 0 PORT 0
11: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
12: MOV P0,#0F9H ; KELUARKAN KODE ANGKA 1 PORT 0
13: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
14: MOV P0,#0A4H ; KELUARKAN KODE ANGKA 2 PORT 0
15: ACALL DELAY
16: MOV P0,#0B0H ; KELUARKAN KODE ANGKA 3 PORT 0
17: ACALL DELAY
18: MOV P0,#99H ; KELUARKAN KODE ANGKA 4 PORT 0
19: ACALL DELAY
20: MOV P0,#92H ; KELUARKAN KODE ANGKA 5 PORT 0
21: ACALL DELAY
22: MOV P0,#82H ; KELUARKAN KODE ANGKA 6 PORT 0
23: ACALL DELAY
24: MOV P0,#0F8H ; KELUARKAN KODE ANGKA 7 PORT 0
25: ACALL DELAY
26: MOV P0,#80H ; KELUARKAN KODE ANGKA 8 PORT 0
27: ACALL DELAY
28: MOV P0,#90H ; KELUARKAN KODE ANGKA 9 PORT 0
29: ACALL DELAY
30: SJMP MULAI ; ULANGI LAGI DARI AWAL
31: ;
32: ;-SUBRUTIN DELAY---------------------------------------------------------------
33: ;
34: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
35: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
36: ; KONDISI TERTENTU
37: ;
38: ;------------------------------------------------------------------------------
39: DELAY: MOV R0,#2 ; ISI REGISTER R0 DENGAN 2 (2X ULANG)
40: DELAY1: MOV R1,#0FFH ; ISI REGISTER R1 DENGAN FF (255X ULANG)
41: DELAY2: MOV R2,#0 ; ISI REGISTER R2 DENGAN 0 (256X ULANG)
42: DJNZ R2,$
43: DJNZ R1,DELAY2
44: DJNZ R0,DELAY1
45: RET
46: END

Sebagaimana penjelasan sebelumnya, pada program pertama ini (BAB3_06.ASM), untuk


menampilkan urutan angka 0 s/d 9 secara bergantian pada tampilan LED 7-segment, diawali dengan
mengeluarkan kode untuk angka 0, yaitu C0H ke Port 0 (baris 10), kemudian dilakukan tundaan sesaat
(baris-11). Selanjutnya pada baris-12 dikeluarkan kode untuk angka 1 (F9H), lakukan tundaan sesaat
(baris-13) demikian seterusnya hingga kode untuk angka 9 (90H) pada baris-28. Kemudian diulang
lagi dari awal (baris-30). Sehingga akan muncul efek pencacah 0 s/d 9 pada tampilan LED 7-segment.
III.4.2.4. Program Kedua
1: ;- BAB3_07.ASM ----------------------------------------------------------------
2: ;
3: ; MENGHIDUPKAN DISPLAY LED 7 SEGMENT UNTUK MENAMPILKAN ANGKA 0 S/D 9
4: ; CARA 2 : DATA DIAMBIL DARI ALAMAT LARIK (ARRAY) DATA, PROGRAM JADI LEBIH
5: ; PENDEK
6: ;
7: ;------------------------------------------------------------------------------
8: ORG 0H
9: ;
10: MULAI:
11: MOV R2,#0AH ; JUMLAH ANGKA NUMERIK YG AKAN DITAMPILKAN
12: MOV DPTR,#NUMERIK ; REGISTER DPTR MENUNJUK PADA LOKASI AWAL DATA
13: NEXTDATA:
14: CLR A ; PERSIAPKAN AKUMULATOR
15: MOVC A,@A+DPTR ; SALIN ISI LOKASI YG DITUNJUK A+DPTR KE A

68
16: MOV P0,A ; KELUARKAN DATA A KE PORT 0
17: INC DPTR ; KE LOKASI DATA BERIKUTNYA
18: ACALL DELAY ; LAKUKAN PENUNDAAN SESAAT...
19: DJNZ R2,NEXTDATA ; R2=R2-1, JIKA R2 <> 0 ULANGI LAGI
20: SJMP MULAI ; ULANGI LAGI DARI AWAL...
21: ;
22: ;-SUBRUTIN DELAY---------------------------------------------------------------
23: ;
24: ; SUBRUTIN INI HANYA SEKEDAR MELAKUKAN PENUNDAAN SESAAT DENGAN CARA
25: ; MENGULANGI PROSES (PENGURANGAN ISI REGISTER) HINGGA DICAPAI SUATU
26: ; KONDISI TERTENTU
27: ;
28: ;------------------------------------------------------------------------------
29: DELAY: MOV R0,#2H ; ISI REGISTER R0 DENGAN 2 (2X ULANG)
30: DELAY1: MOV R1,#0FFH ; ISI REGISTER R1 DENGAN FF (255X ULANG)
31: DELAY2: MOV R2,#0 ; ISI REGISTER R2 DENGAN 0 (256X ULANG)
32: DJNZ R2,$
33: DJNZ R1,DELAY2
34: DJNZ R0,DELAY1
35: RET
36: ;
37: ;------------------------------------------------------------------------------
38: ; LOKASI LARIK DATA
39: ; BERISI KODE-KODE UNTUK MENGHIDUPKAN 7-SEGMENT: ANGKA 0 S/D 9 SECARA BRTURUTAN
40: ;------------------------------------------------------------------------------
41: NUMERIK:
42: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
43: END

Program kedua ini (BAB3_07.ASM) hasilnya sama persis dengan program pertama
(BAB3_06.ASM), hanya cara penulisannya yang berbeda. Pada program pertama data langsung
dikirim secara langsung ke port 0, sedangkan pada cara kedua ini data-data tampilan disimpan dalam
memori terlebih dahulu (baris-41 dan 42), kemudian dibaca dan dikirim satu persatu, sehingga
mengakibatkan programnya menjadi lebih pendek (dan lebih kecil), banyangkan saja jika data yang
dikirim ada 20, 30 atau bahkan lebih dari 50?
Register R2 digunakan untuk menyimpan cacah data yang akan dikirimkan ke Port 0 (baris-
11), yaitu sebanyak 10 data. Sebelum bisa mengakses tabel data, yang dalam hal ini tersimpan dalam
memori mulai tabel NUMERIK (baris-41 dan 42), penunjuk data DPTR, harus diarahkan ke lokasi
tersebut, menggunakan instruksi pada baris-12. Instruksi berikutnya adalah mengosongkan akumulator
(baris-14) karena akan digunakan untuk menyimpan data sementara yang nantinya akan dikirim ke
Port 0 (baris-16). Pada baris-15, isi dari lokasi memori yang ditunjuk oleh DPTR+A dibaca dan
disimpan ke akumulator. Untuk pembacaan data berikutnya penunjuk data DPTR perlu dinaikkan 1
(indeks lokasi data berikutnya) menggunakan instruksi yang dituliskan pada baris-17. Kemudian nilai
R2 yang sebelumnya dikurangi 1 atau R2=R2-1 (baris-19) sebagai tanda bahwa sebuah data telah
diproses, jika R2 belum sama dengan nol, proses pengiriman data diulang lagi (lompat ke label
NEXDATA) hingga semua data, yang jumlahnya 10, selesai diproses. Kemudian program diulang dari
awal lagi dari awal (baris-20).
III.4.2.5. Program Ketiga
Modifikasi program pertama dan kedua, untuk menghidupkan 7-segment agar menampilkan huruf dari
A s/d F, sebagaimana data-datanya ditunjukkan pada tabel III.3.
Tabel III.3. Daftar Heksa Dari Tampilan Huruf A s/d F Pada 7-Segment
Tampilan P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 Heksa
Huruf Dp g f e d c b a
A 1 0 0 0 1 0 0 0 88
b 1 0 0 0 0 0 1 1 83
C 1 1 0 0 0 1 1 0 C6
d 1 0 1 0 0 0 0 1 A1
E 1 0 0 0 0 1 1 0 86
F 1 0 0 0 1 1 1 0 8E

69

Anda mungkin juga menyukai