Categories
Mikrokontroler

Pengurutan Data menggunakan Mikrokontroler AT89 (8051)

Bagi Anda yang saat ini sedang mengalami kesulitan bagaimana membuat program untuk mengurutkan data yang sudah tersimpan di dalam memori RAM, Anda sedang berada di artikel yang tepat, karena kali ini saya membahas sebuah program (relatif) kecil dalam bahasa Assembly untuk Mikrokontroler AT89 atau kompatibel 8051 untuk mengurutkan data.

Okey, mari kita mulai dengan beberapa deklarasi di awal program….

	ORG  	00H
SIZE  	EQU	10
ARRAY  	EQU 	50H   	;Data starting address
FLAG  	BIT   	00H   	;Exchange logo

Program diawali dengan menentukan alamat awal program yaitu mulai 0x00 (dengan instruksi ORG), kemudian diikuti dengan deklarasi beberapa variabel, yaitu SIZE yang merupakan jumlah data yang akan diurutkan, ARRAY yang merupakan alamat awal data dan sebuah variabel bit FLAG yang akan digunakan sebagai tanda untuk pertukaran data (data exchange).

SORT:
	MOV  	R0,#ARRAY 	;The first address entered into R0
	MOV  	R7,#SIZE-1	;By a number of data input to R7
	CLR  	FLAG   		;Exchange of zero mark
COON:
	MOV  	A,@R0   	;Will first address the contents of the read A
	MOV   	R2,A   		;Write data to the R2,
	INC  	R0  		;The first address plus one
	MOV  	B,@R0 		;Will first address the contents of the read B
	CJNE  	A,B,NOTEQUAL	;Not equal, jump
	SJMP  	NEXT

Selanjutnya, program diawali dengan melakukan inisialisasi proses pengurutan. Register R0 digunakan untuk menyimpan alama awal data (melalui variabel ARRAY). Register R7 digunakan untuk menyimpan jumlah data yang akan diurutkan, kemudian variabel FLAG dibuat berisi 0 (logika LOW).

Kita baca dulu data satu persatu, mulai dari lokasi RAM yang ditunjuk oleh R0 (@R0) disimpan ke dalam akumulator A dan register R2, kemudian dilanjutkan dengan berikutnya (nilai R0 dinaikkan satu dengan instruksi INC), simpan ke register B dan dibandingkan (menggunakan CJNE). JIka A tidak sama dengan B, artinya bahwa dua data yang berturutan adalah tidak sama, lakukan lompatan ke label NOTEEQUAL untuk pemrosesan lebih lanjut (dijelaskan di paragraf berikut), jika sama lanjutkan dengan data berikutnya (SJMP NEXT), artinya tidak perlu dilakukan penukaran data.

NOTEQUAL:
	JC  	NEXT   		;After the former small-large, non-exchange
	SETB  	FLAG      	;After the front of a small, home exchange logo
	XCH  	A,@R0     	;Exchange
	DEC  	R0          	;R0 by a
	XCH  	A,@R0
	INC   	R0
NEXT:
	DJNZ   	R7,COON		;R7 does not equal 0 go to GOON (ie no exchange end)
	JB  	FLAG,SORT	;FLAG=1 to SORT to clear FLAG
	SJMP   	$

	END

Jika dua data yang saling berturutan tidak sama maka harus dilakukan penukaran data. Jika data pertama lebih kecil dari data kedua, tidak perlu dilakukan penukaran data (algoritma yang sedang kita bahas ini adalah mengurutkan dari data kecil ke data besar atau ascending). sehingga langsung lompat ke NEXT (menggunakan JC), yang akan melanjutkan ke data berikutnya dan data yang diproses berkurang satu (menggunakan DJNZ untuk mengurangi R7 dan jika belum berisi NOL lompat ke COON untuk melanjutkan data berikutnya).

Lantas apa yang terjadi jika harus dilakukan penukaran data? Langsung saja FLAG dibuat berisi 1 (HIGH), lakukan penukaran data menggunakan instruksi XCH antara isi akumulator A dan RAM yang berlokasi di alamat yang ditunjukkan R0, demikian seterusnya sehingga masuk ke label NEXT untuk melanjutkan ke data berikutnya. Jika semua data sudah diproses, cek apakah FLAG=1? JIka benar maka ulangi lagi dari awal (label SORT).

Demikian penjelasan saya, semoga bermanfaat.