bahan praktikum aplikasi komputer

51
BAB I DASAR INTERFACE KOMPUTER 1.1 Pendahuluan Bagi sebagian orang, komputer dipandang sebagai alat pengolah kata sekedar pengganti mesin ketik. Sebagian orang yang lain menggunakan komputer hanya sebagai sarana permainan video game. Sebagian lainnya lagi memakai komputer untuk menyelesaikan perhitungan pembukuan/keuangan perusahaannya sekedar pengganti mesin hitung. Sebenarnya penggunaan komputer tidak hanya sebatas itu, tetapi jauh lebih luas. Penggunaan komputer di bidang kendali (kontrol) jauh lebih luas dibanding penggunaannya untuk maksud umum (general purpose). Komputer dapat digunakan sebagai cash register (mesin bayar), sebagai mesin timbangan otomatis, sebagai pengendali alat musik, mobil, robot, rudal (peluru kendali), dan sangat banyak lagi yang lainnya. Untuk dapat memanfaatkan komputer sesuai dengan kebutuhan, perlu diketahui apa saja yang ada di dalam komputer itu dan bagaimana bekerjanya. 1.2 Arsitektur Dasar Komputer Setiap komputer menggunakan mikroprosesor (atau sering disingkat dengan prosesor) sebagai piranti inti yang di sekelilingnya dihubungkan unit memori dan beberapa piranti masukan dan keluaran (I/O). Prosesor merupakan pusat pengolahan dan pusat pengendalian atas semua piranti di sekelilingnya. Prosesor mengendalikan operasi atas memori dan piranti I/O. Komputer dapat bekerja hanya jika program dan data sudah berada dalam memori utamanya. Karena itu pada setiap komputer harus ada memori, baik RAM (Random Access Memory, memori baca-tulis) maupun ROM (Read Only Memory, memori hanya baca). RAM diperlukan sebagai ruang kerja (sejenis kertas buram dalam tulis tangan) sedangkan ROM diperlukan untuk menyimpan program dan data yang diperlukan untuk memulai operasi komputer pertama kali dihidupkan, dan sebagian program dan data untuk operasi normal. Tanpa piranti masukan, manusia sebagai pemakai tak dapat memberikan perintah/instruksi yang harus dilaksanakan oleh komputer, dan komputer itu akan kehilangan nilainya. Tanpa piranti keluaran, manusia tidak memperoleh hasil pelaksanaan perintah oleh komputer dan komputer itu juga kehilangan nilainya. Karena itu, dalam setiap komputer harus ada paling tidak satu piranti masukan dan satu piranti keluaran. Piranti I/O pada umumnya bekerja secara elektromekanis sedangkan prosesor bekerja secara elektronis sehingga pada umumnya kecepatan operasinya berbeda. Sifat/bentuk data yang diolahnya juga sering berbeda ukuran (8 bit, 16 bit, 32 1

Upload: harry-hasibuan

Post on 25-Jun-2015

705 views

Category:

Documents


12 download

TRANSCRIPT

BAB IDASAR INTERFACE KOMPUTER

1.1 Pendahuluan

Bagi sebagian orang, komputer dipandang sebagai alat pengolah kata sekedar pengganti mesin ketik. Sebagian orang yang lain menggunakan komputer hanya sebagai sarana permainan video game. Sebagian lainnya lagi memakai komputer untuk menyelesaikan perhitungan pembukuan/keuangan perusahaannya sekedar pengganti mesin hitung. Sebenarnya penggunaan komputer tidak hanya sebatas itu, tetapi jauh lebih luas.

Penggunaan komputer di bidang kendali (kontrol) jauh lebih luas dibanding penggunaannya untuk maksud umum (general purpose). Komputer dapat digunakan sebagai cash register (mesin bayar), sebagai mesin timbangan otomatis, sebagai pengendali alat musik, mobil, robot, rudal (peluru kendali), dan sangat banyak lagi yang lainnya. Untuk dapat memanfaatkan komputer sesuai dengan kebutuhan, perlu diketahui apa saja yang ada di dalam komputer itu dan bagaimana bekerjanya.

1.2 Arsitektur Dasar Komputer

Setiap komputer menggunakan mikroprosesor (atau sering disingkat dengan prosesor) sebagai piranti inti yang di sekelilingnya dihubungkan unit memori dan beberapa piranti masukan dan keluaran (I/O). Prosesor merupakan pusat pengolahan dan pusat pengendalian atas semua piranti di sekelilingnya. Prosesor mengendalikan operasi atas memori dan piranti I/O.

Komputer dapat bekerja hanya jika program dan data sudah berada dalam memori utamanya. Karena itu pada setiap komputer harus ada memori, baik RAM (Random Access Memory, memori baca-tulis) maupun ROM (Read Only Memory, memori hanya baca). RAM diperlukan sebagai ruang kerja (sejenis kertas buram dalam tulis tangan) sedangkan ROM diperlukan untuk menyimpan program dan data yang diperlukan untuk memulai operasi komputer pertama kali dihidupkan, dan sebagian program dan data untuk operasi normal.

Tanpa piranti masukan, manusia sebagai pemakai tak dapat memberikan perintah/instruksi yang harus dilaksanakan oleh komputer, dan komputer itu akan kehilangan nilainya. Tanpa piranti keluaran, manusia tidak memperoleh hasil pelaksanaan perintah oleh komputer dan komputer itu juga kehilangan nilainya. Karena itu, dalam setiap komputer harus ada paling tidak satu piranti masukan dan satu piranti keluaran. Piranti I/O pada umumnya bekerja secara elektromekanis sedangkan prosesor bekerja secara elektronis sehingga pada umumnya kecepatan operasinya berbeda. Sifat/bentuk data yang diolahnya juga sering berbeda ukuran (8 bit, 16 bit, 32 bit, dsb.) atau sifatnya (serial atau paralel). Untuk memungkinkan komunikasi di antara piranti-piranti ini diperlukan sarana pengantara atau antarmuka (interface). Dalam operasinya, prosesor berhubungan langsung hanya dengan antarmuka, bukan dengan piranti I/O itu sendiri.

Komunikasi antara prosesor dengan semua piranti di sekelilingnya dalam suatu komputer dilaksanakan melalui sinyal-sinyal elektronik, yang berdasarkan fungsinya dapat dibedakan menjadi tiga kelompok yang berbeda sifatnya, yaitu alamat, data, dan kendali. Masing-masing kelompok sinyal ini dilewatkan pada sekelompok saluran di luar mikroprosesor yang disebut bus, sehingga dalam setiap komputer terdapat tiga bus utama, yaitu bus data (data bus), bus alamat (address bus), dan bus kendali (control bus). Ketiga bus yang berada di luar mikroprosesor ini disebut bus eksternal dan hubungannya dapat dilihat pada Gambar 1.

Setiap memori dan piranti I/O (melalui antarmukanya) dikenal prosesor melalui nomor alamat. Nomor alamat untuk piranti I/O disebut nomor bandar (nomor port). Penulisan/pengiriman data ke memori atau antarmuka keluaran dilakukan dengan meletakkan nomor alamat atau nomor port pada bus alamat dan data yang akan dituliskan pada bus data diikuti dengan pengiriman sinyal kendali untuk penulisan. Pembacaan data dari memori atau antarmuka masukan dengan meletakkan nomor alamat atau nomor port pada bus alamat diikuti dengan pengiriman sinyal kendali untuk pembacaan yang membuat memori atau masukan meletakkan datanya pada bus data untuk dapat diambil oleh prosesor dan ditempatkan dalam salah satu register kerjanya. Semua operasi atas memori atau I/O dikendalikan oleh prosesor dengan mengirimkan sinyal-sinyal kendali melalui bus kendali. Peletakan atau pengambilan data ke/dari bus data dan alamat dan pengaktifan sinyal kendali harus

1

Mikro-prosesor

ROM RAMI/O

InterfaceI/O

Device

Bus Alamat

Bus Data

Bus Kendali

Gambar 1 Diagram blok komputer secara umum

dilaksanakan dalam waktu yang tepat. Pewaktuan (timing) memegang peranan yang sangat penting dalam operasi setiap komputer, sebab tanpa pewaktuan yang tepat, komputer tidak akan dapat memberikan sesuatu yang berarti bagi pemakainya.

Berdasarkan keterangan di atas, maka secara umum, sebuah komputer dapat digambarkan dengan diagram blok seperti Gambar 1 berikut:

1.3 Identifikasi Perangkat Keras

Setiap peralatan yang terhubung ke mikroprosesor mempunyai nomor pengenal agar mikroprosesor dapat menghubungi (mengakses) peralatan tersebut. Berdasarkan Gambar 1, pada dasarnya peralatan yang terhubung ke mikroprosesor dapat dibagi atas dua jenis, yaitu memori (mencakup ROM dan RAM) dan I/O (mencakup keyboard, mouse, disk drive, monitor, printer). Nomor pengenal setiap peralatan adalah unik. Untuk memori, nomor pengenalnya disebut nomor alamat, sedangkan untuk peralatan I/O, nomor pengenalnya disebut nomor port.

Dalam komputer IBM PC dan kompatibelnya, lokasi memori mulai alamat 0000:0400h sampai 0000:05FFh, digunakan oleh BIOS (Basic Input-Output System, bagian penting dari sistem operasi DOS) untuk menyimpan informasi yang sangat penting tentang konfigurasi komputer (daftar peralatan) bersangkutan sehingga disebut juga sebagai lokasi kunci (key low-memory). Informasi ini berupa alamat/nomor port serial dan paralel, daftar peralatan yang terpasang (equipment list), kapasitas memori terpasang, status dan kontrol keyboard, status disket, dan sebagainya.

1.4 Port Paralel dan Spesifikasinya

1.4.1 Alamat Port ParalelSetiap port paralel (disebut juga port printer) memiliki tiga alamat port, yaitu port data,

port status, dan port kontrol. Ketiga alamat ini selalu berurutan, yaitu jika port data berada pada alamat 0x378, port status berada pada alamat 0x379 dan port kontrol pada 0x37A. (Catatan: awalan ‘0x’ di sini adalah simbol untuk bilangan heksadesimal dalam bahasa C)Contoh alamat port paralel: Printer Port Data Port Status Port Kontrol

LPT1 0x03bc 0x03bd 0x03be LPT2 0x0378 0x0379 0x037a LPT3 0x0278 0x0279 0x027a

Biasanya alamat dasar untuk LPT1 adalah 0x378 atau 0x3BC.

2

Untuk mengidentifikasi dengan tepat alamat port printer untuk suatu komputer tertentu, dapat digunakan program DEBUG dari DOS untuk menampilkan data pada lokasi memori 0000:00408h yang berisi nomor alamat port printer LPT1 sampai LPT4. Sebagai contoh:

>debug -d 0000:0408 L8 0000:0400 F8 02 F8 03 00 00 00 00-78 03 78 02 00 00 00 00

LPT1 LPT2 LPT3 LPT4Pada contoh ini, LPT1 berada pada alamat 0x0378h, LPT2 pada 0x0278h, sementara LPT3 dan LPT4 tidak ada. Dengan demikian, untuk komputer ini, daftar alamat port paralel adalah sebagai berikut: Printer Port Data Port Status Port Kontrol

LPT1 0x0378 0x0379 0x037a LPT2 0x0278 0x0279 0x027a LPT3 TIDAK ADA LPT4 TIDAK ADA

1.4.2 Konektor DB-25 dan Nama-nama Sinyal

Printer terhubung ke komputer melalui antarmuka port paralel dengan menggunakan konektor DB-25 yang memiliki 25 pin seperti pada Gambar 2.

Gambar 2 Konektor DB-25

Nama-nama sinyal pada masing-masing pin dapat dilihat pada Tabel 1.

Tabel 1 Daftar Nama Sinyal pada Konektor DB-25

No. Pin Nama Sinyal *) Arah **) Bit Register *)1 ~Strobe Out ~C0

