Bahasa Assembly dan command untuk DT51 trainer board Percobaan 1 Basic Input/Output Program 1.3
Monday, July 2, 2012
Program 1.3
$mod51 ; inisialisasi menggunakan mikrokontroler keluarga 51
PORTA EQU 2000H ; mengaktifkan port A pada alamat 2000H
PORTB EQU 2001H ; mengaktifkan port B pada alamat 2001H
CW EQU 2003H ; control word mengaktifkan port PPI
CSEG ; code segment
ORG 4000H ; program dimulai dari alamat 4000H
LJMP START ; long jump ke label START
DELAY:;label DELAY
MOV R7,#04H ; memberi nilai 04H ke R7
LUP1: MOV R6,#0FFH ; memberi nilai FFH ke R6
LUP2: MOV R5,#0FFH ; memberi nilai FFH ke R5
DJNZ R5,$ ;mengurangi 1 terus menerus hingga isi R5 menjadi 0
DJNZ R6,LUP2 ;mengurangi R6, jika R6 belum 0 jump ke LUP2
DJNZ R7,LUP1 ;mengurangi R7, jika R6 belum 0 jump ke LUP1
RET ;kembali dari subroutine ke perintah terakhir kali routine dipanggil
START: ; label START
MOV SP,#30H ;memberi nilai 30H ke stack pointer
INIT: MOV DPTR,#CW ;label INIT ; memasukkan nilai CW ke DPTR
MOV A,#82H ;memberi nilai 82H ke Acc
MOVX @DPTR, A ;memasukkan nilai A ke alamat yg ditunjuk DPTR
LOOP: MOV DPTR,#PORTB ; port B ditunjuk DPTR
MOVX A,@DPTR ;memindahkan nilai DPTR ke Acc
MOV DPTR,#PORTA ;memasukkan nilai port A ke alamat yg ditunjuk DPTR
MOVX @DPTR,A ;memasukkan nilai A ke alamat yg ditunjuk DPTR
ACALL DELAY ;memanggil label DELAY
SJMP LOOP ;short jump ke label LUP
END ; mengakhiri program
Analisis Program
Program ini menggunakan port A sebagai port output, port B sebagai input, control dihubungkan dengan control pada trainer board DT51 lalu inisialisasi port A, port B dan CW.
Program diawalai dengan :
>$mod51 ; inisialisasi menggunakan mikrokontroler keluarga 51
>PORTA EQU 2000H ; deklarasi menggunakan port A yang berada pada alamat 2000H
>PORTB EQU 2001H ; deklarasi menggunakan port B yang berada pada alamat 2001H
>CW EQU 2003H ; control word mengaktifkan port PPI pada alamat 2003H
>CSEG ; code segment
> ORG 4000H ; program dimulai dari alamat 4000H
>LJMP START ; long jump ke label START
>DELAY : MOV R7,#04H ; memberi nilai 04H ke R7
>LUP1: MOV R6,#0FFH ; memberi nilai FFH ke R6
>LUP2: MOV R5,#0FFH ; memberi nilai FFH ke R5
>DJNZ R5,$ ;mengurangi 1 terus menerus hingga isi R5 menjadi 0
>DJNZ R6,LUP2 ;mengurangi R6, jika R6 belum 0 jump ke LUP2
>DJNZ R7,LUP1 ;mengurangi R7, jika R6 belum 0 jump ke LUP1
>RET ;kembali dari subroutine ke perintah terakhir kali routine dipanggil
>START: MOV SP,#30H ;memberi nilai 30H ke stack pointer
> INIT: MOV DPTR,#CW ;label INIT ; data pointer menunjuk CW
>MOV A,#82H ;memberi nilai 82H ke Acc
82H binernya 1000 0010 merupakan nilai CW
MSB (setflag) harus bernilai 1 untuk aktifasi PPI port
D5 dan D6 berarti mode select 0 nilainya 00
D4 diset 0 sebab port A sebagai output
D3 diset 0 sebab port C upper sebagai output
D2 menggunakan mode 0 jadi 0
D1 diset 1 sebab port B sebagai input
D0 diset 0 sebab port C lower sebagai output
>MOVX @DPTR, A ;memasukkan nilai A ke alamat yg ditunjuk DPTR
>LOOP: MOV DPTR,#PORTB ; port B ditunjuk DPTR
>MOVX A,@DPTR ;Acc diberi nilai dari alamat yang ditunjuk DPTR
>MOV DPTR,#PORTA ; port A ditunjuk DPTR
> MOVX @DPTR,A ;memasukkan nilai A ke alamat yg ditunjuk DPTR
> ACALL DELAY ;memanggil label DELAY
>SJMP LOOP ;short jump ke label LUP
>END ; mengakhiri program
Tampilan LED sesuai dengan input yang diberikan pada switch, missal switch bit ke 1 maka LED bit 1 menyala.
Delay :
Delay =2x255+3=513
Lup1=255x513+3=130818
Lup2=4x130818+3=523575 mikrosekon = 0,5 detik
Delay=523575x1,o8 mikrosekon
=565135 mikrosekon=0,5 detik
Dalam perhitungan delay stack pointer digunakan untuk menunjukkan pemanggilan delay karena SP dapat dinaikkan dengan intruksi CALL dan PUSH.