You are on page 1of 39

PEMOGRAMAN MIKROKONTROLLER

AT89C51

OLEH :

DRS. EDIDAS, MT

JURUSAN TEKNIK ELEKTRONIKA


FAKILTAS TEKNIK UNIVERSITAS NEGERI PADANG

2009
PEMOGRAMAN MIKROKONTROLLER

AT89C51

Mikrokontroller AT89C51 merupakan salah satu


keluarga dari MCS 51 yang memiliki fasilitas sebagai
berikut :

a. Sebuah Central Processing Unit 8 bit.


b. Osilator internal dan rangkaian pewaktu.
c. RAM internal 128 byte.
d. Flash memori 4 Kbyte.
e. Lima buah jalur interupsi (dua buah interupsi eksternal
dan tiga buah interupsi internal).
f. Empat buah programable port I/O yang masing –
masing terdiri dari delapan buah jalur I/O.
g. sebuah port serial dengan kontrol serial full duplex
UART.
h. kemampuan untuk melaksanakan operasi aritmatika
dan operasi logika.
i. Kecepatan dalam melaksanakan interupsi per siklus 1
mikrodetik pada frekuensi 12 MHz.

1. Konfigurasi Pin Mikrokontroller


Gambar 1. Konfigurasi Pin AT89C51

Penjelasan dari masing–masing pin Mikrokontroller


AT89C51 adalah sebagai berikut :

a.Pin 1 sampai 8 (Port 1)


Merupakan port pararel 8 bit 2 arah (bidirectional) yang
dapat digunakan untuk berbagai keperluan (general
purpose).

b. Pin 9 (Reset)
Pin 9 (reset) adalah masukan reset (aktif tinggi). Pulsa
dari rendah ke tinggi akan mereset AT89C51. Pena ini
dihubungkan dengan rangkaian power on reset.

c. Pin10 sampai 17 (Port 3)


Adalah port pararel 8 bit dua arah, yang memiliki fungsi
pengganti meliputi TxD (Transmit data), RxD (Reseive
data), Int1 (interupt 1), T0 (Timer 0), T1 (Timer 1), WR
(Write), RD (Read). Bila fungsi pengganti tidak dipakai,
pin–pin ini dapat digunakan sebagai port pararel 8 bit
serba guna.

d. Pin 18 (XTAL 1)
Adalah pin masukan ke rangkaian osilator internal.
Sebuah osilator kristal atau sumber osilator luar dapat
digunakan.

e. Pin 19 (XTAL 2).


Adalah pena keluaran ke rangkaian osilator internal.
Pena ini di pakai bila menggunakan osilator kristal.

f. Pin 20 (Ground). Di hubungkan ke ground.


g. Pin 21 sampai 28 (Port 2).
Adalah port pararel dua (P2) selebar 8 bit dua arah
(Bidirectional). Port 2 ini mengirimkan byte alamat bila
dilakukan pengaksesan memori eksternal.

h. Pin 29 (PSEN).
Adalah pena PSEN (Program Store Enable) yang
merupakan sinyal pengontrol yang memperbolehkan
program memori eksternal masuk ke dalam bus
selama proses pemberian / pengembalian instruksi
(Fecting).

i. Pin 30 (ALE).
Adalah pena ALE (Address Latch Enable) yang
digunakan untuk menahan alamat memori eksternal
selama pengerjaan instruksi.

j. Pin 31 (EA).
Bila pin ini diberi logika tinggi (high), Mikrokontroller
akan melaksanakan instruksi dari ROM. Bila diberi
logika rendah (low), Mikrokontroller akan
melaksanakan seluruh instruksi dari memori program
luar.

k. Pin 32 sampai 39 (Port 0).


Merupakan port pararel 8 bit open drain dua arah. Bila
digunakan untuk mengakses memori luar, port ini
akan memultipleks alamat memori dengan data.

l. Pin 40 (Vcc). Dihubungkan ke Vcc (+ 5 volt).


