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).
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
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
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
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!
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).
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
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
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
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
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