2 – 9 Data 0 – Data 7 Out D0 – D710 Ack In S611 ~Busy In ~S712 Paper Empty In S513 Select In S414 ~Auto Feed Out ~C115 Error In S316 Initialize Out C217 ~Select in Out ~C3

18 – 25 Ground - -Catatan:

*) Tanda ~ di depan nama sinyal atau bit berarti bahwa sinyal atau bit yang bersangkutan aktif rendah.

**) Arah sinyal dipandang dengan acuan mikroprosesor.

1.4.3 Register-register Perangkat Lunak

Ketiga port pada port paralel, yaitu port data, port status, dan port kontrol, memiliki register perangkat lunak yang masing-masing berukuran 8 bit. Susunan bit-bit pada register untuk masing-masing port dapat dilihat pada Gambar 3.

Port Data (alamat 0x378):

3

D7 D6 D5 D4 D3 D2 D1 D0Data 7 Data 6 Data 5 Data 4 Data 3 Data 2 Data 1 Data 0

Port Status (alamat 0x379):~S7 S6 S5 S4 S3 - - -

~Busy Ack PE Select Error - - -

Port Kontrol (alamat 0x37A):- - - - ~C3 C2 ~C1 ~C0- - - - ~Select in Init ~AutoFeed ~Strobe

Gambar 3 Register Perangkat Lunak pada Port Paralel

1.5 Pemrograman Untuk Akses Port Paralel

1.5.1 Pemilihan Bahasa Pemrograman

Pada dasarnya, setiap bahasa pemrograman, baik bahasa tingkat tinggi maupun bahasa assembly, memiliki kemampuan untuk mengakses perangkat keras yang dalam hal ini berupa port paralel. Namun demikian, di antara bahasa-bahasa itu terdapat perbedaan pada beberapa aspek, di antaranya adalah dalam hal kecepatan eksekusi dan ukuran executable file (file *.exe atau *.com) yang dihasilkan setelah diterjemahkan ke dalam kode mesin. Kecepatan eksekusi terbaik tentu saja ada pada bahasa assembly, karena setiap satu instruksi assembly langsung diterjemahkan ke dalam satu kode mesin ekivalennya. Hal ini berbeda untuk bahasa tingkat tinggi, karena setiap satu perintah dalam bahasa tingkat tinggi umumnya diterjemahkan menjadi lebih dari satu instruksi assembly, sehingga ukuran executable file menjadi relatif lebih besar.

Sistem operasi juga menjadi pertimbangan untuk memilih bahasa pemrograman yang akan digunakan untuk mengakses perangkat keras. Untuk sistem operasi berbasis DOS, dapat digunakan bahasa pemrograman seperti Pascal, Basic, C/C++, Assembly, dan Prolog. Untuk sistem operasi berbasis Windows, dapat dipilih bahasa pemrograman seperti Borland Delphi, Visual Basic, Visual C++, C++ Builder, dan Visual Prolog.

Dalam sebagian bahasa pemrograman berbasis sistem operasi Windows, misalnya Visual Basic (VB), untuk akses langsung ke port paralel tidak disediakan perintah khusus. Sebagai pemecahannya, VB menggunakan DLL (dynamic-link library) yang merupakan file library yang berisi prosedur atau fungsi siap-pakai yang dibuat dengan menggunakan bahasa pemrograman lain, misalnya Delphi. Prosedur atau fungsi yang ada di dalam file *.DLL dipanggil pada saat run-time dari VB. Sebelum dapat dipanggil oleh VB, file *.DLL yang bersangkutan harus diletakkan terlebih dahulu di dalam folder C:\Windows\System (untuk sistem operasi Windows 98). Sebelum dapat dipanggil, prosedur atau fungsi yang bersangkutan harus dideklarasikan terlebih dahulu. Untuk prosedur yang tidak mengembalikan nilai, format deklarasinya adalah sebagai berikut:

[Private|Public] Declare Sub procname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]

Untuk fungsi (yang mengembalikan nilai), format deklarasinya diubah menjadi sebagai berikut:

[Private|Public] Declare Function funcname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

Pada kedua deklarasi di atas, simbol procname adalah nama prosedur, funcname adalah nama fungsi, “libname” adalah string yang berupa nama file *.DLL, variable adalah variabel yang diperlukan pada prosedur atau fungsi, type adalah tipe data untuk variabel yang bersangkutan. Kata kunci Private digunakan jika prosedur atau fungsi dideklarasikan di dalam modul Form atau Class. Secara default, jika tidak dituliskan kata kunci Private atau Public, prosedur atau fungsi adalah bersifat Public.

4

Sebagai contoh, untuk akses perangkat keras, digunakan file “IO.DLL” (diambil dari internet) yang berisi prosedur PortOut (meniru prosedur outportb pada bahasa C) dan fungsi PortIn (meniru fungsi inportb pada bahasa C). Untuk menggunakannya, deklarasinya adalah sebagai berikut:

Private Declare Sub PortOut Lib “IO.DLL” (ByVal PortNo As Integer, ByVal Data As Byte)

Private Declare Function PortIn Lib “IO.DLL” (ByVal PortNo As Integer) As Byte

1.5.2 Penulisan Data ke Port Keluaran

Untuk menulis satu byte data (misalnya 8Ah) ke port 378h, dapat digunakan cara sebagai berikut:

Bahasa Operasi Menulis ke Port Keterangan

Pascal Port[$378]:=$8A; $ adalah awalan untuk angka heksadesimal dalam bahasa Pascal

Basic out &H378,&H8A &H adalah awalan untuk angka heksadesimal dalam bahasa Basic

C/C++ outportb(0x378,0x8A); 0x adalah awalan untuk angka heksadesimal dalam bahasa C/C++

Assembly (pada Intel 80x86)

mov al,8Ahmov dx,378hout dx,al

h adalah akhiran untuk angka heksadesimal dalam bahasa assembly

Prolog port_byte($378,$8A) $ adalah awalan untuk angka heksadesimal dalam bahasa Prolog

Delphi asm mov al,8Ah mov dx,378h out dx,alend;

Ini adalah penyisipan instruksi-instruksi assembly ke dalam kode Delphi

Visual Basic PortOut &H378, &H8A Berdasarkan deklarasi dari file IO.DLL

1.5.3 Pembacaan Data dari Port Masukan

Untuk membaca satu byte data dari port 379h, dapat digunakan cara sebagai berikut:

BahasaOperasi Membaca dari

PortKeterangan

Pascal X := port[$379]; Hasil pembacaan disimpan dalam variabel (misalnya) X

Basic X = inp(&H379) Hasil pembacaan disimpan dalam variabel (misalnya) X

C/C++ X = inportb(0x379); Hasil pembacaan disimpan dalam variabel (misalnya) X

Assembly (pada Intel 80x86)

mov dx,379hin al,dx

Hasil pembacaan disimpan dalam register AL

Prolog port_byte($379,X) Hasil pembacaan disimpan dalam variabel (misalnya) X

Delphi asm mov dx,379h in al,dx mov X,alend;

Hasil pembacaan disimpan dalam variabel (misalnya) X

Visual Basic X = PortIn (&H379) Berdasarkan deklarasi dari file IO.DLL