Gambar di bawah ini menunjukkan konfigurasi pin
dari Mikrokontroller AT89C51.
Gambar 2. Blok diagram struktur dasar arsitektur AT89C51
Gambar 2. SFR (special Function Register
2. Timer / Counter
Mikrokontroler AT89C51 hadir dengan 2 timer, keduanya
bisa dikontrol, diset, dibaca dan di konfigurasikan. Sebuah
timer bekerja dengan mencacah, tidak tergantung pada
fungsi sebagai timer, counter. Fungsi timer yang utama
adalah untuk mengukur waktu dan dia akan bertambah satu
siklus mesin. Setiap siklus membutuhkan 12 pulsa kristal.
Sinyal pin yang berhubungan dengan fungsi timer:
1. TO (P3.4) input eksternal timer 0.

2. T1 (P3.5) Input eksternal timer 1.

3. T2 (P1.0) Input counter eksternal.

4. T2EX (P1.1) timer/counter 2 capture/reload trigger dan

control arah.

3. Interupsi .
Interupsi adalah suatu keadaan yang tidak umum
menuntut CPU untuk menghentikan eksekusi program
normal dan melaksanakan beberapa hal yang berkaitan
dengan keadaan yang tida umumtersebut. Interupsi adalah
suatu mekanisme yang disediakan oleh Mikroprosesor untuk
mensinkronisasikan operasi I/O menangani kondisi Error dan
keadaan darurat mengkoordinasikan keadaan sumber dan
lain-lain.

4. Register
Keluarga 8051 memiliki banyak register yang
meliputi akumulator, register R, register B, DPTR (Data
Pointer), PC (Program Counter), dan SP (Stack Pointer).
Akumulator sebagaimana namanya, digunakan sebagai
register umum untuk mengakumulasikan hasil dari instruksi-
instruksi. Akumulator dapat menampung 8 bit (1 byte) data
dan merupakan register yang paling sering dipakai. Hamper
dari separuh dari instruksi keluarga 8051 mengunakan
akumulator.
SP (Stack pointer) digunakan untuk menunjukan dimana
harga berikutnya yang akan diambil dari stack. Jika suatu
harga dimasukan dalam stack, AT89C51 pertama-tama akan
menambah Harga SP dan kemudian akan menyimpan harga
tersebut pada alamt memory yang bersesuaian. Demikian
pula jika suatu harga diambil dari stack, maka AT89C51 akan
mengambil dari stack dan kemudian mengurangi harga SP.
Register R adalah 8 set register yang dinamakn R0, R1,
R2, R3, R4, R5, R6, dan R7. Register-register ini digunakan
sebagai register pembantu penyimpanan data dalam banyak
operasi. Register B bersama dengan akumulator dalam hal
dia menyimpan sebuah harga 8 bit (1byte). Register B ini
hanya digunakan dalam dua instruksi keluarga 8031, yaitu
MUL AB dan DIV AB. Karenanya jika diinginkan untuk
mengalikan atau membagi akumulator Adalah dengan suatu
harga, maka simpanlah harga tersebut dalam register B dan
kemudian jalankan instruksinya.
DPTR (Data Pointer) adalah satu-satunya register yang
dapat diakses 16 bit (2byte) di dalam keluarga
8031.sebagaimana namanya, DPTR di gunakan untuk
menunjukan pada lokasi suatu data.DPTR di gunakan oleh
beberapa perintah yang mengizinkan keluarga 8031 untuk
mengakses memory eksternal dengan alamat yang di
tunjukan oleh DPTR.
PC (Program Counter) adalah alamat 2 byte yang
memberitahu 89C51 dimana instruksi selanjutnya akan
dilaksanakan.

B. Perangkat lunak AT89C51

Mikrokontroler bisa bekerja jika dimasukan program


kepadanya, program tersebut akan memberitahukan
mikrokontroler apa yang harus dilakukannya. Setiap
mikrokontroler memiliki instruksi-instruksi yang berbeda
sesuai dengan jenisnya masing-masing, sehingga sebuah
mikrokontroler tidak bisa memahami instruksi-instruksi yang
berlaku pada mikrokontroler lain yang tidak sejenis. Instruksi-
instruksi tersebut dikenal sebagai bahasa pemograman
system mikrokontroler.
Dalam pembuatan program pada mikrokontroler juga
terdapat beberapa jenis pengalamatan yang perlu diketahui
diantaranya sebagai berikut:

1. Pengalamatan langsung.
Proses pengalamatan ini terjadi pada sebuah perintah
ketika nilai operand merupakan data yang akan diproses,
biasanya operand tersebut selalu diawali dengan tanda ‘#’
seperti berikut:
Mov A,#05
Mov A,#Data ; pada bagian atas data telah didefinisikan
sebagai bilangan tertentu (data EQU 05 ) contohnya bil 5.

2. Pengalamatan data.
Proses pengalamatan ini terjadi pada sebuah perintah
ketika nilai operand merupakan alamat dari data yang
akan diisikan, dipindahkan, atau proses.
Contoh:
Mov a,#89
Mov P0,A
Pada contoh diatas selain mengirim data akumulator ke
port 0 juga merupakan perintah untuk pemindahan data
dari akumulator ke alamat 80H sehingga dapat juga
dituliskan Mov 80H,Adalah karena port 0 merupakan salah
satu I/O dari mikrokontroler AT89C51 yang beralamat 80H.

3. Pengalamatan tak langsung.


Proses pengalamatan ini terjadi pada sebuah perintah
ketika salah satu operand merupakan register berisikan
alamat dari data yang akan dituliskan atau dipindahkan.
Pengalamatan jenis ini biasanya digunakan untuk
melakukan penulisan, pemindahan atau pembacaan
berupa data dalam lokasi memori yang mempunyai urutan
beraturan. Jika proses dilakukan dengan pengalamatan
langsung jumlah baris yang dibutuhkan akan cukup
panjang. Contoh penulisan data 50H hingga 57H.
Listingnya:
Mov 50H,#08H
51H,#08H
52H,#08H
53H,#08H
54H,#08H
55H,#08H
56H,#08H
57H,#08H
Dengan mengunakan system pengalamatan tak langsung
listing dapat dipersingkat sebagai berikut:
Mov R0,#50H
ulang:
Mov @ RO, #08H
INC RO
CJNE RO,#58H,ulang

Pada listing ini RO digunakan sebagai register yang


menyimpan alamat dari data yang akan dituliskan, dengan
melakukan penambahan pada isi RO dan mengulang
perintah penulisan data ke alamat yang ditunjukan RO
sehingga register menunjukan nilai 57H+1 atau 58H.
Jadi mode pengalamtan ini dipakai untuk mengakses data
yang berada dalam memori, tapi tidak disebutkan secara
langsung melainkan dititipkan pada suatu register.

4. Pengalamatan kode.
Pengalamatan kode merupakan pengalamatan ketika
operand merupakan alamat dari instruksi JUMP dan CALL,
biasanya operand tersebut akan menunjukan ke satu
alamat yang telah diberikan label sebelumnya. Contoh
sbb:

A Call delay
Delay:
Mov B,#0FFH
Loopdelay:
DJNZ B, Loop delay
Ret.

Pada contoh diatas perintah A CALL delay mempunyai


operand yang menunjukan ke label sehingga pada saat
perintah ini dijalankan program akan melompat ke lokasi
memori yang diberi label delay.

5. Pengalamatan bit.
Proses pengalamatan dimana ketika operand menunjukan
ke alamat pada RAM Internal maupun register fungsi
khusus yang mempunyai kemampuan pengalamatan
secara bit. Pengalamatan bit terdiri beberapa macam sbb:
SETB TRO
CLR TRO

a. langsung menunjuk kealamat bit.


Perintah ini memberikan logika 1 pada bit dialamat B0H
dengan pengalamatan secara bit, contoh:

SetB 0B0H

b. Mengunakan operator titik.


Perintah ini memberikan logika 1 pada bit ke 0 dari port 3,
bit tersebut terletak di alamat B0H dengan pengalamtan
secara bit,contoh:
SetB P3.0

c. Mengunakan lambing assembler secara standar.


Perintah ini memberikan logika 1 pada kaki RXD yang
terletak pada bit ke 0 dari kaki port 3, contoh:
SetB RXD

d. Mengunakan lambing assembler secara bebas.


Perintah ini memberikan logika 1 pada bit penerima yang
sebelumnya telah didefinisikan sebagai P3, contoh:
Penerima Bit P3.0
SetB penerima

C. Bahasa assembler
Program assembler merupakan program yang ditulis oleh
pembuat program berupa kumpulan baris-baris perintah
yang biasanya disimpan dengan extention.
Program assembler juga terdiri atas beberapa bagian yang
dijelaskan sbb:

1. Label
Label biasanya dituliskan dengan kata atau istilah
tertentu yang mudahdikenali. Label mewakili nomor
memori program dari instruksi pada baris bersangkutan.
Untuk menyatakan nomor memori program yang dituju,
label ditulis dalam bagian operand.
Label berguna untuk memberikan nama pada alamt-alamt
yang dituju untuk mempermudah programmer dalam
membuat program. Dalam program sebuah label harus
diawali dengan huruf, tidak boleh ada label yang sama
dan maksimal 16 karakter.

2. Mnemonic
Mnemonic merupakan singkatan dari perintah
Mnemonic bisa juga disebut sebagai kode operasi, yaitu
kode-kode yang akan dikerjakan oleh program assembler
yang ada pada computer ataupun mikrokontroler. Operasi
yang dekerjakan oleh mikrokontrolersangat bergantung
oada jenis mikrokontroler yang digunakan, contoh, untuk
MCS51 digunakan MOVX,

ADD, MOV dan lainnya.

Sedangkan kode operasi yang dikerjakan oleh program


assembler yang ada pada computer sangat tergantung
pada program assembler yang digunakan. Contoh
:ORG,EQU,DB dan lainnya.

3. Operand merupakan pelengkap dari mnemonic. Jumlah


operand yang dibutuhkan oleh sebuah mnemonic tidak
selalu sama, sebuah mnemonic dapat memiliki tiga,
dua,satu bahkan tidak memiliki operand seperti terlihat
pada contoh berikut:
CJNE R7,#05H,ULANG : memerlukan tiga operand
MOVX @DPTR,A : memerlukan dua operand
SETB A : memerlukan satu operand
NOP : tidak memerlukan operand

4. Komentar
Bagian komentar tidak mutlak ada dalam sebuah
program, namun bagian ini seringkali dibutuhkan untuk
menjelaskan proses kerja ataupun catatan tertentu pada
baris program. Contoh.

MOV A,P1 ; Mengambil data dari port 1


Pengunaan komentar biasanya diawali dengan tanda ‘;’
dan dapat diletakan pada bagian manapun dari suatu
program.

Beberapa instruksi yang digunakan dalam pembuatan


program ini adalah:

1. MOV
MOV berfungsi untuk memindahkan atau menyalin
data.

2. ACALL
Instruksi dapat melakukan lompatan ke suatu
subrutin yang ditunjukan oleh alamat pada label
lompatan yang dilakukan berada diareal 2 K byte.
Contoh: Acaal delay’ memangil label delay’
Delay: ‘delay yang dipangil’
3. RET
Intruksi ini dapat melakukan lompatan untuk kembali
melaksanakan instruksi yang dilompatan oleh instruksi
call atau acall.
Contoh: acall delay ‘memangil label delay’
Instuksi
Delay: ‘delay yang dipangil’
Ret ‘kembali ke instruksi setelah call’
4. SJMP
Instruksi SJMP (short jump) pada dasarnya sama
dengan instruksi LJMP, namun yang membedakan
adalah ukuran instruksi, dimana pada LJMP memiliki
ukuran 3 byte sedangkan SJMP hanya 2 byte. Lokasi
memori program dalam instruksi ini tidak dinyatakan
dengan lokasi memori program yang sesunguhnya, tapi
dinyatakan dengan pergeseran relative terhadap nilai
program counter saat instruksi ini dilakukan.
Pergeseran relative tersebut dinyatakan dengan 1
byte bilangan 2’s complement, yang biasanya dipakai
untuk menyatakan nilai antara – 128 - + 127. nilai
minus dipakai untuk menyatakan nilai untuk
menyatakan bergeser ke instruksi-instruksi
sebelumnya, sedangkan nilai positif digunakan untuk
menyatakan pergeseran ke instruksi sesudahnya.
Meskipun instruksi SJMP hanya sebatas -128 - +127,
tapi instruksi ini tidak dibatasi dengan pengertian
daerah memori program 2 K byte yang membatasi AJMP
(Absolute jump).

5. JB (jump on bit set)


Instruksi ini melakukan pengujian bit pada alamat bit
yang ditunjukan. Jika data bit =1 maka program
tersebut akan melompati ke subrutin yang ditunjukan
oleh instruksi. Akan tetapi bila data bit =0 maka
program akan menjalankan instruksi dibawahnya atau
sebaliknya.
Contoh:
JNB P1.0, alamat 1
Mov A,#05H
.................
Alamat 1:
Mov R1,#00H
Jika bit tersebut set, program akan lompat ke label
alamat 1 dan menjalankan instruksi Mov R1,#00H.
namun, jika bit tersebut clear program akan
menjalankan instruksi Mov A,#05H terlebih dahulu
sebelum menjalankan instruksi di label alamat1.

6. JNB (jump on not bit set)


Instruksi ini melakikan pengujian bit pada alamat yang
ditunjuk. Jika data bit bernilai 0 maka program akan
melompat ke subrutin yang ditunjuk oleh instruksi. Bila data
bit bernilai 1 maka program akan menjalankan instruksi
dibawahnya atau selanjutnya.
Contoh:
Hidup:
Jnb P3.0,hidup :lompatan
kelabel
hidup jika
port 3.0
berlogika 0

7. DJNZ (decrement and jump if not zero)


Instruksi ini melakukan operasi pengurangna pada
alamat register serbaguna (R0..R7) yang ditunjukan dengan
nilai 1 dan akan jump bila hasil daripengurangan itu
nilainya tidak sama dengan 0. akan tetapi jika hasilnya
sama dengan 0 maka program akan menjalankan instruksi
dibawahnya.
Contoh :
LDElay :
Djnz R2,LDelay1
Ret
Instruksi Djnz R2,LDelay 1 akan selalu melakukan lompatan
ke label dan mengurangi data pada register 2 dengan 1
selama data dari register 2 belum mencapai nol.

8. SETB dan CLR


Mikrokontroler seri 51 dari Atmel memiliki sebuah
processor Boolean yang lengkap. Oleh sebab itu
mikrokontroler tersebut juga dapat melakukan instruksi
Boolean. SETB dan CLR adalah salah satu dari beberapa
instruksi Boolean yang dapat dilaksanakan oleh
mikrokontroler. CLR adalah intruksi untuk mengubah bit-bit
pada RAM Internal ataupun register yang dapat diamati
secara bit menjadi 0.
Sedangkan SETB adalah kebalikan dari CLR, dimana CLR
mengubah bit-bit tersebut menjadi 1.
SETBP1.0 ‘mengubah nilai bit pada P1.0 menjadi 1’
CLR P1.0 ‘mengubah nilai bit pada P1.0 menjadi 0’
Assembler juga menyediakan symbol-simbol assembler
khusus yang digunakan untuk mode-mode pengalamatan
melalui register. Symbol-simbol assembler khusus ini
mencakup A, R0 sampai dengan R7,DPTR,C,PC dan AB juga
tanda dolar ($) yang dapat digunakan untuk menunjuk nilai
pencacah program (program counter) saat ini. Untuk lebih
jelasnya dapat dilihatpada table dibawah ini.

Tabel 2.2 Simbol Khusus Assembler

Symbol Khusus Arti


A Akumulator
B Register B
RO . . . R7 Register serbaguna
DPTR Data pointer register 16 bit
PC Program counter. Register 16 bit yang
berisi alamat intruksi berikutnya yang
akan dijalankan.
C Carry Hang
AB Akumulator/register b. pasangan register
untuk perkalian dan pembagian.

D. Dowload program ke MC AT89C51.


Untuk memasukan (download) program kedalam
mikrokontroler digunakan alat khusus yang disebut
Microkontroller programmer atau Flash programmer. Selain
berfungsi untuk memasukan program ke mikrokontroller alat
ini biasanya juga dapat menghapus dan membaca program
yang ada didalam mikrokontroler.
Salah satu jenis Flash programmer yang digunakan adalah
HB2000C dari Haline Electronic. Flash programmer ini
dilengkapi dengan software pendukungnya yaitu HB2000W.
selain itu untuk mikrokontroler AT89C51, HB2000C juga
dapat digunakan untuk AT89C52.
Langkah-langkah untuk mendownload program kedalam
AT89C51 mengunakan HB2000W adalah sebagai berikut :
1. Tulis program pada software text editor seperti Notepad
(dapat juga mengunakan Software DEMOTV ataupun
mengunakan text editor lainya.\
2. Simpan file program yang telah dibuat tersebut dengan
eksekusi H51.
3. Compile file H51 yang telah disimpan menjadi file OBJ
mengunakan HB2000W.
4. Jika terdapat kesalahan (error lakukan perbaikan pada
program, lalu simpan kembali. Jika tidak terdapat
kesalahan lanjutkan pada langkah 6
5. Ulangi langkah 3 dan 4.
6. Ubah file. OBJ menjadi file HEX, dilanjutkan dengan
mengubah file HEX menjadi file BIN.
7. file BIN inilah nantinya yang akan di download kedalam
mikrokontroler.
8. Sebelum melakukan perintah download sebaiknya
dilakukan penghapusan terhadap isi memori
mikrokontroler yang akan di download.
9. Download file BIN ke dalam mikrokontroler dengan cara
menjalankan perintah Download. Jika muncul ‘proses
download gagal’, lakukan pengecekan terhadap alat
pemogram HB2000C.
10. Ulangi perintah download sampai muncul pesan
‘Proses download selesai.

PROGRAM APLIKASI
PROGRAM 1
; ---------------------------------------------------
; Lampu flip-flop pada Port 1 File name HL2.H51
; ---------------------------------------------------
Org 0h
Mulai: Mov P1,#00001111B ; LED P1.4 s/d P1.7 nyala
Acall Delay ; panggil sub routine Delay
Mov P1,#11110000B ; LED P1.0 s/d P1.3 nyala
Acall Delay ; panggil sub routine Delay
Sjmp Mulai ; Lompat ke alamat dg label Mulai
;-------------------
; sub routine delay
;-------------------
Delay: Mov R0,#5 ; Isi Register R0 dengan 5
Delay1: Mov R1,#0FFh ; Isi Register R1 dengan FF (hex)
Delay2: Mov R2,#0
Djnz R2,$
Djnz R1,Delay2 ; Kurangi R1 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay2
Djnz R0,Delay1 ; Kurangi R0 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay1
Ret ; Kembali ke alamat setelah perintah
; 'Acall Delay'
End

PROGRAM 3

; ---------------------------------------------------
; Lampu nyala bergeser di Port 1 File name HL3.H51
; ---------------------------------------------------
Org 0h
Mov A,#11111110B ; Masukkan data 11111110B ke Accumulator

Mulai:
Mov P1,A ; keluarkan isi Accumulator ke Port 1
Acall Delay ; panggil sub routine Delay
RL A ; Rotate Accumulator left
Sjmp Mulai ; Lompat ke alamat dg label Mulai
;-------------------
; sub routine delay
;-------------------
Delay: Mov R0,#0 ; Isi Register R0 dengan 0
Delay1: Mov R1,#0 ; Isi Register R1 dengan 0
Delay2: Djnz R1,Delay2 ; Kurangi R1 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay2
Djnz R0,Delay1 ; Kurangi R0 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay1
Ret ; Kembali ke alamat setelah perintah
; 'Acall Delay'
End
PROGRAM 4
; -------------------------------------------------------------
; Menghidupkan display LED 7 segment
; untuk menampilkan angka 0 s/d 9 File name HL4.H51
; cara 1 : data langsung dikeluarkan ke port yang bersangkutan
; -------------------------------------------------------------
Org 0h
Mulai:
Mov P0,#22h ; keluarkan kode angka 0 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#77h ; keluarkan kode angka 1 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#0A4h ; keluarkan kode angka 2 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#25h ; keluarkan kode angka 3 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#71h ; keluarkan kode angka 4 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#29h ; keluarkan kode angka 5 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#28h ; keluarkan kode angka 6 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#67h ; keluarkan kode angka 7 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#20h ; keluarkan kode angka 8 Port 0
Acall Delay ; panggil sub routine Delay
Mov P0,#21h ; keluarkan kode angka 9 Port 0
Acall Delay ; panggil sub routine Delay
Sjmp Mulai ; Lompat ke alamat dg label Mulai
;-------------------
; sub routine delay
;-------------------
Delay: Mov R0,#0FFh ; Isi Register R0 dengan FF (Hex)
Delay1: Mov R1,#0FFh ; Isi Register R1 dengan FF (hex)
Delay2: Djnz R1,Delay2 ; Kurangi R1 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay2
Djnz R0,Delay1 ; Kurangi R0 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay1
Ret ; Kembali ke alamat setelah perintah
; 'Acall Delay'
End

PROGRAM 5
; -------------------------------------------------------------
; Menghidupkan display LED 7 segment
; untuk menampilkan angka 0 s/d 9 File name HL5.H51
; cara 2 : data diambil dari alamat data array
; -------------------------------------------------------------
Org 0h
Mulai:
Mov R2,#10 ; jumlah angka numerik
Mov DPTR,#Numerik ;
Nextdata:
Clr A
Movc A,@A+DPTR
Mov P0,A ; keluarkan data A ke port 0
Inc DPTR
Acall Delay ; panggil sub routine delay panjang
Djnz R2,Nextdata ; Kurangi R2 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Nextdata
Sjmp Mulai ; Lompat ke alamat dg label Mulai
;-------------------
; sub routine delay
;-------------------
Delay: Mov R0,#0FFh ; Isi Register R0 dengan FF (Hex)
Delay1: Mov R1,#0FFh ; Isi Register R1 dengan FF (hex)
Delay2: Djnz R1,Delay2 ; Kurangi R1 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay2
Djnz R0,Delay1 ; Kurangi R0 dengan 1, bila hasil belum
; sama dengan 0 maka lompat ke Delay1
Ret ; Kembali ke alamat setelah perintah
; 'Acall Delay'
;--------------------------
; Lokasi data
;--------------------------
Numerik:
DB 22h,77h,0A4h,25h,71h,29h,28h,67h,20h,21h
End
PROGRAM 6

; ------------------------------------------------------
; Program untuk menghidupkan Display 8 x 7 Segment HD003
; untuk menampilkan tulisan " -HaLine- " mati - hidup
; File name : HL6.H51
; ------------------------------------------------------
Org 0h
Ulang: Mov R5,#90h ;Register 5 diisi 90h untuk keperluan jumlah pengulangan display hidup
Hidup: Mov DPTR,#HaLine ;Isi data pointer dg alamat Haline
Mov R6,#08h ;R6 = 8 = Jumlah digit 7 segment
Mov R1,#0FEh ;R1 = Common
Ulang1:
Clr A ;Isi Accumulator dengan 0
Movc A,@A+DPTR ;Pindahkan data ke n ke A
Inc DPTR ;Data Pointer tambahkan dengan 1
Mov P0,A ;Keluarkan data A (Segment) ke port 0
Mov A,R1 ;Pindahkan isi Register 1 ke Accumulator
Mov P2,A ;Keluarkan isi A (Common) ke port 2
RL A ;Rotate Accumulator left
Mov R1,A ;Kembalikan isi Accumulator ke R1
Lcall Delay ;Panggil sub routine delay
mov p0,#0FFh ;Buat P0 berlogika 1 (semua LED padam)
Djnz R6,Ulang1 ;Ulangi sampai 8 kali (8 digit)
Djnz R5,Hidup ;ulangi langkah diatas sampai 50h kali
;
Mov R5,#0 ;Isi Register 5 dengan 0 (untuk pengulangan saat padam)
Mati: Lcall Delay
Lcall Delay
Lcall Delay ;Panggil sub routine delay
Djnz R5,Mati ;Ulangi sampai FFh (255) kali
Ljmp Ulang ;Ulangi semua langkah diatas dari awal.
;---------------------------
;sub routine delay
;---------------------------
Mov R2,#0 ;Isi Register R2 dengan 0
Delay: Djnz R2,Delay ;Ulangi langkah ini sampai 90h kali
Ret ;Kembali ke langkah setelah perintah Lcall Delay
;----------------------------------
; DATA AREA
;----------------------------------
HaLine: DB 0FDh,70h,24h,0BAh,77h,62h,0A0h,0FDh
End

PROGRAM 7

; ---------------------------------------------------
; Program untuk menampilkan tulisan secara bergeser
; File name HL7.H51
; ---------------------------------------------------
; Pemakaian RAM :
; 70h-77h = data segment display / 70h = kiri
; 78h = data common display
; 79h = untuk delay display 1 common
; 7Ah = untuk delay display 8 common
; 7Bh = utk counter RAM to PORT display
; 7Ch = utk counter buffer RAM display
; 7Dh = jumlah text
; 7Eh = pointer untuk tentukan DPTR
; ---------------------------------------------------
Org 0h
Ljmp Mulai
;------------------------------------------------
;sub routine untuk mengisi buffer RAM Display
;------------------------------------------------
Isi_buffer:
Mov 7Ch,#08h ;Jumlah digit 7 segment
Mov R0,#70h ;
Ulang:
Mov A,7Eh ;Isi A dengan isi dari alamat 7Eh (data DPTR)
Movc A,@A+DPTR ;Pindahkan data ke n ke A
Mov @R0,A ;Pindahkan isi A ke alamat yang ditunjuk R0
Inc DPTR ;Siapkan data berikutnya
Inc R0 ;tambahkan isi R0 dengan 1
Djnz 7Ch,Ulang ;Ulangi sampai 8 kali (jml digit 7 segment)
Ret
;----------------------------------------------------------------------------
;sub routine untuk menampilkan isi RAM buffer display ke 8 x 7 segment
;----------------------------------------------------------------------------
Dis8seg:
Mov 7Bh,#08h ;Isi RAM 7Bh dg 8 = jumlah digit 7 segment
Mov R1,#70h ;R1 = Alamat buffer display
Mov 78h,#0FEh ;Isi memory 78h dg FEh = data Common display
Ulang2:
Mov A,@R1 ;pindahkan isi RAM yang ditunjuk oleh R1 ke A
Mov P0,A ;Keluarkan data A ke port 0 (data segment)
Inc R1
Mov A,78h ;Pindahkan isi RAM 78h ke A
Mov P2,A ;Keluarkan data A ke port 2 (data common)
RL A
Mov 78h,A
Lcall Delay ;
Mov P0,#0FFh ;matikan display sesaat (u/ menghindari bayangan)
Mov P2,#0FFh
Djnz 7Bh,Ulang2 ;Ulangi sampai 8 kali (jml digit 7 segment)
Ret ;
;
Delay: Mov 79h,#0E0h ;Isi RAM 79h dengan 0E0 (hex)
Delay1: Djnz 79h,Delay1 ;
Ret ;Kembali ke langkah setelah perintah Acall
;
Display:
Mov 7Ah,#050h ;Isi RAM 7Ah dengan 050 (hex)
Display1:
Lcall Dis8seg
Djnz 7Ah,Display1
Ret
;
Mulai:
;text keluar dari kanan ke kiri
Mov 7Eh,#1
Mov 7Dh,#8 ;RAM 7Dh diisi jumlah karakter yang akan
NextData: ;di tampilkan
Mov DPTR,#Haline ;Isi DPTR dengan alamat dg label Awal
Lcall Isi_buffer
Lcall Display
Inc 7Eh ;RAM 7Eh untuk counter data berikutnya
Djnz 7Dh,NextData ;Ulangi sejumlah karakter yang diingikan
Lcall Display
Lcall Display
Lcall Display
;text digeser masuk ke kanan
NextData2:
Dec 7Eh ;RAM 7E untuk counter data berikutnya
Mov DPTR,#Haline
Lcall Isi_buffer ;
Lcall Display ;
Mov A,7Eh
Cjne A,#0,NextData2
Lcall Display
Lcall Display
Lcall Display
Ljmp Mulai
;----------------------------------
; DATA AREA
;----------------------------------
Haline: DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh
DB 0FDh,70h,24h,0BAh,77h,62h,0A0h,0FDh
;
End

PROGRAM 8

; ---------------------------------------------------
; Simulasi penekanan tombol pd P3.0 dan P3.1
; untuk menghidupkan lampu pada Port 1
; File name HL8.H51
; ---------------------------------------------------
Org 0h
Mulai:
Mov A,P3 ;Baca port 3 dan masukkan isinya di Accumulator
Cjne A,#0FEh,terus ;Bandingkan isi A dengan FEh bila hasilnya
;tidak sama maka loncat ke label terus.
Mov P1,#0 ;keluarkan logika 0 ke port 1 (LED menyala)
Sjmp Mulai ;Loncat ke label Mulai
terus:
Cjne A,#0FDh,Mulai ;Bandingkan isi A dengan FDh bila hasilnya
;tidak sama maka loncat ke label Mulai.
Mov P1,#0FFh ;Keluarkan logika 1 ke port 1 (LED padam).
Sjmp Mulai ;Lompat ke alamat dg label Mulai
;
End

PROGRAM 9

; ---------------------------------------------------
; Simulasi penekanan tombol pd P3.0 sebagai toggle switch
; untuk menghidupkan/mematikan lampu pada Port 1
; File name HL9.H51
; ---------------------------------------------------
Org 0h
Mulai:
Mov A,P3 ;Baca port 3 dan masukkan isinya di Accumulator
Cjne A,#0FEh,mulai ;Bandingkan isi A dengan FEh bila hasilnya
;tidak sama maka loncat ke label mulai.
Cjne R0,#0,terus
mov R0,#1
Mov P1,#0 ;keluarkan logika 0 ke port 1 (LED menyala)
tunggu:
Mov A,P3
Cjne A,#0FFh,tunggu
Sjmp Mulai ;Loncat ke label Mulai
terus:
Mov R0,#0
Mov P1,#0FFh
Sjmp tunggu ;Lompat ke alamat dg label tunggu
;
End

PROGRAM 10
; ---------------------------------------------------------
; Simulasi penekanan tombol pd P3 dan hasil penekanan
; ditampilkan pada display 7 segment di Port 0
; File name HL10.H51
; ----------------------------------------------------------
Org 0h
Mulai:
Mov A,P3 ;Baca port 3 dan masukkan isinya di Accumulator
Cjne A,#0FEh,banding1 ;Bandingkan isi A dengan FEh bila hasilnya
mov p1,a ;tidak sama maka loncat ke label mulai.
mov P0,#77h ;keluarkan kode angka 0 ke port 0
sjmp Mulai ;loncat ke label mulai
banding1:
cjne A,#0FDh,banding2
mov p1,a
mov P0,#0A4h
sjmp mulai
banding2:
cjne A,#0FBh,banding3
mov p1,a
mov P0,#25h
sjmp mulai
banding3:
cjne A,#0F7h,banding4
mov p1,a
mov P0,#71h
sjmp mulai
banding4:
cjne A,#0EFh,banding5
mov p1,a
mov P0,#29h
sjmp mulai
banding5:
cjne A,#0DFh,banding6
mov p1,a
mov P0,#28h
sjmp mulai
banding6:
cjne A,#0BFh,banding7
mov p1,a
mov P0,#67h
sjmp mulai
banding7:
cjne A,#07Fh,mulai
mov p1,a
mov P0,#20h
sjmp mulai
;
End

PROGRAM 11

; ---------------------------------------------------
; Program untuk membaca tombol-tombol yang disusun
; secara matrik, input tombol pada port 1, output
; tombol pada port 2 dan hasil ditampilkan pada
; display 7 segment di port 0 File name HL11.H51
; ---------------------------------------------------
Org 0h
Mulai:
mov p2,#0FEh ;buat P2.0 =0 (untuk baca tombol 0,A,B,C,F4)
jb p1.7,key1 ;lompat ke key1 jika p1.7 =1 dan bila =0 maka
mov p0,#0AAh ;keluarkan kode huruf 'C' ke port 0
sjmp Mulai ;lompat ke label mulai
key1:
jb p1.6,key2 ;lompat ke key2 jika p1.6 =1 dan bila =0 maka
mov p0,#38h ;keluarkan kode huruf 'B' ke port 0
sjmp Mulai ;lompat ke label mulai
key2:
jb p1.5,key3
mov p0,#60h
sjmp Mulai
key3:
jb p1.4,key4
mov p0,#22h
sjmp Mulai
key4:
jb p1.3,key5
mov p0,#70h
sjmp Mulai
key5:
mov P2,#0FDh ;untuk baca tombol 1,2,3,D,F3
jb p1.7,key6
mov p0,#34h
sjmp Mulai
key6:
jb p1.6,key7
mov p0,#25h
sjmp Mulai
key7:
jb p1.5,key8
mov p0,#0A4h
sjmp Mulai
key8:
jb p1.4,key9
mov p0,#77h
sjmp Mulai
key9:
jb p1.3,key10
mov p0,#22h
sjmp Mulai
key10:
mov p2,#0FBh ;untuk baca tombol 4,5,6,E,F2
jb p1.7,key11
mov p0,#0A8h
sjmp Mulai
key11:
jb p1.6,key12
mov p0,#28h
sjmp Mulai
key12:
jb p1.5,key13
mov p0,#29h
sjmp Mulai
key13:
jb p1.4,key14
mov p0,#71h
ljmp Mulai
key14:
jb p1.3,key15
mov p0,#22h
ljmp Mulai
key15:
mov p2,#0F7h ;untuk baca tombol 7,8,9,F,F1
jb p1.7,key16
mov p0,#0E8h
ljmp Mulai
key16:
jb p1.6,key17
mov p0,#21h
ljmp Mulai
key17:
jb p1.5,key18
mov p0,#20h
ljmp Mulai
key18:
jb p1.4,key19
mov p0,#67h
key19:
jb P1.3,key20
mov p0,#0E0h
key20:
ljmp Mulai
End

PROGRAM 12

; --------------------------------------------------------------------------
; Program untuk membaca tombol-tombol yang disusun secara matrik,
; input tombol pada port 1, output tombol pada port 2 dan hasil
; ditampilkan pada display 7 segment di port 0 File name HL12.H51
; Cara 2 : pakai metoda pembanding
; --------------------------------------------------------------------------
Org 0h
Mulai:
Mov 74h,#5 ;jumlah baris tombol matrik
Mov R5,#0FEh ;data untuk port 2 (baris)
Mov DPTR,#Angka
Mov 71h,#0 ;untuk hitungan data 5 baris pertama
Ulang:
Mov 70h,#07Fh ;data pembanding input P1
Mov 72h,#0 ;hitungan data per 5 baris
Ulang1:
mov p2,R5
mov A,P1
cjne A,70h,geser1
mov A,72h
add A,71h
movc A,@A+DPTR
mov p0,A
sjmp Mulai
geser1:
inc 72h
mov A,70h
RR A
Mov 70h,A
mov A,72h
cjne A,#5,ulang1 ;ulangi sebanyak kolom tombol
nextscan:
mov A,71h
add A,#5
Mov 71h,A
mov A,R5
RL A
Mov R5,A
djnz 74h,Ulang
mov P2,#0FFh
Ljmp Mulai
;
Angka: DB 0AAh,38h,60h,22h,70h,34h,25h,0A4h,77h,62h,0A8h
DB 28h,29h,71h,0BAh,0E8h,21h,20h,67h,0E0h
End

PROGRAM 13

; --------------------------------------------------------------------------
; Program untuk membaca keypad dan memasukkan data ke ke RAM serta
; menampilkan isi RAM tersebut ke display 7 segment
; File nama : HL13.H51
; --------------------------------------------------------------------------
Data_inp Equ 35h
Baris Equ 30h
Data_5 Equ 31h
Per_baris Equ 32h
Ban_P1 Equ 33h
Common Equ 34h
KeyPress Equ 36h
bounc Equ 37h
;
Org 0h
lcall clear_buffer
Mulai:
mov A,keypress ; Lihat apakah ada tombol ditekan
cjne A,#0,lompat ; bila ada, loncat ke label lompat
Lcall scan_tombol
lcall display
sjmp mulai
lompat:
mov bounc,#5 ; cek apakah tombol betul-betul
lompat1: ; ditekan / untuk menghindari
lcall display ; bouncing diulang sampai 5x
mov P2,common
mov A,P1
cjne A,#0FFh,lompat
djnz bounc,lompat1
mov keypress,#0 ; buat keypress = 0 bila tombol
sjmp Mulai ; sudah dilepas
;
scan_tombol:
Mov Baris,#4 ;jumlah baris tombol matrik
Mov Common,#0FEh ;data untuk port 2 (baris)
Mov DPTR,#Angka
Mov Data_5,#0 ;untuk hitungan data 5 baris pertama
Ulang:
Mov Ban_P1,#07Fh ;data pembanding input P1
Mov Per_baris,#0 ;hitungan data per 5 baris
Ulang1:
mov p2,Common
mov A,P1
cjne A,Ban_P1,geser1
mov A,Per_baris
add A,Data_5
; mov P3,A
movc A,@A+DPTR
mov data_inp,A
mov keypress,#1 ; ada tombol ditekan
lcall isi_buffer ; isi data tombol ke buffer
ret
geser1:
inc Per_baris
mov A,Ban_P1
RR A
Mov Ban_P1,A
mov A,Per_baris
cjne A,#5,ulang1 ;ulangi sebanyak kolom tombol
nextscan:
mov A,Data_5
add A,#5
Mov Data_5,A
mov A,Common
RL A
Mov Common,A
djnz Baris,Ulang
mov P2,#0FFh
Ret
isi_buffer:
mov A,data_inp
cjne A,#60h,buffer1 ; tombol A untuk '.'
mov A,77h
anl A,#0DFh ; untuk membuat tanda '.'
mov 77h,A
ret
buffer1:
cjne A,#0AAh,buffer2 ; C = clear
lcall clear_buffer ; tombol C untuk menghapus
ret
buffer2:
mov A,keypress ; isi buffer bila ada
cjne A,#1,nopress ; tombol ditekan
mov R2,#7
mov R1,#70h
mov R0,#71h
isi_lagi:
mov A,@R0
mov @R1,A
inc R0
inc R1
Djnz R2,isi_lagi
mov A,Data_inp
mov 77h,A
nopress:
ret
;----------------------------------------------------------
; sub routine untuk mendisplaykan data dari buffer
;----------------------------------------------------------
display:
Mov 7Bh,#08h ;R6 = 8 =Jumlah digit 7 segment
Mov R1,#70h ;R0 = Alamat buffer display
Mov 78h,#0FEh ;78h = Comm
Ulang2:
Mov A,@R1 ;
Mov P0,A ;Keluarkan data A ke port 0
Inc R1 ;
Mov A,78h ;Pindahkan data RAM 78h ke A
Mov P2,A ;Keluarkan data A ke port 2
RL A ;
Mov 78h,A ;
Lcall Delay ;Delay
mov p0,#0FFh
mov P2,#0FFh
Djnz 7Bh,Ulang2 ;Ulangi sampai 8 kali (jml digit 7 segment)
Ret ;
;
Delay: Mov 79h,#090h ;Isi RAM 79h dengan 0
Djnz 79h,$
Ret ;Kembali ke langkah setelah perintah Acall
;
Clear_Buffer: ; sub routine untuk menghapus
mov 78h,#8 ; buffer
mov R0,#70h
clear1: mov @R0,#0FFh
inc R0
djnz 78h,clear1
ret
;
Angka: DB 0AAh,38h,60h,22h,70h,34h,25h,0A4h,77h,62h,0A8h
DB 28h,29h,71h,0BAh,0E8h,21h,20h,67h,0E0h
End

PROGRAM 14
; ---------------------------------------------------
; Program Demo HB2000 untuk drive speaker bunyi tone
; Pintu Rel Kereta Api dan lampu flip-flop
; Selang waktu pakai interupt timer 1
; Speaker dipasang pada P1.0
; Lampu flip-flop pada Port 1.6 dan Port 1.7
; File name HL14.H51 by. HaLine, Des 1999 ver 0.0
; ---------------------------------------------------
Org 0h
ljmp Mulai
;
org 1Bh ; alamat untuk interupt timer 1
ljmp timer_1
;
Delay: Mov 79h,#0 ; sub routine delay
Delay1: Nop
Djnz 79h,Delay1 ;
Ret ;
ldelay: ; sub routine delay panjang
Mov 7Ah,#0 ;
ld1: acall delay
acall delay
Djnz 7Ah,ld1 ;
Ret
;-------------------------------------
; sub routine interupt timer 1
; Penghasil pulsa pada Port 1 bit ke 0
;-------------------------------------
timer_1:
clr TCON.6 ; Stop Timer 1
cjne R0,#0,Tone1
setb P1.0 ; buat P1.0 berlogika 1
mov R0,#1 ; ÚÄÄÄÄ
sjmp Tone2 ; ÄÙ
Tone1:
clr P1.0 ; buat P1.0 berlogika 0
mov R0,#0 ; Ä¿
; ÀÄÄÄÄ
Tone2:
cjne R1,#0,Tone3
mov tl1,#06Bh ; Tone 500 Hz = 1 ms x 2
mov th1,#0FCh ;
sjmp Tone4
Tone3:
mov tl1,#0D7h ; Tone 225 Hz = 1.8 ms x 2
mov th1,#0F8h
Tone4: ; Perhitungan frekuensi tone
setb TCON.6 ; F osc = 11 Mhz (tergantung crystal yg dipasang)
reti ; F timer = 11 MHz / 12 = 916 KHz
; T timer = 1 / 916 = 1.09 uS
; T tone = (65535 - THxTLx) * 1.09 uS
; THxTLx (500Hz) = 65535 - (1 ms / 1.09 uS)
; = 65535 - 916 = 64619 Dec
; = FC6B Hex (THx=FC,TLx=6B)
;-------------------
; Awal dari program
;-------------------
Mulai:
clr A ; nolkan accumulator
mov IE,A ; disable semua interupt
setb IE.7 ; enable interupt
setb IE.3 ; enable interupt timer 1
mov TCON,A ; clear TCON
mov TMOD,#11h ; mode timer 16 bit
setb TCON.6 ; start timer1
;
tunggu:
mov R1,#0 ; Flag untuk tone 500 Hz
setb P1.7
setb P1.6
clr P1.5
clr P1.4
lcall ldelay
mov R1,#1 ; Flag untuk tone 225 Hz
setb P1.4
setb P1.5
clr P1.6
clr P1.7
lcall ldelay
sjmp tunggu ; ulangi terus menerus
;
End

PROGRAM 15

; ---------------------------------------------------
; Simulasi penekanan tombol pd P3.0 dan P3.1 untuk
; inc dan dec data dikeluarkan lewat P1 dan P2 dimana
; P1 dipasang sebagai simulasi DAC
; File name HL15.H51
; ---------------------------------------------------
Org 0h
Mov A,#7Fh ; nilai awal
mov P1,A
mov P2,A
Mulai:
jb P3.0,terus
inc A
Mov P1,A
Mov P2,A
acall delay
cjne A,#0FFh,Mulai
mov A,#0FEh
sjmp Mulai
terus:
jb P3.1,Mulai
dec A
Mov P1,A
Mov P2,A
acall delay
cjne A,#0,Mulai
mov A,#1
sjmp Mulai
;
delay: mov R1,#010h
delay1: mov R0,#0
djnz R0,$
djnz R1,delay1
ret
End

PROGRAM 16

; ---------------------------------------------------
; Simulasi penekanan tombol pd P3.0 dan P3.1 untuk
; inc dan dec data dikeluarkan lewat P2.7 seperti data PWM 8 bit
; dan P1 sebagai monitor data saat itu.
; File name HL16.H51
; ---------------------------------------------------
Org 0h
Mov A,#7Fh
mov P1,A
Mulai:
acall delay
jb P3.0,terus
inc A
Mov P1,A
cjne A,#0FFh,Mulai
mov A,#0FEh
sjmp Mulai
terus:
jb P3.1,Mulai
dec A
Mov P1,A
cjne A,#0,Mulai
mov A,#1
sjmp Mulai
;
PWM:
Mov R2,A
PWM1: Setb P2.7 ;keluarkan logika 1
Djnz R2,PWM1
;
Mov R2,A
CPL A
Xch A,R2
PWM2: clr P2.7
Djnz R2,PWM2
Ret
;
delay:
mov R0,#0Fh
delay2: acall PWM
djnz R0,delay2
ret
End

PROGRAM 17
;----------------------------------------------
; Contoh program untuk menjalankan motor stepper
; dalam percobaan ini digunakan driver unipolar
; dan motor stepper yang digunakan mempunyai
; step sebesar 200 step untuk tiap 360 derajat
; input driver dihubungkan dengan Port 2.0 - 2.3
;----------------------------------------------
;
Org 0h
Mov P2,#0 ; matikan supply motor
Mulai:
Mov R3,#01h
Keyscan:
jb P3.0,key1 ; P3 adalah input dari tombol
Mov R2,#200 ; R2 berisi jumlah step
Lcall Putar_kanan
key1:
jb P3.1,key2
Mov R2,#200
Lcall Putar_kiri
key2:
jb P3.2,key3
Mov R2,#100
Lcall Putar_kanan
key3:
jb P3.3,key4
Mov R2,#100
Lcall Putar_kiri
key4:
jb P3.4,key5
Mov R2,#50
Lcall Putar_kanan
key5:
jb P3.5,key6
Mov R2,#50
Lcall Putar_kiri
key6:
jb P3.6,key7
Mov R2,#25
Lcall Putar_kanan
key7:
jb P3.7,key8
Mov R2,#25
Lcall Putar_kiri
key8:
Ljmp Keyscan
;
Putar_kanan:
Mov A,R3
RL A
Cjne A,#10h,Lanjut1
Mov R3,#01h
Mov A,#01h
Lanjut1:
Mov P2,A
Mov R3,A
Lcall LDelay
Mov P2,#0h
Djnz R2,Putar_kanan
Ret
Putar_kiri:
Mov A,R3
RR A
Cjne A,#80h,Lanjut
Mov R3,#08h
Mov A,#08h
Lanjut:
Mov P2,A
Mov R3,A
Lcall LDelay
Mov P2,#0h
Djnz R2,Putar_kiri
Ret
;
;-------------------
; sub routine delay
;-------------------
Ldelay: Mov R1,#13 ; delay ini tergantung dari x-tal
Delay: Mov R0,#0h ; yang dipasang
Djnz R0,$ ;
Djnz R1,Delay
Ret ;
;
End

You might also like