Pada pembahasan kali ini, akan dijelaskan mengenai bagaimana cara mem-program mikrokontroller MCS-51 dengan menggunakan assembly code atau program assembly, langkah-langkah awal agar bisa mengetahui bagaimana cara mem-program dengan bahasa assembly yang pertama yaitu melakukan percobaan menghidupkan dan mematikan led dari port mikrokontroller., software yang digunakan bisa MIDE-51, atau TASM dan T-LINK berikut gambar dan program untuk led blinking.
Langkah 1 : Blinking Led
start:
start:
mov
p0,#11110000B
acall
delay
mov
p0,#00001111B
acall
delay
ajmp
start
delay:
mov r7,#00h
ulang2:
mov r6,#00h
ulang1:
mov r5,#00h
ulang:
inc r5
cjne
r5,#40h,ulang
inc
r6
cjne
r6,#40h,ulang1
inc
r7
cjne
r7,#40h,ulang2
ret
end
Langkah 2 Running LED :
start:
mov
p0,#01111111B
acall
delay
mov
p0,#10111111B
acall
delay
mov
p0,#11011111B
acall
delay
mov
p0,#11101111B
acall
delay
mov
p0,#11110111B
acall
delay
mov
p0,#11111011B
acall
delay
mov
p0,#11111101B
acall
delay
mov
p0,#11111110B
acall
delay
mov
P0,P1
ajmp
start
delay:
mov r7,#00h
ulang2:
mov r6,#00h
ulang1:
mov r5,#00h
ulang:
inc r5
cjne
r5,#40h,ulang
inc
r6
cjne
r6,#40h,ulang1
inc
r7
cjne
r7,#40h,ulang2
ret
end
Langkah 3 : Komunikasi dengan LCD 16x2
;===Koneksi
LCD RS=p3.2, E=p3.3, Data=P1====
ORG
000H
AJMP
START
;=======LCD
KONSTANTA======
DISPCLR
EQU 00000001B
FUNCSET
EQU 00111000B
ENTRMOD
EQU 00000110B
DISPON
EQU 00001100B
ORG
100H
START:
LCALL
INITLCD
MOV
A,#80H
CALL
INSTLCD
MOV
DPTR,#TULISAN1
CALL
LCDSTRING
LOOP:
AJMP LOOP
;=======PROSEDUR
KONTROL DATA OPERASI========
INSTLCD:
CLR
P3.2 ;RS=0 fo LCD instr
SJMP
LCDOUT
DATALCD:SETB
P3.2 ;RS=1 fo LCD data ASCII
SJMP
LCDOUT
LCDOUT:
MOV P1,A ;send ASCII/instr to LCD
SETB
P3.3 ;send pulse enab to LCD
CLR
P3.3
SETB
P3.3
LCALL
DELAY
RET
;=======PROSEDUR
INISIALISASI LCD=============
INITLCD:
MOV
A,#DISPCLR
LCALL
INSTLCD
LCALL
DELAY
MOV
A,#FUNCSET
LCALL
INSTLCD
LCALL
DELAY
MOV
A,#DISPON
LCALL
INSTLCD
LCALL
DELAY
MOV
A,#ENTRMOD
LCALL
INSTLCD
LCALL
DELAY
RET
;=======PROSEDUR
PENULISAN DATA KE LCD
WR_DT:
ADD
A,#30H
LCALL
DATALCD
LCALL
DELAY
RET
;=======PROSEDUR
CETAK STRING=========
PRINTSTRINGLOOP:
LCALL
DATALCD
INC
DPTR
LCDSTRING:
CLR
A
MOVC
A,@A+DPTR
JNZ
PRINTSTRINGLOOP
RET
;=======PROSEDUR
DELAY=========
DELAY:
MOV
R6,#20
MUTER:
MOV
R7,#250
DJNZ
R7,$
DJNZ
R6,MUTER
RET
;=======DATABASE
STRING=======
TULISAN1:
DB
'HELLO WORLD',0
END
Penjelasan:
Jadi
pertama mendeklarasikan inisial LCD 16x2 dengan output 4 bit, pada program
berikut
DISPCLR
EQU 00000001B
FUNCSET
EQU 00111000B
ENTRMOD
EQU 00000110B
DISPON
EQU 00001100B
Kemudian
perintah CLR P3.2 akan mengirimkan nilai 0 pada RS sehingga akan mereset
tampilan lcd, jika RS bernilai 1 maka akan mulai menuliskan karakter, untuk
perintah berikut INITLCD:
MOV
A,#DISPCLR
LCALL
INSTLCD
LCALL
DELAY
MOV
A,#FUNCSET
LCALL
INSTLCD
LCALL
DELAY
MOV
A,#DISPON
LCALL
INSTLCD
LCALL
DELAY
MOV
A,#ENTRMOD
LCALL
INSTLCD
LCALL
DELAY
RET
Adalah perintah yang digunakan untuk
memasukkan konstanta LCD ke dalam nilai A secara berurutan, sehingga LCD bisa
di set ke dalam format 4 bit data dan 16x2
WR_DT:
ADD
A,#30H
LCALL
DATALCD
LCALL
DELAY
RET
Program
diatas adalah program untuk menuliskan karakter ke LCD ADD A, #30H untuk
menambahkan nilai atau isi A dengan 30H untuk memberikan nilai penulisan,
kemudian data yang akan dituliskan dipanggil melalui perintah LCALL DATALCD
dengan ditambah delay. Data yang akan dikirimkan ke LCD ada dibaris program
berikut
TULISAN1:
DB
'HELLO WORLD',0
Program
untuk mengirimkan data ke lcd yaitu ada pada program
MOV
A,#80H
CALL
INSTLCD
MOV
DPTR,#TULISAN1
CALL
LCDSTRING
Pertama
memasukkan nilai 80H ke dalam register A yang digunakan untuk perintah write
atau output, kemudian memanggil spesifikasi lcd yang akan digunakan, setelah
itumengirimkan tulisan ke DPTR adalah pointer penunjuk tempat, LCDSTRING adalah
untuk mendeklarasikan string dan pointer / penempatan karakter.
Langkah 4 : Menulis Karakter Huruf dan Angka di LCD
start:
K equ 01001011b
A equ 01000001b
D equ 01000100b
R equ 01010010b
;=======INISIALISASI LCD============
mov R0,#00111000b ;function set
acall instlcd
mov R0,#00000110b ;entry mode
acall instlcd
mov R0,#00001100b ;no cursor, blink off
acall instlcd
mov R0,#00000001b ;clear display
acall instlcd
;=======TAMPIL HURUF============
;======="KADAR"============
mov R0,#80h
acall instlcd
mov R0,#K
acall datalcd
mov R0,#81h
acall instlcd
mov R0,#A
acall datalcd
mov R0,#82h
acall instlcd
mov R0,#D
acall datalcd
mov R0,#83h
acall instlcd
mov R0,#A
acall datalcd
mov R0,#84h
acall instlcd
mov R0,#R
acall datalcd
;====TAMPILKAN ANGKA "3 DIGIT" SECARA MANUAL===
mov R2,#00
loop2:
mov a,R2
mov b,#100
div ab
mov R0,#086h
acall instlcd
add a,#30h
mov R0,a
acall datalcd
mov a,b
mov b,#10
div ab
mov R0,#087h
acall instlcd
add a,#30h
mov R0,a
acall datalcd
mov a,b
mov R0,#088h
acall instlcd
add a,#30h
mov R0,a
acall datalcd
acall delay
inc R2
sjmp loop2
;=======PROSEDUR IRLCD===============
instlcd:setb p3.3
clr p3.2 ; RS=0 E=1
acall delaylcd
mov P1,R0 ;send instruksi
acall delaylcd
clr p3.3 ; RS=0 E=0
acall delaylcd
setb p3.2 ; RS=0 E=1
acall delaylcd
ret
;=======PROCEDURE DTLCD===============
datalcd:setb p3.2
setb p3.3 ; RS=1 E=1
acall delaylcd
mov P1,R0 ; send data
acall delaylcd
clr p3.3 ; RS=1 E=0
call delaylcd
setb p3.3 ; RS=1 E=1
call delaylcd
ret
;=======PROSEDUR DELAYLCD===============
delaylcd:mov R1,#00
loop: inc R1
cjne R1,#99h,loop
ret
delay: mov R1,#00
loop1: inc R1
cjne R1,#40h,loop1
ret
Penjelasan:
Jadi
yang pertama dilakukan adalah mendefinisikan ASCII ke dalam bentuk biner pada
code
K
equ 01001011b
A
equ 01000001b
D
equ 01000100b
R
equ 01010010b
Terdapat
4 buah huruf yang akan ditampilkan kedalam LCD, kemudian inisialisasi LCD
dengan code berikut agar didapat format lcd 4 bit dan 16x2, serta no cursor,
blink off dan clear display
mov
R0,#00111000b ;function set
acall
instlcd
mov
R0,#00000110b ;entry mode
acall
instlcd
mov
R0,#00001100b ;no cursor, blink off
acall
instlcd
mov
R0,#00000001b ;clear display
acall
instlcd
setelah
itu code untuk menuliskan karakter di LCD dengan perintah berikut
mov
R0,#80h ; untuk menuliskan karakter ke LCD
acall
instlcd ; untuk memanggil space / tepat
pada lcd
mov
R0,#K ; untuk menuliskan huruf K
acall
datalcd ; untuk memanggil konfigurasi LCD
mov
R0,#81h ; untuk menulis karakter lcd di baris sebelahnya
acall
instlcd
mov
R0,#L ; untuk memanggil kode ASCII dari A
acall
datalcd
mov
R0,#82h ; untuk memberikan pointer di baris setelahnya
acall
instlcd
mov
R0,#D ; untuk memanggil kode ASCII D
acall
datalcd
mov
R0,#83h
acall
instlcd
mov
R0,#L
acall
datalcd
mov
R0,#84h
acall
instlcd
mov
R0,#R
acall
datalcd
setelah
itu untuk menampilkan digit angka up counter dengan 3 bit menggunakan code
berikut
mov
b,#100
div
ab
mov
R0,#086h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
kode
di atas adalah code untuk menampilkan digit ratusan atau 3 bit data karena
dibagi 100 akan menghasilkan nilai diga digit
mov
a,b
mov
b,#10
div
ab
mov
R0,#087h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
adalah
code untuk menampilkan digit puluhan karena di bagi dengan 10 sehingga
terdapat 2 digit angka sebagai puluhan
mov
a,b
mov
R0,#088h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
acall
delay
inc
R2
sjmp
loop2
adalah
kode untuk menampilkan satuan, karena tidak dilakukan pembagian dan juga
program up counter pada code inc R2 sehingga akan melakukan perulangan data
increment.
mov
P1,R0 ; send data
acall
delaylcd
adalah
kode untuk menuliskan nilai R2 yang berupa angka upcounter ke LCD dengan
ditambah delay
langkah 5 : Komunikasi Serial Kirim Data
;===Koneksi
LCD RS=p3.2, E=p3.3, Data=P1====
start:
;=======INISIALISASI
HURUF (Lihat tabel ASCII)========
K
equ 01001011b
L
equ 01000001b
D
equ 01000100b
R
equ 01010010b
Z
equ 01010000b
O
equ 01001111b
W
equ 01001100b
U
equ 01010101b
S
equ 01010011b
I
equ 01001001b
;=======INISIALISASI
LCD============
mov
R0,#00111000b ;function set
acall
instlcd
mov
R0,#00000110b ;entry mode
acall
instlcd
mov
R0,#00001100b ;no cursor, blink off
acall
instlcd
mov
R0,#00000001b ;clear display
acall
instlcd
;======INISIALISASI
KOMUNIKASI SERIAL===
baud
EQU 0E8h ; 1200 bps
MOV
SCON,#01010000b
MOV
TMOD,#00100000b
MOV
TCON,#01000000b
MOV
TH1 ,#baud
;=======TAMPIL
HURUF============
;======="KADAR"============
mov
R0,#80h
acall
instlcd
mov
R0,#K
acall
datalcd
mov
R0,#81h
acall
instlcd
mov
R0,#L
acall
datalcd
mov
R0,#82h
acall
instlcd
mov
R0,#D
acall
datalcd
mov
R0,#83h
acall
instlcd
mov
R0,#L
acall
datalcd
mov
R0,#84h
acall
instlcd
mov
R0,#R
acall
datalcd
;====TAMPILKAN
ANGKA "3 DIGIT" SECARA MANUAL===
mov
R2,#00
loop2:
mov
a,R2
;====Kirim
data ke serial port====
;JNB
TI,$ ;Tunggu data sebelumnya selesai
MOV
SBUF,a ;Kirim data baru
;CLR
TI ;Sinyal ada pengiriman baru
;====Serial
End=====
mov
b,#100
div
ab
mov
R0,#086h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
mov
a,b
mov
b,#10
div
ab
mov
R0,#087h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
mov
a,b
mov
R0,#088h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
acall
delay
inc
R2
sjmp
loop2
;=======PROSEDUR
IRLCD===============
instlcd:setb
p3.3
clr
p3.2 ; RS=0 E=1
acall
delaylcd
mov
P1,R0 ;send instruksi
acall
delaylcd
clr
p3.3 ; RS=0 E=0
acall
delaylcd
setb
p3.2 ; RS=0 E=1
acall
delaylcd
ret
;=======PROCEDURE
DTLCD===============
datalcd:setb
p3.2
setb
p3.3 ; RS=1 E=1
acall
delaylcd
mov
P1,R0 ; send data
acall
delaylcd
clr
p3.3 ; RS=1 E=0
call
delaylcd
setb
p3.3 ; RS=1 E=1
call
delaylcd
ret
;=======PROSEDUR
DELAYLCD===============
delaylcd:mov
R1,#00
loop:
inc R1
cjne
R1,#99h,loop
ret
delay:
mov r7,#00h
ulang2:
mov r6,#00h
ulang1:
mov r5,#00h
ulang:
inc r5
cjne
r5,#40h,ulang
inc
r6
cjne
r6,#40h,ulang1
inc
r7
cjne
r7,#40h,ulang2
ret
end
Langkah 6 : Komunikasi serial Input Keyboard
;===Koneksi
LCD RS=p3.2, E=p3.3, Data=P1====
start:
;=======INISIALISASI
HURUF (Lihat tabel ASCII)========
K
equ 01001011b
A
equ 01000001b
D
equ 01000100b
R
equ 01010010b
P
equ 01010000b
O
equ 01001111b
L
equ 01001100b
U
equ 01010101b
S
equ 01010011b
I
equ 01001001b
;=======INISIALISASI
LCD============
mov
R0,#00111000b ;function set
acall
instlcd
mov
R0,#00000110b ;entry mode
acall
instlcd
mov
R0,#00001100b ;no cursor, blink off
acall
instlcd
mov
R0,#00000001b ;clear display
acall
instlcd
;======INISIALISASI
KOMUNIKASI SERIAL===
baud
EQU 0E8h ; 1200 bps
MOV
SCON,#01010000b
MOV
TMOD,#00100000b
MOV
TCON,#01000000b
MOV
TH1 ,#baud
;=======TAMPIL
HURUF============
;======="KADAR"============
mov
R0,#80h
acall
instlcd
mov
R0,#K
acall
datalcd
mov
R0,#81h
acall
instlcd
mov
R0,#A
acall
datalcd
mov
R0,#82h
acall
instlcd
mov
R0,#D
acall
datalcd
mov
R0,#83h
acall
instlcd
mov
R0,#A
acall
datalcd
mov
R0,#84h
acall
instlcd
mov
R0,#R
acall
datalcd
;====TAMPILKAN
ANGKA "3 DIGIT" SECARA MANUAL===
loop2:
;====Ambil
data dari serial port====
JNB
RI,$ ;Tunggu SBUF berisi data baru
MOV
A,SBUF ;Ambil data
CLR
RI ;Penandaan data sudah diambil
;====Serial
End=====
mov
b,#100
div
ab
mov
R0,#086h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
mov
a,b
mov
b,#10
div
ab
mov
R0,#087h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
mov
a,b
mov
R0,#088h
acall
instlcd
add
a,#30h
mov
R0,a
acall
datalcd
acall
delay
sjmp
loop2
;=======PROSEDUR
IRLCD===============
instlcd:setb
p3.3
clr
p3.2 ; RS=0 E=1
acall
delaylcd
mov
P1,R0 ;send instruksi
acall
delaylcd
clr
p3.3 ; RS=0 E=0
acall
delaylcd
setb
p3.2 ; RS=0 E=1
acall
delaylcd
ret
;=======PROCEDURE
DTLCD===============
datalcd:setb
p3.2
setb
p3.3 ; RS=1 E=1
acall
delaylcd
mov
P1,R0 ; send data
acall
delaylcd
clr
p3.3 ; RS=1 E=0
call
delaylcd
setb
p3.3 ; RS=1 E=1
call
delaylcd
ret
;=======PROSEDUR
DELAYLCD===============
delaylcd:mov
R1,#00
loop:
inc R1
cjne
R1,#99h,loop
ret
delay:
mov r7,#00h
ulang2:
mov r6,#00h
ulang1:
mov r5,#00h
ulang:
inc r5
cjne
r5,#40h,ulang
inc
r6
cjne
r6,#40h,ulang1
inc
r7
cjne
r7,#40h,ulang2
ret
end
Penjelasan:
Jadi
untuk memasukkan karakter huruf dan angka ke LCD sama seperti langkah
sebelumnya yaitu inisialisasi dan deklarasi pin, kemudian RS bernilai 1 untuk
memasukkan data ke LCD, dan code untuk menerima data input dari keyboard yaitu
code
JNB
RI,$ ;Tunggu SBUF berisi data baru
MOV
A,SBUF ;Ambil data
CLR
RI ;Penandaan data sudah diambil
Jadi
nilai serial masuk ke dalam SBUF melalui port RX, TX kemudian dimasukkan
kedalam variabel a untuk dieksekusi datanya, dan untuk menampilkan data ke LCD
yaitu dengan code
mov
P1,R0 ; send data
acall
delaylcd
No comments:
Post a Comment