5

1.5.4 Operasi Manipulasi Bit

Pada Gambar 3, dapat dilihat bahwa Port Status memiliki sebuah bit yang aktif rendah, yaitu bit 7 (MSB), sementara pada Port Kontrol terdapat tiga buah bit yang aktif rendah, yaitu bit 0, bit 1, dan bit 3. Untuk kedua port ini perlu dilakukan operasi manipulasi bit khusus agar pembacaan dan penulisan data tidak kacau.

Pada Port Status, hanya lima buah bit tertinggi yang digunakan dan berhubungan dengan konektor ke luar komputer. Semua masukan ini dijemput dengan cara membaca 5-bit tertinggi dari Port Status. Namun demikian, karena rangkaian antarmuka printer melakukan inversi (pembalikan bit) secara hardware, logika 0 pada masukan ~S7 harus dibaca sebagai logika 1 dan sebaliknya. Potongan program berikut ini menunjukkan contoh pembacaan 5-bit tertinggi dari Port Status menggunakan bahasa C:

#define STATUS 0x379 ... unsigned int A; ...

A = ((inportb(STATUS)^0x80) >> 3);

Pada potongan program di atas, Port Status dibaca dan bit 7 (yaitu ~S7) dibalik dengan operasi EXOR. Hasilnya kemudian digeser ke kanan tiga kali sehingga lima bit tertinggi berada pada posisi lima bit terendah.

7 6 5 4 3 2 1 00 0 0 ~S

7S6 S5 S4 S3

Pada Port Kontrol, hanya empat buah bit terendah yang digunakan dan berhubungan dengan konektor ke luar komputer. Dari keempat bit ini, bit 3, bit 1, dan bit 0 masing-masing memiliki logika aktif rendah, yaitu terjadi pembalikan (inversi) secara hardware pada rangkaian antarmuka port printer. Untuk bit-bit yang menggunakan logika inversi, hal ini harus diperhatikan agar tidak mengacaukan maksudnya. Untuk itu, bit-bit data yang akan dikirimkan dapat dibalik dengan cara menggunakan operasi EXOR (exclusive-OR) dengan nilai 0x0B (00001011 biner) sebelum operasi penulisan. Misalkan diinginkan untuk mengirimkan suatu nilai 0x08 (00001000 biner) ke Port Kontrol, maka dapat digunakan potongan program berikut:

#define CONTROL 0x37A ... int X; ... X = 0x08; /* 0000 1000 */ outportb(CONTROL, X^0x0b); /* ~C3=1, C2=0, ~C1=0, ~C0=0 */

Pada contoh di atas, hanya nibble (4-bit) rendah dari X yang berperan. Pada baris terakhir kode program di atas, ~C3, ~C1, dan ~C0 merupakan keluaran dalam bentuk terbalik (logika aktif rendah) dengan menggunakan operasi EXOR sehingga mengatasi inversi secara hardware.

Sebagai perbandingan, jika diinginkan mengeluarkan 1000 pada rendah dan tidak melakukan inversi, hardware akan membalik bit 3, membiarkan bit 2 apa adanya, dan membalik bit 1 dan 0. Hasil yang muncul pada keluaran adalah 0011 yang jauh berbeda dari yang diharapkan. Dengan menggunakan operasi EXOR, 1000 sebenarnya dikirimkan ke port sebagai 0011. Hardware kemudian membalik bit 3, 1 dan 0 dan keluarannya adalah 1000 sesuai dengan yang diharapkan.

Seringkali, ketika menuliskan data, pemrogram hanya tertarik pada beberapa bit dari satu byte data. Untuk membuat bit-bit pada posisi tertentu berlogika 0, maka dapat digunakan operasi AND terhadap bit-bit pada posisi yang bersangkutan dengan 0, sementara bit-bit pada posisi

6

lainnya di-AND-kan dengan 1. Sebaliknya, untuk membuat bit-bit pada posisi tertentu berlogika 1, maka dapat digunakan operasi OR terhadap bit-bit pada posisi yang bersangkutan dengan 1, sementara bit-bit pada posisi lainnya di-OR-kan dengan 0. Potongan program berikut ini menunjukkan bit 2 dibuat tinggi (logika 1) selama 100 ms dan kemudian dibuat rendah (logika 0).

X = X | 0x04; /* bit 2 dibuat tinggi */ outportb(0x378,X); delay(100); X = X & 0xFB; /* bit 2 dibuat rendah */ outportb(0x378,X);

7

BAB IIAPLIKASI 1: MODUL PENGENDALI 12-LED

TujuanSetelah menyelesaikan modul ini mahasiswa diharapkan

mampu membuat rangkaian interface tampilan 12-LED mampu membuat program komputer untuk mengendalikan tampilan 12-LED

Teori DasarAplikasi yang digunakan untuk mengendalikan tampilan 12-LED merupakan aplikasi yang

paling sederhana, karena untuk menghidupkan dan mematikan sebuah LED hanya dibutuhkan tegangan standar TTL dengan komponen tambahan berupa sebuah resistor untuk pembatas arus.

Pada aplikasi yang menggunakan 12 buah LED ini, 8 buah LED dikendalikan oleh Port Data, sedangkan 4 buah LED oleh Port Kontrol.

Bahan dan Peralatan Konektor DB-25 (jantan) 1 buah LED 12 buah Resistor 330 ohm 12 buah Kabel data 13 potong Komputer 1 unit

Rangkaian Interface

Gambar 4 Rangkaian interface pengendali 12-LEDCatatan:

LED 0 sampai LED 7 dihubungkan dengan bit D0 sampai D7 pada Port Data. LED 8 sampai LED 11 dihubungkan masing-masing ke bit ~C0, ~C1, C2, dan ~C3 (dalam

hal ini, bit ~C0, ~C1, dan ~C3 adalah aktif rendah sehingga perlu diperhatikan dalam pemrograman).

8

Prosedur1. Rangkai peralatan sesuai dengan Gambar 4.2. Hidupkan komputer dan jalankan software Visual Basic 6.0.3. Hubungkan konektor DB-25 jantan ke konektor DB-25 betina pada komputer.4. Tulis program sesuai dengan tugas yang diberikan.5. Jalankan program.6. Periksa hasil program terhadap rangkaian interface yang dipasang. Jika tidak sesuai

dengan hasil yang diinginkan, edit kembali program, kemudian ulangi langkah 5 dan 6.

7. Selesai

Tugas1. Buatlah program yang memiliki kemampuan berikut:

dapat menghidupkan 12 buah LED sekaligus dapat mematikan semua LED dapat membuat 12-LED menyala secara bergiliran membentuk lingkaran dapat berkedip-kedip

2. Buatlah program yang dapat menghidupkan dan mematikan satu atau lebih LED yang diinginkan.

3. Buatlah program yang dapat menghidupkan LED secara memantul.

9

BAB IIIAPLIKASI 2: MODUL PENGENDALI

TAMPILAN SEVEN-SEGMENT

TujuanSetelah menyelesaikan modul ini mahasiswa diharapkan

mampu membuat rangkaian interface tampilan seven-segment mampu membuat program komputer untuk mengendalikan tampilan seven-segment.

Teori DasarPada dasarnya, untuk menampilkan angka pada satu buah seven-segment diperlukan sebuah

dekoder, misalnya dekoder 7447 yang mampu mengubah data biner 4-bit (kode BCD) menjadi tampilan digit 0 sampai 9. Setiap segmen (segmen a sampai g) dalam sebuah seven-segment berupa sebuah LED. Jika semua katoda dari masing-masing LED dalam seven-segment dihubungkan secara bersama, maka seven-segment ini disebut common-cathode, sedangkan jika semua anoda dihubungkan, maka seven-segment ini disebut common-anode. Setiap rangkaian LED perlu diberi resistor sebagai pembatas arus untuk melindunginya terhadap arus listrik yang berlebihan. Nilai resistor ditentukan berdasarkan sifat kerja LED. Agar dapat menyala, LED membutuhkan arus antara 5 sampai 30 mA; semakin besar arus diberikan, semakin terang nyala LED. Sewaktu menyala, jatuh tegangan di antara kedua terminal LED secara umum berkisar 1,5 V. Untuk LED tunggal dengan tegangan catu sebesar +5 V dan arus sekitar 20 mA, nilai resistor yang dibutuhkan adalah (5 – 1.5)/0.020 = 175 . Jika menggunakan dekoder 7447, jatuh tegangan pada dekoder itu sendiri harus diperhitungkan. Untuk tampilan seven-segment yang digerakkan 7447, LED pada setiap segmen akan menyala jika keluaran 7447 bertegangan rendah (berlogika 0). Tegangan maksimum keluaran 7447 pada saat berlogika 0 adalah 0,4 V dengan arus 40 mA. Dengan data ini, cukup aman jika tegangan anoda saat LED menyala dianggap 0,2 V dengan arus 20 mA, sehingga jatuh tegangan pada resistor pembatas arus adalah 5 – 1,5 – 0,2 = 3,3 V. Ini berarti bahwa resistor yang dibutuhkan adalah 3,3/0,02 = 165 , yang cukup aman menggunakan resistor standar 168 yang tersedia di pasaran.

