Pada mikrokontroler Atemal keluarga AT89C (obsollete) atau AT89S, Port 0 tidak memiliki pullup internal. Pullup FET yang berada di dalam penggerak luaran P0 digunakan hanya pada saat port mengirimkan logika ‘1’ selama pengaksesan memori eksternal. Selain dari itu, pullup FET akan selalu mati. Konsekuensinya, jalur-jalur P0 yang digunakan sebagai jalur luaran 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, pin dapat digunakan sebagai masukan berimpedansi tinggi.
Karena Port 1, 2 dan 3 telah memiliki pullup internal yang pasti, mereka dinamakan sebagai port-port kuasi-dwi-arah (quasi-bidirectional). Saat dikonfigurasi sebagai masukan, maka ditarik tinggi dan memberikan arus (source current) 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 atau saat Power ON akan menuliskan ‘1’ ke seluruh bit-bit pengancing (latch) port pada keluarga AT89. Jika kemudian ‘0’ dituliskan ke pengancing, pengancing dapat dikonfigurasi sebagai masukan jika ‘1’ dituliskan padanya.
Contoh rangkaian dan aplikasi
Rangkain minimum untuk menghidupkan 8 LED melalui Port 1 ditunjukkan pada gambar dibawah ini. Yang perlu diperhatikan adalah konfigurasi rangkaian LED itu sendiri, yaitu Common Anode (CA), artinya untuk menghidupkan LED pada Port 1 yang bersangkutan, harus dikirim logika ‘0′. Hal ini berkaitan dengan penjelasan sebelumnya, Jika ‘0’ kita tulis ke Port 0 maka luaran dari lacth (yang ) akan menghidupkan FET sehingga baik kaki Port 0 maupun resistor pullup internal akan di pulled-low (secara internal juga), sehingga LED yang terhubungkan secara CA bisa menyala.
Sedangkan jika menggunakan rangkaian Common Khatode (CK), 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 uA, 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).
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) 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 (diabaikan selama proses kompilasi), 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 subrutin DELAY.
Informasi lebih lengkap bisa diperoleh di buku saya “Belajar Mikrokontroler At89C51/52/55: Teori dan Aplikasi, Edisi 2“, CV. Gava Media – Yogyakarta (klik)