Translate

Assembly Code For AT89S51

Assembly Code For AT89S51

           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:
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:
;=======INISIALISASI HURUF (Lihat tabel ASCII)========
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