Dalam penampilan lebih dari satu digit, jika setiap seven-segment membutuhkan sebuah dekoder 7447, maka rangkaian menjadi kurang efisien karena membutuhkan dekoder yang banyak dan konsumsi daya yang besar. Penampilan dengan menggunakan rangkaian seperti ini disebut penampilan statis. Sebagai contoh, untuk menampilkan 16 digit, dibutuhkan dekoder 16 buah. Jika seven-segment menampilkan angka 8, artinya ketujuh LED menyala dan masing-masing menarik arus 20 mA, maka ketujuh LED itu menarik arus 7 x 20 = 140 mA. Jika ke-16 seven-segment secara bersamaan menampilkan angka 8, maka dibutuhkan arus yang sangat besar, yaitu 16 x 140 mA = 2240 mA = 2,24 A.

Untuk mengatasi kelemahan penampilan statis, digunakan penampilan dinamis. Dalam penampilan ini, penampilan dilakukan bergilir digit demi digit, dan setiap saat hanya salah satu digit tampilan yang diaktifkan dan hanya dalam waktu singkat, sehingga kebutuhan daya setiap saat tidak lebih dari sebesar daya yang dibutuhkan oleh penampil 1 digit. Dengan periode hidup-mati yang cukup cepat, antara 40 sampai 200 kali setiap detik, mata manusia masih melihat seolah-olah LED tersebut menyala secara terus-menerus. Operasi mati-hidup ini juga menurunkan duty cycle (lamanya periode hidup terhadap periode hidup-mati), tidak seperti pada penampilan statis yang hidup terus-menerus (duty cycle 100%). Dalam cara ini digunakan teknik multiplexing, yaitu mengirimkan data angka tampilan secara berurutan ke semua seven-segment, tetapi pada setiap saat hanya satu seven-segment yang dihidupkan.

Aplikasi 2 ini menggunakan bantuan IC decoder/demultiplexer 74154 yang mempunyai 16 keluaran yang pada setiap saat hanya satu keluaran yang aktif (berlogika rendah). Setiap keluaran dekoder ini digunakan untuk memilih seven-segment yang harus diaktifkan. Masukan pemilih 4-bit untuk IC ini dihubungkan ke Port Kontrol pada bit ~C0, ~C1, C2, dan ~C3. Seven-segment yang digunakan adalah jenis common-anode. Data biner untuk menghidupkan segmen-segmen a sampai g pada masing-masing seven-segment tidak dilewatkan melalui dekoder 7447, tetapi langsung ke segmen yang bersangkutan. Data biner ini diambil dari bit D0 sampai D6 (7 bit saja) pada Port

10

Data. Karena tidak menggunakan dekoder 7447, setiap seven-segment tidak hanya dapat menampilkan angka 0 sampai 9, tetapi juga bentuk karakter lain, seperti huruf atau tanda baca tertentu. Rangkaian lengkap untuk aplikasi dapat dilihat pada Gambar 5.

Dengan rangkaian seperti Gambar 5, penampilan dimulai dengan mengirimkan data angka dari Port Data pada bit D0 sampai D7 (masing-masing untuk segmen a sampai g) untuk seven-segment yang anodanya terhubung ke keluaran Y0 dari dekoder melalui transistor. Kemudian dikirim data pemilih digit (4 bit) dari Port Kontrol ke 74154 sehingga keluaran Y0 aktif dan seven-segment yang bersangkutan menampilkan data yang diberikan. Penyalaan digit ini dibiarkan berlangsung sekitar 1 sampai 2 milidetik (atau disesuaikan dengan kecepatan komputer yang digunakan). Kemudian data untuk digit berikutnya dikirim ke D0 sampai D7 diikuti dengan pemberian data pemilih digit untuk mengaktifkan keluaran Y1. Setelah masa hidup dilampaui, kembali dilakukan penampilan digit berikutnya sampai keluaran Y15 diaktifkan dengan cara yang sama. Setelah semua digit ditampilkan secara bergiliran, proses penampilan diulangi lagi untuk digit yang pertama sekali diaktifkan.

Bahan dan Peralatan Konektor DB-25 (jantan) 1 buah Common anode seven segment 16 buah Resistor 330 ohm 7 buah Resistor 1K 16 buah Kabel data 11 potong Komputer 1 unit Catu daya +5V 1 unit

Rangkaian Interface

Gambar 5 Rangkaian interface pengendali seven-segment dengan 74154

Prosedur1. Rangkai peralatan sesuai dengan Gambar 5.

11

2. Hidupkan komputer dan jalankan software Visual Basic 6.0.3. Hubungkan konektor DB-25 jantan ke konektor DB-25 betina pada komputer.4. Tulis program sesuai dengan tugas yang diberikan.5. Jalankan program.6. Periksa hasil program terhadap rangkaian interface yang dipasang. Jika tidak sesuai

dengan hasil yang diinginkan, edit kembali program, kemudian ulangi langkah 5 dan 6.

7. Selesai.

Tugas1. Buatlah program yang memiliki kemampuan berikut:

dapat menampilkan 16 digit konstan dapat menampilkan tanggal sekarang dapat menampilkan jam sekarang

2. Buatlah program yang dapat menampilkan 16 digit yang berkedip-kedip3. Buatlah program yang dapat menampilkan karakter berjalan.4. Buatlah program untuk menampilkan counter

.

12

BAB IVAPLIKASI 3: MODUL PENGENDALI LAMPU PIJAR

TujuanSetelah menyelesaikan modul ini mahasiswa diharapkan

mampu membuat rangkaian interface pengendali lampu pijar. mampu membuat program komputer untuk mengendalikan lampu pijar.

Teori Dasar

Untuk mengendalikan peralatan listrik rumah tangga, misalnya lampu pijar, kipas angin, dan sebagainya, yang membutuhkan catu daya yang berbeda dengan tingkat tegangan TTL, maka perlu dibuat rangkaian driver untuk peralatan yang bersangkutan. Untuk lampu pijar, misalnya, dapat digunakan relay yang diaktifkan dengan transistor. Rangkaian untuk aplikasi ini dapat dilihat pada Gambar 6.

Bahan dan Peralatan Konektor DB-25 (jantan) 1 buah Lampu pijar 4 buah Resistor 1K 16 buah Kabel data 4 potong Relay 4 buah Dioda 4 buah Transistor NPN 4 buah Komputer 1 unit Catu daya +12V 1 unit

Rangkaian Interface

Gambar 6 Rangkaian interface pengendali lampu pijar

13

Prosedur1. Rangkai peralatan sesuai dengan Gambar 6.2. Hidupkan komputer dan jalankan software Visual Basic 6.0.3. Hubungkan konektor DB-25 jantan ke konektor DB-25 betina pada komputer.4. Tulis program sesuai dengan tugas yang diberikan.5. Jalankan program.6. Periksa hasil program terhadap rangkaian interface yang dipasang. Jika tidak sesuai

dengan hasil yang diinginkan, edit kembali program, kemudian ulangi langkah 5 dan 6.

7. Selesai.

Tugas1. Buatlah program yang memiliki kemampuan berikut:

dapat menghidupkan semua lampu dapat mematikan semua lampu dapat menghidupkan lampu secara bergiliran

2. Buatlah program yang dapat menghidupkan semua lampu secara berkedip-kedip3. Buatlah program yang dapat menghidupkan dan mematikan satu atau beberapa

lampu yang diinginkan.

14

CWW

CCWW

BAB VAPLIKASI 4: MODUL PENGENDALI MOTOR STEPPER

TujuanSetelah menyelesaikan modul ini mahasiswa diharapkan

mampu membuat rangkaian interface pengendali motor stepper. mampu membuat program komputer untuk mengendalikan motor stepper.

Teori Dasar

Motor stepper merupakan salah satu jenis motor yang dapat digunakan untuk memindahkan sebuah benda (beban) dengan jarak perpindahan yang kecil. Berbeda halnya dengan motor jenis lain yang bergerak dengan putaran yang kontinyu (mulus), motor stepper bergerak dengan putaran yang kaku. Motor stepper bergerak dari posisi tertentu ke posisi berikutnya seperti gerak melangkah (step). Motor stepper banyak digunakan untuk berbagai keperluan, seperti pada pinter Epson LX-800, atau Epson LQ-2170 atau printer lain yang sejenis (dot-matrix printer). Motor ini juga ditemukan pada floppy disk drive, harddisk drive, plotter, dan lain-lain.

Motor stepper yang umum digunakan mempunyai jangkauan langkah (step) berputar antara 0,9º sampai dengan 30º. Motor-motor itu adalah motor stepper dua atau empat fase. Secara teoritis, sebuah motor stepper berukuran kecil dapat digerakkan secara langsung oleh mikroprosesor. Dalam kenyataannya, arus dan tegangan yang dapat dikeluarkan oleh mikroprosersor terlalu kecil untuk menggerakkan sebuah motor stepper kecil. Sebagai perbandingan, gerbang-gerbang tipe TTL dalam mikroprosesor hanya mampu mengeluarkan arus dalam orde mA atau tegangan antara 2 sampai 2,5 volt. Sementara itu, untuk menggerakkan motor stepper dibutuhkan arus yang cukup besar (dalam orde ampere) dengan tegangan berkisar 5 – 24 V. Untuk mengatasi masalah tersebut, dibutuhkan sebuah perangkat tambahan yang dapat memenuhi kebutuhan arus dan tegangan yang besar itu, yaitu dengan menambahkan suatu rangkaian transistor yang disebut pasangan Darlington. Rangkaian aplikasi untuk pengendalian motor stepper ini dapat dilihat seperti pada Gambar 7.

Sebuah motor stepper digerakkan dari posisi yang satu ke posisi yang lain berikutnya dengan mengubah arus yang terhubung ke masing-masing fase. Pengubahan arus tersebut mempunyai pola/kombinasi tertentu. Berikut ini adalah cara untuk menggerakkan motor stepper 4-fase.

