;************************************
;* PENGGUNAAN OPRASI DASAR
I/O *
;* RUDI SETIAWAN *
;* 14 MARET 2014 *
;************************************
cacah equ -10000 ;cacah
nilainya sama dengan -10000
org 0h ;wajib
ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h ;menggunakan
timer mode 1
utama: ;inisial
"utama"
call tunda ;memanggil
sub rutin tunda
sjmp utama ;melompat
ke inisial utama
tampilan1 : ;inisial
"tampilan1
mov r2,#3 ;mengisi
register r2 dengan data 3
ulang: ;inisial
"ulang"
mov p1,#11111110b ;pengisian data pada port p1
acall tunda ;memanggil
sub rutin tunda
mov p1,#11111101b
acall tunda
mov p1,#11111011b
acall tunda
mov p1,#11110111b
acall tunda
mov p1,#11101111b
acall tunda
mov p1,#11011111b
acall tunda
mov p1,#10111111b
acall tunda
mov p1,#01111111b
acall tunda
djnz r2, ulang ;jika
nilai dari register r2 belum 0 maka melompat ke inisial ulang (mengulang
sejumlah isi r2)
tampilan2 : ;inisial "tampilan2"
mov p1,#00000000b ;pengisian data pada port p1 menjadi 00000000
berarti LED menyala semua jika aktif low
acall tunda ;memanggil sub rutin tunda
setb p1.0 ;mengeset kodisi p1.0 menjadi 1
acall tunda ;memanggil sub rutin tunda
setb p1.1 ;mengeset kodisi p1.1 menjadi 1
acall tunda
setb p1.2
acall tunda
setb p1.3
acall tunda
setb p1.4
acall tunda
setb p1.5
acall tunda
setb p1.6
acall tunda
setb p1.7
acall tunda
ljmp tampilan1 ;melompat
ke inisial tampilan1
tampilan3: ;inisial "tampilan3"
mov p1,#11111111b ;pengisian data pada port p1 menjadi 11111111
berarti LED mati semua jika aktif low
acall tunda ;memanggil sub rutin tunda
sjmp tampilan3 ;melompat
ke inisial tampilan3
;program penundaan
waktu satu detik
tunda: :
;inisial sub rutin"tunda"
mov R1,#100 ;mengisi
data r1 dengan nilai 100
lagi: mov
th0,#high cacah ;mengisi th0 dengan
nilai cacah (diatas tadi)
mov tl0,#low cacah ;mengisi tl0
dengan nilai cacah low berarti 0
setb tr0 ;mengeset
kondisi tr0 berkondisi 1tunggu:
jnb tf0,tunggu ;jika
tf0 belum 0 maka melompat ke tunggu jika sudah maka lanjut ke bawahnya
clr tf0 ;membersihkan data pada tf0
clr tr0 ;membersihkan data pada tr0
djnz R1,lagi ;mengulang
sejumlah nilai r1 belum 0 maka lompat ke lagi. atau 100 kali sesuai nilai r1
jnb p2.0,tampilan1 ;jika p2.0
bernilai 0 maka melompat ke inisial tampilan1
jnb p2.1,tampilan3 ;jika p2.1
bernilai 0 maka melompat ke inisial tampilan3
ret ;program
sub rutin tunda selesai kembali ke program utama
end ;tanda
bahwa program selesai di tulis
bisa dilihat bahwa program diatas
memanggil tunda berulang kali. Jika program tunda tidak di tulis dalam sub
rutin maka kita harus menulisnya berulang kali, tapi disini kita cukup
menulisnya selaki kemudian kita panggil seperlu kita.
Kenapa dibutuhkan penundaan ? jika
tidak dilakukan penundaan maka proses akan berjalan dengan sangan cepat, dengan
kecepatan 12 MHz sesuai Kristal yang terpasang. sehingga mata kita tidak mampu
melihat perubahan nya.
Nah program diatas meruakan program
yang sangat sederhana dengan susunan algoritma yang sanyat dederhana sehingga
membutuhkan tempat yang banyak. Sekarang kita akan belajar manggunakan sedikit
aritmatika sehingga akan meringkas program. Berikut ini beberapa instruksi yang
digunakan namun perlu di ingat bahwa instruksi ini hanya bisa digunakan di
akumularor atau register A. jadi data harus dibawa terlebih dahulu ke register
ini. Perintah yang digunakan MOV adalah :
Mov
a,#11111110b ;mengisi register a dengan data 11111110b
Mov
a,p1 :mengisi
register a dengan data yang ada pada port p1
Untuk
catatan jika melakukan pemindahan data menggunakan perintah MOV maka
instruksinya adalah :
Mov (tujuan kemana data di
pindah),#(asal data yang akan dipindah)
Instruksi yang akan kita gunakan
antara lain sebagai berikut :
1.
Rl (rotate
left) dan Rr (rotate right)
Instruksi Rl digunakan untuk menggeser data ke kiri satu
perubahan. Untuk lebih jelasnya langsung kita ke program saja.
;**********************************
;* PENGGUNAAN OPRASI RR
dan RL *
;* RUDI SETIAWAN *
;* 14 MARET 2014 *
;**********************************
cacah equ -10000 ;cacah nilainya sama dengan
-10000
org 0h ;wajib
ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h ;menggunakan
timer mode 1
;program utama
utama: ;inisial
"utama"
call tunda ;memanggil sub rutin tunda
sjmp utama ;melompat ke inisial utama
tampilan1 : ;inisial "tampilan1
mov r2,#8 ;mengisi register r2 dengan data
8
mov a,#11111110b ;pengisian register a dengan
data yang ada pada port p1
ulang: ;inisial
"ulang"
mov p1,a ;mengisikan
data yang ada pada register a ke port p1 agar bisa dilihat
acall tunda ;memanggil sub rutin tunda
rl a ;geser kekiri satu perubahan
djnz r2, ulang ;jika
nilai dari register r2 belum 0 maka melompat ke inisial ulang (mengulang
sejumlah isi r2)
tampilan2 : ;inisial "tampilan2"
mov r2,#8 ;mengisi register r2 dengan data
8
mov p1,#01111111b ;pengisian data pada port p1 menjadi
00000000 berarti LED menyala semua jika aktif low
mov a,p1 ;memindahkan
data pada port p1 ke register a
ulang1: ;inisial
"ulang1"
mov p1,a ;mengisikan
data yang ada pada register a ke port p1 agar bisa dilihat
acall tunda ;memanggil
sub rutin tunda
rr a ;geser kekanan satu perubahan
djnz r2, ulang1 ;jika nilai dari register
r2 belum 0 maka melompat ke inisial ulang (mengulang sejumlah isi r2)
ljmp tampilan1 ;melompat
ke inisial tampilan1
tampilan3: ;inisial
"tampilan3"
mov p1,#11111111b ;pengisian data pada port p1 menjadi
11111111 berarti LED mati semua jika aktif low
acall tunda ;memanggil
sub rutin tunda
sjmp tampilan3 ;melompat
ke inisial tampilan3
;program
penundaan waktu 0.5 detik
tunda: mov
R1,#50 ;mengisi r1
dengan 50 yang tadinya 100, menjadi
setengahnya
lagi:mov th0,#high cacah ;mengisi th0 dengan nilai cacah
(diatas tadi)
mov tl0,#low cacah ;mengisi
tl0 dengan nilai cacah low berarti 0
setb tr0 ;mengeset
kondisi tr0 berkondisi 1
tunggu: jnb tf0,tunggu ;jika tf0 belum 0 maka
melompat ke tunggu jika sudah 0 maka lanjut ke bawahnya
clr tf0 ;membersihkan
data pada tf0
clr tr0 ;membersihkan
data pada tr0
djnz R1,lagi ;mengulang
sejumlah nilai r1 belum 0 maka lompat ke lagi. atau 100 kali sesuai nilai r1
jnb p2.0,tampilan1 ;jika p2.0 bernilai 0 maka melompat ke
inisial tampilan1
jnb p2.1,tampilan3 ;jika p2.1 bernilai 0 maka melompat ke
inisial tampilan3
ret ;program
sub rutin tunda selesai kembali ke program utama
end ;tanda
bahwa program selesai di tulis
Untuk
catatan jika menggunakan perintah mov a,(port yang di inginkan) jangan
lupa menuliskan perintah mov (port yang di inginkan), a agar data bida
dilihat tapi missal data tidak perlu ditampilkan tidak ditulis juga tidak apa.
2.
ADD
Instruksi untuk melakukan operasi penjumlahan pada dua buah data
yang terdapat pada alamat register yang ditunjuk oleh instruksi atau data
langsung yang kita inginkan. Contoh programnya :
mov a,#11111110b ;pengisian register a
dengan data 11111110b
add a,#00000001b ;menambahkan data
pada register a dengan 00000001b
maka hasil yang diperoleh adalah :
|
11111110b
|
|
|
00000001b
|
+
|
|
11111111b
|
|
3.
ADDC
Instruksi melakukan operasi
penjumlahan data pada dua buah data disertai penjumlahan data pada carry
flag.
4.
DEC & INC
Instruksi DEC digunakan untuk menurunkan satu tingkat nilah dari
register yang di inginkan. Contoh :
Mov r3,#3 ;data
register r3 adalah 3
Dec r3 ;data
register r3 sekarang menjadi 2
Sedangkan instruksi INC untuk menaikkan nilai satu tingkat.
Untuk catatan
instruksi ini hanya bisa digunakan pada register saja baik r0 – r7 atau
akumulator / register a
5.
DIV
Instuksi ini melakukan operasi pembagian dua buah data dan
menyimpan hasilnya pada alamat data yang ditunjuk.
6.
MUL
Instruksi
ini digunakan untuk melakukan operasi perkalian data antara dua buah register.
7.
SUBB
Instruksi ini melakukan operasi pengurangan data antara dua buah
alamat register beserta dengan bit carry flag.
Selain itu kita juga bisa mengunakan
instruksi yang berkaitan dengan gerbang logika diantaranya.
1.
ANL
Instruksi ini digunakan untuk meng AND kan 2 buah dara yang ada
dalam suatu redister
2.
ORL
Instruksi ini digunakan untuk meng OR kan 2 buah dara yang ada
dalam suatu redister
3.
XRL
Instruksi ini digunakan untuk meng XOR kan 2 buah dara yang ada
dalam suatu redister
PENDALAMAN PROGRAM
Setelah membaca set instruksi di atas tentunya sudah ada
gambaran kan. Nah sekarang langsung saja kita lakukan eksperiman. Jika pada
bagian debelumnya kita gunakan LED maka kali ini kita akan menggunakan 7
segment. Perlu di ingat bahwa 7segment pada LIGHTNINGINO_as51 pada port P3.
Kita akan membuat program menghitung naik dan turun pada
LIGHTNINGINO_as51 dengan tombol UP DOWN dan STOP. Program sebagai berikut
;**********************************
;* PENGOPRASIAN 7SEGMENT *
;* RUDI SETIAWAN *
;* 14 MARET 2014 *
;**********************************
cacah equ -10000 ;cacah nilainya
sama dengan -10000
org 0h ;wajib
ditulis menandakan bahwa program dimulai dari alamat 00h
mov tmod,#01h ;menggunakan
timer mode 1
utama: ;inisial
"utama"
call tunda ;memanggil
sub rutin tunda
sjmp utama ;melompat
ke inisial utama
naik: ;inisial
"naik"
mov r3,#10 ;mengisi
register r3 dengan data 10
mov dptr, #data_naik ;mengisi DPTR dengan kumpulan data ber
inisial data_naik
isi: clr a ;inisial
"isi" dan membersihkan register a
movc a,@a+dptr ;memindah data pertama pada DPTR
ke register a
mov p3,a ;menampilkan data dengan memindah ini a
ke port P3
inc dptr ;menaikkan
data pada dptr nenjadi data kedua
acall tunda ;melakukan penundaan
agar terlihat panggil tunda
djnz r3,isi ;jika r3 belim 0
lompat ke inisial isi
sjmp naik ;lompat ke inisial "naik"
turun: ;inisial
"turun"
mov r3,#10 ;mengisi
register r3 dengan data 10
mov dptr, #data_turun ;mengisi DPTR dengan kumpulan data ber inisial
data_turun
isi1: clr a ;inisial
"isi1" dan membersihkan register a
movc a,@a+dptr ;memindah data pertama pada DPTR
ke register a
mov p3,a ;menampilkan data dengan memindah ini a
ke port P3
inc dptr ;menaikkan
data pada dptr nenjadi data kedua
acall tunda ;melakukan penundaan
agar terlihat panggil tunda
djnz r3,isi1 ;jika r3 belim 0
lompat ke inisial isi1
sjmp turun ;lompat ke inisial
"turun"
mati: mov
p3,#0ffh ;mengisi
port P3 dengan data ffh
acall tunda ;melakukan penundaan
agar terlihat panggil tunda
sjmp mati ;lompat ke inisial "mati"
tunda: mov R1,#50 ;mengisi
r1 dengan 50 yang tadinya 100, menjadi
setengahnya
lagi:mov
th0,#high cacah ;mengisi th0
dengan nilai cacah (diatas tadi)
mov tl0,#low cacah ;mengisi tl0 dengan nilai cacah low
berarti 0
setb tr0 ;mengeset
kondisi tr0 berkondisi 1
tunggu: jnb tf0,tunggu ;jika tf0 belum 0 maka
melompat ke tunggu jika sudah 0 maka lanjut
clr tf0 ;membersihkan data pada tf0
clr tr0 ;membersihkan data pada tr0
djnz R1,lagi ;mengulang
sejumlah nilai r1 belum 0 maka lompat ke lagi.
jnb p2.0,naik ;jika p2.0 bernilai 0 maka
melompat ke inisial naik
jnb p2.1,turun ;jika p2.1 bernilai 0 maka
melompat ke inisial turun
jnb p2.2,mati ;jika p2.1 bernilai 0 maka
melompat ke inisial mati
ret ;program sub rutin tunda
selesai kembali ke program utama
data_naik:
db 0c0h, 0f9h, 0a4h, 0b0h, 099h, 092h, 082h, 0f8h, 080h,
090h
data_turun:
db 090h, 080h, 0f8h, 082h, 092h, 099h, 0b0h, 0a4h, 0f9h,
0c0h
end ;tanda
bahwa program selesai di tulis
catatan, tentu anda bingung kenapa datanya tidak ditulis
seperti pada awal dulu satu persatu. Kali ini kita gunakan DPTR dimana datanya
ditampung dalam bentuk inisial
dan ditulis memanjang.
Jadi makin simple kan. Tentu bgi anda yang awam masih binung kok datanya tidak
1 dan 0. Nah begini penjelasannya.
Missal data 00001100b jika ditulis dalam hexa decimal maka menjadi 00ch
Jika kita
menggunakan data biner maka bagian belakan gharus diberi tambahan _ _ _ _ _ _ _
_b
Jika kita
menggunakan data hexa decimal maka tambahan 0 didepan dan h dibelakang 0 _ _h
Kali ini kita
akan membagas bagaimana cara menyalakan 4 buah segment dengan 2 port caranya
dengan menyalakan bergantian dalam waktu yang cepat sehingga kita akan melihat
4 segmant menyala bersamaan padahal menyalanya bergantian. Nah kita gunakan
sumulasi yang disertakan dalam CD.
IMG LOADING
Programmnya
sebagai berikut kita akan menampilkan angka 0 1 2 3 sekaligus.
;**********************************
;* menyalakan 4x
7segment C anoda *
;* rudi setiawan *
;* 14 maret 2014 *
;**********************************
org 0h
mulai: mov p3,#0c0h ;keluarkan data angka 0
clr p0.4 ;hidupkan common
1
call delay ;tunda sebentar
setb p0.4 ;matikan common
call delay ;tunda sebentar
mov p3,#0f9h ;keluarkan data angka 1
clr p0.5
call delay
setb p0.5
call delay
mov p3,#0a4h ;keluarkan data angka 2
clr p0.6
call delay
setb p0.6
call delay
mov p3,#0b0h ;keluarkan data angka 3
clr p0.7
call delay
setb p0.7
call delay
ajmp mulai
delay: ;tunda ini digunakan agar
7segment kelihatan
mov r1,#1 ;menyala bersamaan
delay1:
djnz r0,$
djnz r1,delay1
ret
end
sebagian tidak saya tulis penjelasannya karena telah
dijelaskan pada program sebelumnya. Nah program ini bisa di aplikasikan untuk
membuat jam digitall dan running teks. Selamat mencoba.
Selanjutnya
kita akan melakukan eksperimen untuk mengontrol motor dengan emnggunakan tombol
untuk perintah maju mundur dan stop. Nah untuk pengembangannya bisa digunakan
untuk membuat robor line follower dan robit lain yang menggunakan system gerak
motor langsung aja kita ke program. Sebelumnya kita gunakan simulasi
LIGHTNINGINO_AS51 atau kalau ingin langsung ke board LIGHTNINGIINO_AS51 juga
bisa. Langsung
IMG LOADING
Program sebagai berikut dengan output
yang dipakai p3.0 dan p3.1 dan tombol p2.0,mundur ; p2.1,maju ; p2.2,mati
;*************************************
;*
MOTOR MAJU MUNDUR DENGAN TOMBOL*
;* rudi setiawan *
;* 14 maret 2014 *
;*************************************
cacah
equ -10000 ;cacah
nilainya sama dengan -10000
org
0h ;wajib ditulis
menandakan bahwa program dimulai dari alamat 00h
mov
tmod,#01h ;menggunakan
timer mode 1
utama: ;inisial
"utama"
call
tunda ;memanggil
sub rutin tunda
sjmp
utama ;melompat
ke inisial utama
maju: ;inisial
"maju"
mov
p3,#11111101b ;yang digunakan 2
digit terakhir mengaktifkan transistor
mov
p1,#11111101b ;menampilkan data
pada LED port p1
acall
tunda ;melakukan
penundaan agar terlihat panggil tunda
sjmp
maju ;lompat ke
inisial "maju"
mundur: ;inisial
"mundur"
mov
p3,#11111110b ;yang digunakan 2
digit terakhir mengaktifkan transistor
mov
p1,#11111110b ;menampilkan data
pada LED port p1
acall
tunda ;melakukan
penundaan agar terlihat panggil tunda
sjmp
mundur ;lompat ke
inisial "mundur"
mati:
mov p3,#0ffh ;mengisi
port P3 dengan data ffh motor mati
acall tunda ;melakukan penundaan
agar terlihat panggil tunda
sjmp mati ;lompat ke inisial "mati"
tunda: mov R1,#10 ;mengisi
r1 dengan 10 SEKEDAR MEMBERI TUNDA
lagi:mov
th0,#high cacah ;mengisi th0
dengan nilai cacah (diatas tadi)
mov tl0,#low cacah ;mengisi tl0 dengan nilai cacah low
berarti 0
setb tr0 ;mengeset
kondisi tr0 berkondisi 1
tunggu: jnb tf0,tunggu ;jika tf0 belum 0 maka
melompat ke tunggu jika sudah 0 maka lanjut clr
tf0 ;membersihkan
data pada tf0
clr tr0 ;membersihkan data pada tr0
djnz
R1,lagi ;mengulang
sejumlah nilai r1 belum 0 maka lompat ke lagi. atau 100 kali sesuai nilai r1
jnb p2.0,mundur ;jika p2.0 bernilai 0 maka
melompat ke inisial maju
jnb p2.1,maju ;jika p2.1 bernilai 0 maka melompat
ke inisial mati
jnb p2.2,mati
ret ;program sub rutin tunda selesai
kembali ke program utama
end ;tanda
bahwa program selesai di tulis
wah lanjutin lagi ya eksperimennya
sekarang kita coba untuk buat simulasi lampu perempatan yang pernah saya buat
juga waktu ujian UKK SMK. Kita gunakan p2.0 sebagai start dan p2.1 sebagai
SPOT. Gambar rangkaian dan simulasinya sebagai berikut, tetap menggunakan
simulasi yang sama. Atau jika menggunakan LIGHTNINGINO_AS51 bisa langsung
dilihat hasilnya.
IMG LOADING
;*************************************
;*
MOTOR MAJU MUNDUR DENGAN TOMBOL*
;* rudi setiawan *
;* 14 maret 2014 *
;*************************************
ratusan
equ 10
cacah
equ -10000
org
0h
mov
tmod,#01h
;############siap
menerima instruksi#####
SIAP:
call
tunda
sjmp
siap
;#######program
utama penambilan data####
start:
mov
p1,#11110110b
mov
p3,#11110110b
mov
p1,#11110011b
call
tunda_hijau
mov
p1,#11110101b
call
tunda_kuning
mov
p1,#11110110b
call
tunda_merah
mov
p1,#11011110b
call
tunda_hijau
mov
p1,#11101110b
call
tunda_kuning
mov
p1,#11110110b
call
tunda_merah
mov
p3,#11011110b
call
tunda_hijau
mov
p3,#11101110b
call
tunda_kuning
mov
p3,#11110110b
call
tunda_merah
mov
p3,#11110011b
call
tunda_hijau
mov
p3,#11110101b
call
tunda_kuning
mov
p3,#11110110b
call
tunda_merah
sjmp
start
;######program
pengunci untuk stop#####
stop:
mov
p1,#0ffh
mov
p3,#0ffh
acall
tunda
mov
p1,#00h
mov
p3,#00h
acall
tunda
sjmp
stop
;#########program
penundaan waktu######
tunda: mov r2,#10
bounching: mov R1,#ratusan
lagi: mov th0,#high cacah
mov tl0,#low cacah
setb tr0
tunggu: jnb tf0,tunggu
clr tf0
clr tr0
djnz R1,lagi
jnb p2.1,stop
jnb p2.0,start
mov p2,#0ffh
djnz r2,bounching
ret
tunda_hijau:
mov r3,#5
ulang1:
acall tunda
djnz r3,ulang1
ret
tunda_kuning:
mov r3,#2
ulang2:
acall tunda
djnz r3,ulang2
ret
tunda_merah:
mov r3,#2
ulang3:
acall tunda
djnz r3,ulang3
ret
end
untuk
program saya kira sudah tidak perlu dijelaskan lagi kan. ini mengunakan
instruksi dasar semua. Selamat mencoba. Nah ini bisa ditambahkan dengan
penghitung waktu mundur dengan memanfaatkan segment yang ada pada
LIGHTNINGINO_AS51.
KIT
LIGHTNINGINO AS_51 bisa didapatkan di
rudi => 089 679 132 022