Tabel 2 kombinasi arus fase motor stepperuntuk langkah penuh (full-step)

StepFase

D3 D2 D1 D0 1 0 0 1 12 1 0 0 13 1 1 0 04 0 1 1 01 0 0 1 1

15

CWW

CCWW

Tabel 3 kombinasi arus fase motor stepperuntuk langkah paruh (half-step)

StepFase

D3 D2 D1 D01 0 0 1 12 0 0 0 13 1 0 0 14 1 0 0 05 1 1 0 06 0 1 0 07 0 1 1 08 0 0 1 01 0 0 1 1

Pada Gambar 7, misalkan D0 dan D1 diberi arus (dalam keadaan ON). Bila arus pada D1 diputus (OFF) dan D3 diberi arus (ON), motor stepper akan bergerak satu langkah searah dengan putaran jarum jam. Bila arus pada D1 ditutup dan D2 diberi arus, motor stepper bergerak lagi satu langkah searah putaran jaruim jam. Demikian seterusnya, motor stepper dapat digerakkan langkah per langkah searah putaran jam.

Pengubahan kombinasi arus fase adalah untuk menggerakkan motor stepper dengan langkah penuh (full-step). Gerakan motor dapat diperhalus dengan menggerakkannya setengah-setengah langkah. Hal ini dilakukan dengan mengubah arus fase motor sesuai dengan urutan yang ditunjukkan oleh Tabel 3. Urutan gerak dari langkah pertama, kedua, ketiga, dan seterusnya akan menghasilkan gerakan separuh langkah searah jarum jam; sebaliknya akan menghasilkan gerakan yang berlawanan dengan arah putaran jam.

Bahan dan Peralatan Konektor DB-25 (jantan) 1 buah Motor stepper 1 buah Resistor 330 ohm 4 buah LED 4 buah Kabel data 4 potong Dioda 1N4000 4 buah Transistor 4 buah IC 74LS06 1 buah Komputer 1 unit Catu daya +12V 1 unit

16

Rangkaian Interface

Gambar 7 Rangkaian pengendali motor stepper

Prosedur1. Rangkai peralatan sesuai dengan Gambar 7.2. Hidupkan komputer dan jalankan software Visual Basic 6.0.3. Hubungkan konektor DB-25 jantan ke konektor DB-25 betina pada komputer.4. Tulis program sesuai dengan tugas yang diberikan.5. Jalankan program.6. Periksa hasil program terhadap rangkaian interface yang dipasang. Jika tidak sesuai

dengan hasil yang diinginkan, edit kembali program, kemudian ulangi langkah 5 dan 6.

7. Selesai.

Tugas1. Buatlah program untuk mengendalikan motor stepper sehingga motor stepper

dapat berputar CW 1 kali dapat berputar CCW 1 kali dapat berputar CW n kali dapat berputar CCW n kali dapat berputar CW menurut besar sudut yang diinginkan dapat berputar CCW menurut besar sudut yang diinginkan

2. Buatlah program sehingga motor stepper dapat berputar dan berhenti secara interaktif menurut perintah yang diinginkan.

17

BAB VIAPLIKASI 5: MODUL PENGENDALI TRAFFIC LIGHT

TujuanSetelah menyelesaikan modul ini mahasiswa diharapkan

mampu membuat rangkaian interface pengendali traffic light mampu membuat program komputer untuk mengendalikan traffic light.

Teori Dasar

Komponen elektronik yang digunakan pada Modul 5 ini tepat sama dengan Modul 1 (Modul Pengendali 12-LED) dan dihubungkan tepat seperti pada Modul 1, tetapi LED-LED disusun sedemikian rupa sehingga merupakan miniatur traffic light yang terdapat pada simpang empat. Setiap simpang empat pada aplikasi ini dilengkapi dengan tiga buah LED yang masing-masing berwarna merah, kuning, dan hijau.

Gambar 8 Tata letak LED pada modul

Waktu menyala dan padam setiap LED diatur sehingga pada setiap satu siklus, hanya satu jalur jalan raya yang dibolehkan melewatkan kendaraan. Pengaturan waktu ini dapat dirancang dengan menggunakan tabel berikut ini.

Tabel 4 Urutan penyalaan LED untuk miniatur traffic light pada simpang empat

Urutan Selatan Timur Utara BaratM K H M K H M K H M K H

0 - - 5 5 - - 5 - - 5 - -1 - 1 - 1 - - 1 - - 1 - -2 5 - - - - 5 5 - - 5 - -3 1 - - - 1 - 1 - - 1 - -4 5 - - 5 - - - - 5 5 - -5 1 - - 1 - - - 1 - 1 - -6 5 - - 5 - - 5 - - - - 57 1 - - 1 - - 1 - - - 1 -0 - - 5 5 - - 5 - - 5 - -

Keterangan:

18

M = LED merah 5 = waktu menyala LED (5 detik)K = LED kuning 1 = waktu menyala LED (1 detik)H = LED hijau - = padam

Bahan dan Peralatan Konektor DB-25 (jantan) 1 buah LED merah 4 buah LED kuning 4 buah LED hijau 4 buah Resistor 330 ohm 12 buah Kabel data 13 potong Tripleks 30x30 cm 1 keping Komputer 1 unit

Rangkaian Interface

Gambar 9 Rangkaian interface pengendali traffic light

Prosedur1. Rangkai peralatan sesuai dengan Gambar 9.2. Hidupkan komputer dan jalankan software Visual Basic 6.0.3. Hubungkan konektor DB-25 jantan ke konektor DB-25 betina pada komputer.4. Tulis program sesuai dengan tugas yang diberikan.5. Jalankan program.6. Periksa hasil program terhadap rangkaian interface yang dipasang. Jika tidak sesuai

dengan hasil yang diinginkan, edit kembali program, kemudian ulangi langkah 5 dan 6.

7. Selesai.

Tugas1. Buatlah program untuk mengendalikan traffic light dengan urutan penyalaan LED

sesuai dengan Tabel 4.

19

2. Buatlah program untuk mengendalikan traffic light yang akan membuat LED kuning pada semua sisi simpang empat berkedip terus-menerus selama jam di komputer menunjukkan pukul 21:00 sampai 05:00.

20

BAB VIIAPLIKASI 6: MODUL PENDETEKSIAN CAHAYA

TujuanSetelah menyelesaikan modul ini mahasiswa diharapkan

mampu membuat rangkaian interface pendeteksi cahaya mampu membuat program komputer untuk mendeteksi cahaya.

Teori Dasar

Rangkaian untuk Aplikasi 6 menggunakan LDR untuk mendeteksi cahaya. Keluaran dari pendeteksi cahaya dihubungkan ke port status pada port paralel. Cahaya yang jatuh pada LDR menyebabkan transistor on atau off sehingga keadaan kolektor dapat berlogika 0 atau 1. Kolektor transistor ini dihubungkan ke port status pada bit ~S7. Keadaan ~S7 ini selanjutnya digunakan sebagai pengendali empat buah LED.

Bahan dan Peralatan Konektor DB-25 (jantan) 1 buah LED 4 buah Resistor 330 ohm 4 buah Resistor 100 ohm 1 buah Trimpot 1 buah Transistor NPN 1 buah LDR 1 buah Kabel data 5 potong Komputer 1 unit Catu daya +5V 1 unit

Rangkaian Interface

Gambar 10 Rangkaian interface pendeteksi cahaya dengan LDR

21

Prosedur1. Rangkai peralatan sesuai dengan Gambar 10.2. Hidupkan komputer dan jalankan software Visual Basic 6.0.3. Hubungkan konektor DB-25 jantan ke konektor DB-25 betina pada komputer.4. Tulis program sesuai dengan tugas yang diberikan.5. Jalankan program.6. Periksa hasil program terhadap rangkaian interface yang dipasang. Jika tidak sesuai

dengan hasil yang diinginkan, edit kembali program, kemudian ulangi langkah 5 dan 6.

7. Selesai.

Tugas1. Buatlah program untuk mendeteksi cahaya dengan ketentuan bahwa jika cahaya

terang, matikan seluruh LED; sebaliknya, jika cahaya gelap, buat semua LED berkedip-kedip.

2. Buatlah program pendeteksi cahaya seperti di atas, tetapi dengan tambahan bahwa jika cahaya gelap, di samping semua LED berkedip, juga buat speaker komputer berbunyi seperti sirine.

22

DAFTAR PUSTAKA

1. Anderson, Peter H., Use of a PC Printer Port for Control and Data Acquisition, Internet Resource.

2. Majerus, Philippe, LPT (Parallel) Port, Internet Resource.3. Stewart, Zhahai, Interfacing the IBM PC Parallel Printer Port, Internet Resource.4. Putra, Agfianto Eko, Teknik Antarmuka Komputer: Konsep dan Aplikasi, Graha

Ilmu, Yogyakarta, 2002.5. Prasetia, Retna, dan Catur Edi Widodo, Teori dan Praktek Interfacing Port Paralel

dan Port Serial Komputer dengan Visual Basic 6.0, Penerbit Andi, Yogyakarta, 2004.

6. Kadir, Abdul, Pemrograman Lanjutan Turbo C, Penerbit Andi, Yogyakarta, 1993.7. Link, Wolfgang, Pengukuran, Pengendalian, dan Pengaturan dengan PC: Praktek

Otomasi dengan Pengaturan Numerik, Elex Media Komputindo, Jakarta, 1995.8. Ibrahim, K.F., Teknik Digital (Terjemahan), Penerbit Andi, Yogyakarta, 1998.9. Tarigan, Pernantin, Pemrograman Assembly untuk IBM PC dan Kompatibelnya,

USU Press, Medan, 1994.10. Hall, Douglas V., Microprocessors and Interfacing, McGraw-Hill, Singapore, 1986.11. Simanjuntak, Henri S.V., Dasar-dasar Mikroprosesor, Kanisius, Yogyakarta, 2001.12. Rizkiawan, Rizal, Tutorial Perancangan Hardware, Elex Media Komputindo,

Jakarta, 1997.

23

LAMPIRAN 1LISTING PROGRAM APLIKASI

DENGAN TURBO C

/* ====================== Program: LED-01.C LED berjalan melingkar Cara ke-1 ====================== */#include <stdio.h>#define DATA 0x378#define CONTROL DATA+2main(){ unsigned char i; int j[]={523,587,659,698,784,880,988,1047,1175,1319,1397,1568}; clrscr(); do{ for(i=0;i<8;i++){

outportb(DATA,0x01<<i); sound(j[i]); delay(10000);

} outportb(DATA,0x00); for(i=0;i<4;i++){

outportb(CONTROL,(0x01<<i)^0x0B); sound(j[i+8]); delay(10000);

} outportb(CONTROL,0x00^0x0B); }while(!kbhit()); getch(); outportb(DATA,0x00); outportb(CONTROL,0x00^0x0B); nosound();}

/* ****************************** Program: LED-01A.C LED berjalan melingkar Cara ke-2 *******************************/

#include <stdio.h>#include <dos.h>

#define Data 0x378#define Control Data+2

main(){ unsigned char PD[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char PC[] = {0x0A,0x09,0x0F,0x03}; char i;

clrscr(); outportb(Data,0x00); outportb(Control,0x0B); do { for(i=0;i<8;i++) {

outportb(Data,PD[i]); delay(8000);

} outportb(Data,0x00); delay(8000); for(i=0;i<4;i++) {

24

outportb(Control,PC[i]); delay(8000);

} outportb(Control,0x0B); delay(8000); } while(!kbhit());}

/* ============================ Program: LED-02.C LED berjalan secara memantul Cara ke-1 ============================ */#include <stdio.h>#include <conio.h>#define DATA 0x378#define CONTROL DATA+2#define DELAY 3000main(){ unsigned char i;

clrscr(); textcolor(YELLOW); cputs("LED berjalan secara memantul"); do{ for(i=0;i<8;i++){

outportb(DATA,0x01<<i); delay(DELAY);

} outportb(DATA,0x00);

for(i=0;i<4;i++){ outportb(CONTROL,(0x01<<i)^0x0B); delay(DELAY);

} outportb(CONTROL,0x00^0x0B); sound(1047);delay(2000);nosound();

for(i=1;i<4;i++){ outportb(CONTROL,(0x08>>i)^0x0B); delay(DELAY);

} outportb(CONTROL,0x00^0x0B);

for(i=0;i<7;i++){ outportb(DATA,0x80>>i); delay(DELAY);

} outportb(DATA,0x00); sound(523);delay(2000);nosound();

}while(!kbhit()); getch(); outportb(DATA,0x00); outportb(CONTROL,0x00^0x0B);}

/* ************************************* Program: LED-02A.C LED berjalan secara memantul Cara ke-2 **************************************/

#include <stdio.h>#include <dos.h>

25

#define Data 0x378#define Control Data+2

main(){ unsigned char PD[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char PC[] = {0x0A,0x09,0x0F,0x03}; char i; int Tunda=5000;

clrscr(); outportb(Data,0x00); outportb(Control,0x0B); do { for(i=0;i<8;i++) {

outportb(Data,PD[i]); /*sound(PD[i]*500);*/ delay(Tunda);

} outportb(Data,0x00); for(i=0;i<4;i++) {

outportb(Control,PC[i]); delay(Tunda);

} outportb(Control,0x0B);

for(i=3;i>=0;i--) { outportb(Control,PC[i]); delay(Tunda);

} outportb(Control,0x0B); for(i=6;i>=1;i--) {

outportb(Data,PD[i]); /*sound(PD[i]*500);*/ delay(Tunda);

} outportb(Data,0x00);

} while(!kbhit()); nosound();}

#include <stdio.h>#include <math.h>main(){ char Pil,i,Tombol; clrscr(); do{ clrscr(); printf("######### MENU #########\n"); printf("1. Menghidupkan semua LED\n"); printf("2. Mematikan semua LED\n"); printf("3. Menghidupkan LED berdasarkan tombol fungsi\n"); printf("4. Keluar\n\n\n"); printf("Pilih menu (1-4): "); Pil=getch(); switch(Pil){ case '1': clrscr();

printf("Sedang menghidupkan semua LED...\n"); gotoxy(1,25);printf("Tekan sembarang tombol..."); outportb(0x378,0xFF); outportb(0x37a,0x04); getch();break;

case '2': clrscr();

printf("Sedang mematikan semua LED...\n");

26

gotoxy(1,25);printf("Tekan sembarang tombol..."); outportb(0x378,0x00); outportb(0x37a,~0x04); getch();break;

case '3': do{

clrscr(); printf("Tekan tombol F1-F12\n\n"); Tombol=getch(); i=Tombol-0x85; if((i==0)||(i==1)){ outportb(0x37a,inportb(0x37a)^(i==0?0x04:0x08));

gotoxy(1,25);printf("Tekan tombol Esc untuk ke menu utama...");getch();}i=Tombol-0x3b;if((i>=0)&&(i<=9)){ if(i<=7) outportb(0x378,inportb(0x378)^(char)pow(2,i));else outportb(0x37a,inportb(0x37a)^(i==8?0x01:0x02)); gotoxy(1,25);printf("Tekan tombol Esc untuk ke menu utama..."); getch();}

}while(Tombol!=0x1b);break; } }while(Pil!='4');}

/* ========================================== Program: 7SEG-01.C Menampilkan angka konstan 0123456789AbCdEF ========================================== */#include <stdio.h>#define Data 0x378#define Control Data+2main()

{ unsigned char Angka[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e};

unsigned char i=0;

clrscr(); outportb(Data,0xff); do{ outportb(Data,Angka[i]); outportb(Control,(15-i)^0x0b); delay(200); outportb(Data,0xff); i==15?i=0:i++; }while(!kbhit()); outportb(Data,0xFF); getch();}

/* =============================== Program: 7SEG-02.C Menampilkan jam sistem komputer =============================== */#include <stdio.h>#include <dos.h>#define Data 0x378#define Control Data+2

main(){ unsigned char Angka[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char i,a[16],jam,menit,detik,s100; struct time *waktu;

27

clrscr();

outportb(Data,0xff); do{ gettime(waktu); gotoxy(33,13); printf("%02d:%02d:%02d:%02d POLI",waktu->ti_hour,

waktu->ti_min,waktu->ti_sec,waktu->ti_hund); jam=waktu->ti_hour; menit=waktu->ti_min; detik=waktu->ti_sec; s100=waktu->ti_hund; a[0]=jam/10; a[1]=jam%10; a[2]=0xbf; a[3]=menit/10; a[4]=menit%10; a[5]=0xbf; a[6]=detik/10; a[7]=detik%10; a[8]=0xbf; a[9]=s100/10; a[10]=s100%10; a[11]=0xff; a[12]=0x8c; a[13]=0xc0; a[14]=0xc7; a[15]=0xcf; for(i=0;i<16;i++){

if((i==2)||(i==5)||(i==8)||(i>10)) outportb(Data,a[i]); else outportb(Data,Angka[a[i]]); outportb(Control,(15-i)^0x0b); delay(100); outportb(Data,0xff);

} }while(!kbhit()); outportb(Data,0xFF); getch();}

/* ================================= Program: 7SEG-03.C Menampilkan teks berjalan ================================= */#include <stdio.h>#include <dos.h>#define Data 0x378#define Control Data+2

main(){ unsigned char Huruf[] = {0x8c,0xa3,0xc7,0xcf,0x87,0x86,0x8a,0xc8,0xcf,0x8a,0xff}; unsigned char i,j;

clrscr();

outportb(Data,0xff); do{ for(i=0;i<16;i++){

for(j=0;j<11;j++) { outportb(Data,Huruf[j]); outportb(Control,((i+10-j)%16)^0x0b); delay(100); outportb(Data,0xff); } delay(10000);

28

} }while(!kbhit()); outportb(Data,0xFF); getch();}

#include <stdio.h>#include <dos.h>#define Data 0x378#define Control Data+2

main(){ unsigned char Angka[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char i,a[10],tgl,bln; int thn; struct time *tanggal;

clrscr();

outportb(Data,0xff); getdate(tanggal); gotoxy(35,13); tgl=tanggal->da_day; bln=tanggal->da_mon; thn=tanggal->da_year; printf("%02d-%02d-%04d",tgl,bln,thn); a[0]=tgl/10; a[1]=tgl%10; a[2]=0xbf; a[3]=bln/10; a[4]=bln%10; a[5]=0xbf; a[6]=thn/1000; a[7]=thn%1000/100; a[8]=thn%1000%100/10; a[9]=thn%1000%100%10; do{

for(i=0;i<10;i++){ if((i==2)||(i==5)) outportb(Data,a[i]); else outportb(Data,Angka[a[i]]); outportb(Control,(15-i)^0x0b); delay(100); outportb(Data,0xff);

} }while(!kbhit()); outportb(Data,0xFF); getch();}

/* ========================================== Program: 7SEG-05.C Menampilkan counter 0000000 sampai 1000000 ========================================== */#include <stdio.h>#include <dos.h>#define Data 0x378#define Control Data+2

main(){ unsigned char Angka[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char i,a[7]; long int t=0;

clrscr();

29

outportb(Data,0xff); do{ do{ gotoxy(40,13); printf("%07d",t); a[0]=(unsigned char)t/1000000; a[1]=t%1000000/100000; a[2]=t%1000000%100000/10000; a[3]=t%1000000%100000%10000/1000; a[4]=t%1000000%100000%10000%1000/100; a[5]=t%1000000%100000%10000%1000%100/10; a[6]=t%1000000%100000%10000%1000%100%10; for(i=0;i<7;i++){

outportb(Data,Angka[a[i]]); outportb(Control,(15-i)^0x0b); delay(20000); outportb(Data,0xff);

} t==10000000?t=0:t++; }while(!kbhit()); }while(!kbhit()); outportb(Data,0xFF); getch();}

/* ================================== Program: PIJAR-01.C Menghidupkan lampu pijar melingkar ================================== */#include <stdio.h>#define DATA 0x378main(){ char i;

clrscr(); do{for(i=0;i<4;i++){ outportb(DATA,0x01<<i); delay(40000); delay(40000); delay(40000); } }while(!kbhit()); getch(); outportb(DATA,0x00);}

/* ==================================== Program: PIJAR-02.C Lampu pijar berjalan secara memantul ==================================== */#include <stdio.h>#include <conio.h>#define DATA 0x378main(){ unsigned char i; unsigned char PD[]={0x01,0x02,0x04,0x08,0x04,0x02}; clrscr(); textcolor(YELLOW); cputs("Lampu pijar berjalan secara memantul"); do{ for(i=0;i<6;i++){

outportb(DATA,PD[i]); delay(40000);

}

30

}while(!kbhit()); getch(); outportb(DATA,0x00);}

/* ==================================== Program: PIJAR-03.C Menghidupkan lampu pijar dengan menu pilihan ==================================== */

#include <stdio.h>#include <math.h>main(){ char Pil,i,Tombol; clrscr(); do{ clrscr(); printf("######### MENU #########\n"); printf("1. Menghidupkan semua lampu pijar\n"); printf("2. Mematikan semua lampu pijar\n"); printf("3. Menghidupkan lampu pijar berdasarkan tombol fungsi\n"); printf("4. Keluar\n\n\n"); printf("Pilih menu (1-4): "); Pil=getch(); switch(Pil){ case '1': clrscr();

printf("Sedang menghidupkan semua lampu pijar...\n"); gotoxy(1,25);printf("Tekan sembarang tombol..."); outportb(0x378,0xFF); outportb(0x37a,0x04); getch();break;

case '2': clrscr(); printf("Sedang mematikan semua lampu pijar...\n");

gotoxy(1,25);printf("Tekan sembarang tombol..."); outportb(0x378,0x00); outportb(0x37a,~0x04); getch();break;

case '3': do{ clrscr(); printf("Tekan tombol F1-F12\n\n"); Tombol=getch(); i=Tombol-0x3b; if((i>=0)&&(i<=3))

outportb(0x378,inportb(0x378)^(char)pow(2,i)); gotoxy(1,25);printf("Tekan tombol Esc untuk ke menu utama..."); }while(Tombol!=0x1b);break;

} }while(Pil!='4');}

/* ========================== Program: STEPPER.C Pengendalian motor stepper ========================== */

#include <stdio.h>

void Putar_sudut(int arah,int sudut){ unsigned char Data[]={9,12,6,3},Putar[4]; unsigned char i,j; if(arah==0) for(j=0;j<4;j++)

Putar[j]=Data[j]; else for(j=0;j<4;j++)

31

Putar[3-j]=Data[j];

for(i=0;i<(int)(50*sudut/360);i++) for(j=0;j<4;j++){

outportb(0x378,Putar[j]); delay(200);

}}

void Putar_biasa(int arah,float x){ unsigned char Data[]={9,12,6,3},Putar[4]; unsigned char i,j; if(arah==0) for(j=0;j<4;j++)

Putar[j]=Data[j]; else for(j=0;j<4;j++)

Putar[3-j]=Data[j];

for(i=0;i<(int)(50*x);i++) for(j=0;j<4;j++){

outportb(0x378,Putar[j]); sound((int)x*1000);delay(200);nosound();

}}

main(){ char Pil; float x; int sudut; do{ clrscr(); printf("*** Pengendalian motor stepper ***\n\n"); printf("Pilihan:\n"); printf("1. Putar CW 1 kali\n"); printf("2. Putar CCW 1 kali\n"); printf("3. Putar CW n kali\n"); printf("4. Putar CCW n kali\n"); printf("5. Putar CW menurut sudut\n"); printf("6. Putar CCW menurut sudut\n"); printf("7. Selesai\n"); printf("Pilihan Anda: "); Pil=getch(); switch(Pil){ case '1': Putar_biasa(0,1);break; case '2': Putar_biasa(1,1);break; case '3': clrscr();

printf("Berapa putaran: :"); scanf("%f",&x); Putar_biasa(0,x);break;

case '4': clrscr(); printf("Berapa putaran: "); scanf("%f",&x); Putar_biasa(1,x);break;

case '5': clrscr(); printf("Sudut putar: "); scanf("%d",&sudut); Putar_sudut(0,sudut);break;

case '6': clrscr(); printf("Sudut putar: "); scanf("%d",&sudut); Putar_sudut(1,sudut);break;

default:; } }while(Pil!='7');

}

32

/* ********************************************** Program TRFLGHT.C Pengendalian Traffic Light pada Simpang Empat ***********************************************/

#include <stdio.h>#include <dos.h>

#define Data 0x378 /* Alamat port Data */#define Control Data+2 /* Alamat port Control */

main(){ unsigned char PD[] = {0x4C,0x4A,0x61,0x51,0x09,0x89,0x49,0x49}; unsigned char PC[] = {0x09,0x09,0x09,0x09,0x08,0x09,0x03,0x0F}; char i=0;

clrscr(); outportb(Data,0x00); /* matikan semua LED0 - LED7 */ outportb(Control,0x0B); /* matikan semua LED8 - LED11 */ do { outportb(Data,PD[i]); /* hidupkan LED menurut pola urutan */ outportb(Control,PC[i]); /* hidupkan LED menurut pola urutan */ i%2==0 ? delay(5000) : delay(1000); /* atur lama nyala LED */ i==7 ? i=0 : i++; /* ulang untuk pola berikutnya */ } while(!kbhit()); /* ulang terus selama tidak ada

penekanan tombol */ outportb(Data,0x00); /* matikan semua LED */}

/* ************************************** Program LDR.C Detektor cahaya dengan LDR ***************************************/#include <stdio.h>#include <dos.h>

#define Data 0x378 /* Alamat port Data */#define Status Data+1 /* Alamat port Status */#define Control Data+2 /* Alamat port Control */

void Berkedip(){ unsigned char i;

i=inportb(Data); /* baca keadaan LED */ if(i==0x00) /* jika semua LED mati */ outportb(Data,0x0F); /* hidupkan semua LED; */ else /* jika tidak, */ outportb(Data,0x00); /* matikan semua LED */}

main(){ char i=0;

clrscr(); outportb(Control,0x00); /* memberikan Vcc pada transistor */ outportb(Data,0x00); /* matikan semua LED */ do { i=inportb(Status); /* baca port status */ if((i^0x80)&0x80!=0) /* jika PS7=1, maka */

outportb(Data,0x0F); /* hidupkan semua LED */ else /* kalau tidak, */

Berkedip(); /* buat LED berkedip */

33

delay(1000); /* tunda */ } while(!kbhit()); /* ulang terus selama tidak ada

penekanan tombol */ outportb(Data,0x00); /* matikan semua LED */}

34

LAMPIRAN 2LISTING PROGRAM APLIKASI

DENGAN VISUAL BASIC

‘ =================‘ Program: Demo LED‘ =================

Private Declare Sub PortOut Lib "IO.DLL" (ByVal PortNo As Integer, ByVal Data As Byte)Private Declare Function PortIn Lib "IO.DLL" (ByVal PortNo As Integer) As BytePrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Check1_Click(Index As Integer)Dim X As ByteX = 2 ^ (Index - 9)If Index < 9 Then If Check1(Index).Value = 1 Then PortOut &H378, PortIn(&H378) Or (2 ^ (Index - 1)) Shape1(Index).BackColor = &HFF Shape1(Index).BackStyle = 1 Else PortOut &H378, PortIn(&H378) Xor (2 ^ (Index - 1)) Shape1(Index).BackColor = &H80000005 Shape1(Index).BackStyle = 0 End IfElse If Check1(Index).Value = 1 Then If Index = 11 Then PortOut &H37A, PortIn(&H37A) Or X ' ?? Else PortOut &H37A, PortIn(&H37A) Xor X ' ?? End If Shape1(Index).BackColor = &HFF Shape1(Index).BackStyle = 1 Else If Index = 11 Then PortOut &H37A, PortIn(&H37A) Xor X ' ?? Else PortOut &H37A, PortIn(&H37A) Or X ' ?? End If Shape1(Index).BackColor = &H80000005 Shape1(Index).BackStyle = 0 End IfEnd IfEnd Sub

Private Sub Command1_Click() 'Hidupkan semua LED PortOut &H378, &HFF PortOut &H37A, &H4End Sub

Private Sub Command2_Click() 'Matikan semua LED PortOut &H378, &H0 PortOut &H37A, &HBEnd Sub

Private Sub Command3_Click() 'Hidupkan LED melingkar Do DoEvents For i = 0 To 7 DoEvents PortOut &H378, 2 ^ i Sleep 100 Next

35

PortOut &H378, 0 For i = 0 To 3 DoEvents PortOut &H37A, (2 ^ i) Xor &HB Sleep 100 Next PortOut &H37A, &HB Loop PortOut &H378, 0 PortOut &H37A, &HBEnd Sub

Private Sub Command4_Click() 'Hidupkan LED memantul Do DoEvents For i = 0 To 7 DoEvents PortOut &H378, 2 ^ i Sleep 100 Next PortOut &H378, 0 For i = 0 To 3 DoEvents PortOut &H37A, (2 ^ i) Xor &HB Sleep 100 Next PortOut &H37A, &HB For i = 3 To 0 Step -1 DoEvents PortOut &H37A, (2 ^ i) Xor &HB Sleep 100 Next PortOut &H37A, &HB For i = 7 To 0 Step -1 DoEvents PortOut &H378, 2 ^ i Sleep 100 Next PortOut &H378, 0 Loop PortOut &H378, 0 PortOut &H37A, &HBEnd Sub

Private Sub Command5_Click() 'LED berkedip terusDo DoEvents PortOut &H378, &HFF PortOut &H37A, &H4 Sleep 200 PortOut &H378, 0 PortOut &H37A, &HB Sleep 200LoopEnd Sub

‘ ===========================‘ Program: Demo Seven-Segment‘ ===========================

Private Declare Sub PortOut Lib "IO.DLL" (ByVal PortNo As Integer, ByVal Data As Byte)Private Declare Function PortIn Lib "IO.DLL" (ByVal PortNo As Integer) As Byte

36

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Dim Angka(16) As ByteDim Data As Integer, Control As IntegerOption Explicit

Public Sub Command1_Click() Dim i As Byte i = 1 Data = &H378 Control = &H37A Angka(1) = &HC0: Angka(2) = &HF9: Angka(3) = &HA4: Angka(4) = &HB0 Angka(5) = &H99: Angka(6) = &H92: Angka(7) = &H82: Angka(8) = &HF8 Angka(9) = &H80: Angka(10) = &H90: Angka(11) = &H88: Angka(12) = &H83 Angka(13) = &HC6: Angka(14) = &HA1: Angka(15) = &H86: Angka(16) = &H8E

Do DoEvents PortOut Data, Angka(i) PortOut Control, (16 - i) Xor &HB Sleep 1 'PortOut Data, &HFF If i = 16 Then i = 1 Else i = i + 1 Loop PortOut Data, &HFFEnd Sub

Private Sub Command2_Click() Dim i As Byte Data = &H378 Control = &H37A Angka(1) = &HC0: Angka(2) = &HF9: Angka(3) = &HA4: Angka(4) = &HB0 Angka(5) = &H99: Angka(6) = &H92: Angka(7) = &H82: Angka(8) = &HF8 Angka(9) = &H80: Angka(10) = &H90: Angka(11) = &H88: Angka(12) = &H83 Angka(13) = &HC6: Angka(14) = &HA1: Angka(15) = &H86: Angka(16) = &H8E Dim A(16) As Byte Dim jam, menit, detik Dim Sekarang Do DoEvents jam = Hour(Now) menit = Minute(Now) detik = Second(Now) Text1.Enabled = True Text1.Text = CStr(Time) & " WIB" Text2.Enabled = False Text3.Enabled = False A(1) = jam \ 10 A(2) = jam Mod 10 A(3) = &HBF A(4) = menit \ 10 A(5) = menit Mod 10 A(6) = &HBF A(7) = detik \ 10 A(8) = detik Mod 10 A(9) = &HFF A(10) = &HFF A(11) = &HFF A(12) = &HFF A(13) = &H8C A(14) = &HC0 A(15) = &HC7 A(16) = &HCF For i = 1 To 16 If i = 3 Or i = 6 Or i >= 9 Then PortOut Data, A(i) Else PortOut Data, Angka(A(i) + 1)

37

End If PortOut Control, (16 - i) Xor &HB Sleep 1 'PortOut Data, &HFF Next LoopEnd Sub

Private Sub Command3_Click() Dim Huruf(11) As Byte Huruf(0) = &H8C: Huruf(1) = &HC0: Huruf(2) = &HC7: Huruf(3) = &HCF: Huruf(4) = &H87: Huruf(5) = &H86 Huruf(6) = &H8A: Huruf(7) = &HC8: Huruf(8) = &HCF: Huruf(9) = &H8A: Huruf(10) = &HFF Dim i, j Data = &H378 Control = &H37A Do DoEvents For i = 0 To 15 For j = 0 To 10 PortOut Data, Huruf(j) PortOut Control, ((i + 10 - j) Mod 16) Xor &HB Sleep 1 Next j Sleep 10 Next i LoopEnd Sub

Private Sub Command4_Click() Dim i As Byte Data = &H378 Control = &H37A Angka(0) = &HC0: Angka(1) = &HF9: Angka(2) = &HA4: Angka(3) = &HB0 Angka(4) = &H99: Angka(5) = &H92: Angka(6) = &H82: Angka(7) = &HF8 Angka(8) = &H80: Angka(9) = &H90 Dim A(16) As Byte Dim tgl, bln, thn As Integer Do DoEvents tgl = Day(Date) bln = Month(Date) thn = Year(Date) Text1.Enabled = False Text2.Enabled = True Text2.Text = Format(Date, "dd-mm-yyyy") Text3.Enabled = False A(0) = tgl \ 10 A(1) = tgl Mod 10 A(2) = &HBF A(3) = bln \ 10 A(4) = bln Mod 10 A(5) = &HBF A(6) = thn \ 1000 A(7) = (thn Mod 1000) \ 100 A(8) = ((thn Mod 1000) Mod 100) \ 10 A(9) = thn Mod 1000 Mod 100 Mod 10 A(10) = &HFF A(11) = &HFF A(12) = &H8C A(13) = &HC0 A(14) = &HC7 A(15) = &HCF For i = 0 To 15 If i = 2 Or i = 5 Or i >= 10 Then PortOut Data, A(i) Else

38

PortOut Data, Angka(A(i)) End If PortOut Control, (15 - i) Xor &HB Sleep 1 'PortOut Data, &HFF Next LoopEnd Sub

Private Sub Command5_Click() Data = &H378 Control = &H37A Angka(0) = &HC0: Angka(1) = &HF9: Angka(2) = &HA4: Angka(3) = &HB0 Angka(4) = &H99: Angka(5) = &H92: Angka(6) = &H82: Angka(7) = &HF8 Angka(8) = &H80: Angka(9) = &H90 Dim A(7) As Byte Dim X As Long Dim i As Byte X = 0 Do DoEvents Text1.Enabled = False Text2.Enabled = False Text3.Enabled = True Text3.Text = CStr(X) A(0) = X \ 1000000 A(1) = (X Mod 1000000) \ 100000 A(2) = ((X Mod 1000000) Mod 100000) \ 10000 A(3) = (((X Mod 1000000) Mod 100000) Mod 10000) \ 1000 A(4) = ((((X Mod 1000000) Mod 100000) Mod 10000) Mod 1000) \ 100 A(5) = (((((X Mod 1000000) Mod 100000) Mod 10000) Mod 1000) Mod 100) \ 10 A(6) = X Mod 1000000 Mod 100000 Mod 10000 Mod 1000 Mod 100 Mod 10 For i = 0 To 6 PortOut Data, Angka(A(i)) PortOut Control, (15 - i) Xor &HB Sleep 1 'PortOut Data, &HFF Next If X = 10000000 Then X = 0 Else X = X + 50000 Loop

End Sub

‘ ===========================‘ Program: Demo Lampu Pijar‘ ===========================

Private Declare Sub PortOut Lib "IO.DLL" (ByVal PortNo As Integer, ByVal Data As Byte)Private Declare Function PortIn Lib "IO.DLL" (ByVal PortNo As Integer) As BytePrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click() 'Hidupkan semua Lampu PortOut &H378, &HFFEnd Sub

Private Sub Command2_Click() 'Matikan semua Lampu PortOut &H378, &H0End Sub

Private Sub Command3_Click() 'Hidupkan Lampu melingkar Do DoEvents For i = 0 To 3 DoEvents

39

PortOut &H378, 2 ^ i Sleep 100 Next Loop PortOut &H378, 0End Sub

Private Sub Command4_Click() 'Hidupkan Lampu memantul Do DoEvents For i = 0 To 3 DoEvents PortOut &H378, 2 ^ i Sleep 100 Next For i = 2 To 1 Step -1 DoEvents PortOut &H378, 2 ^ i Sleep 100 Next Loop PortOut &H378, 0End Sub

Private Sub Command5_Click() 'Lampu berkedip terusDo DoEvents PortOut &H378, &HFF Sleep 200 PortOut &H378, 0 Sleep 200LoopEnd Sub

‘ ===========================‘ Program: Demo Motor Stepper‘ ===========================

Private Declare Sub PortOut Lib "IO.DLL" (ByVal PortNo As Integer, ByVal Data As Byte)Private Declare Function PortIn Lib "IO.DLL" (ByVal PortNo As Integer) As BytePrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click() ‘Berputar 1 putaran Dim Data(4) As ByteDim I,j As ByteData(1) =9: Data(1) =12: Data(1) =6: Data(1) =3 Do DoEvents For j=1 to 50 For i=1 to 4 PortOut &H378,Data(i) Sleep 1000 Next Next Loop PortOut &H378,0End Sub

40