$MOD51
    DSEG
    Org 50H
PTR:        	Ds  2		;Variabel penyimpan DPTR sementara
JumlahData:  	Ds  2		;Variabel jumlah data
Arah:		Ds  1
    CSEG
;*********************
; RUTIN SIAP PAKAI MODUL DST-51
;*********************

ROM                     EQU     2000H
Kirim_Perintah  EQU 0276H
Kirim_Karakter  EQU 0295H
PosisiAwal_LCD	EQU 0216H
Init_LCD            EQU 0237H
Baris2_LCD          EQU 029FH
Delay_100mS         EQU	016EH
Writeext_Memory     EQU 0157H
Dec_DPTR            EQU 0130H

 Org ROM   		;Reset Vector
 Ajmp Start   	;
 Org ROM+3H   	;External Interrupt 0 Vector
 Reti    		;
 Org ROM+0BH   	;Timer 0 Interrupt Vector
 Reti    		;
 Org ROM+13H   	;External Interrupt 1 Vector
 Reti    		;
 Org ROM+1BH   	;Timer 1 Interrupt Vector
 Reti    		;
 Org ROM+23H   	;Serial Interrupt Vector
 Ajmp	InterupsiSerial

Start:
	Lcall 	Init_LCD			;Inisial LCD
	Clr	RI						;Matikan Flag Interupsi
	Clr	TI						;
	Setb	EA					;Aktifkan interupsi serial
	Setb	ES					;

Loop:
	Lcall	PosisiAwal_LCD		;LCD ke posisi awal
 	Mov     DPTR,#PesanLCD		;Tampilkan 2 baris pesan
 	Lcall   Kirim2barisLCD		;

	Mov		A,Arah				;Periksa arah pergeseran
	Cjne	A,#'>',BukanKanan	;
	Acall	GeserMemoriKanan	;
	Ajmp	Loop

BukanKanan:
	Cjne	A,#'<',Loop			;
    Acall   GeserMemoriKiri		;
    Ajmp    Loop				;



GeserMemoriKanan:
    Mov     JumlahData+1,#04		;
    Mov     JumlahData,#0E7H
    Push    DPH                     ;Data terakhir (temporary-1) dipindah ke 
    Push    DPL                     ;temporary
    Mov     DPTR,#Temporary         ;
    Mov     PTR+1,DPH               ;
    Mov     PTR,DPL                 ;
    Pop     DPL                     ;
    Pop     DPH                     ;
    Mov     DPTR,#Temporary-1       ;
    Acall   Pindahkan               ;

    Lcall   Dec_DPTR				;DPTR - 1
LoopGeserKanan:
    Movx    A,@DPTR					;Data di DPTR dipindah ke DPTR + 1
    Push    DPH						;
    Push    DPL						;
    Inc     DPTR					;
    Mov     PTR+1,DPH				;
    Mov     PTR,DPL					;
    Pop     DPL						;
    Pop     DPH						;
    Acall   Pindahkan				;
    Lcall   Dec_DPTR				;DPTR - 1

    Djnz    JumlahData,LoopGeserKanan	;Looping 999 kali
    Djnz    JumlahData+1,LoopGeserKanan	;

    Mov     DPTR,#PesanLCD			;Data di temporary dipindah ke data awal
    Mov     PTR+1,DPH				;
    Mov     PTR,DPL					;
    Mov     DPTR,#Temporary			;
    Acall   Pindahkan				;
    Ret


GeserMemoriKiri:
    Mov     JumlahData+1,#04
    Mov     JumlahData,#0E7H
    Push    DPH                     ;Data Awal dipindah ke temporary
    Push    DPL                     ;
    Mov     DPTR,#Temporary         ;
    Mov     PTR+1,DPH               ;
    Mov     PTR,DPL                 ;
    Pop     DPL                     ;
    Pop     DPH                     ;
    Mov     DPTR,#PesanLCD          ;
    Acall   Pindahkan               ;

    Inc     DPTR					;DPTR + 1
LoopGeserKiri:
    Movx    A,@DPTR					;Isi DPTR dipindah ke DPTR - 1
    Push    DPH						;
    Push    DPL						;
    Lcall   Dec_DPTR				;
    Mov     PTR+1,DPH				;
    Mov     PTR,DPL					;
    Pop     DPL						;
    Pop     DPH						;
    Acall   Pindahkan				;

    Inc     DPTR					;DPTR + 1
    Djnz    JumlahData,LoopGeserKiri	;lakukan 999 kali
    Djnz    JumlahData+1,LoopGeserKiri	;
    Push    DPH						;Isi Temporary dipindah ke data terakhir
    Push    DPL						;
    Mov     DPTR,#Temporary-1		;
    Mov     PTR+1,DPH				;
    Mov     PTR,DPL					;
    Pop	    DPL						;
    Pop	    DPH						;
    Acall   Pindahkan				;
    Ret


Pindahkan:
    Movx    A,@DPTR					;Ambil data di DPTR
    Push    DPH						;Simpan di alamat yang ditunjuk oleh variabel PTR
    Push    DPL						;
    Mov     DPH,PTR+1				;
    Mov     DPL,PTR					;
    Lcall   Writeext_memory			;
    Mov     PTR+1,DPH				;
    Mov     PTR,DPL					;
    Pop     DPL						;
    Pop     DPH						;
    Ret

;***********
; Mengirim 32 byte pesan dengan 16 byte di baris 1 dan 16 byte berikutnya di baris 2
; LCD
;***********
Kirim2BarisLCD:
    Mov     R6,#2				;Jumlah baris = 2

LoopBaris:
    Mov     R7,#16				;Jumlah kolom karakter = 16

LoopKolom:
    Movx    A,@DPTR				;Ambil data di lokasi yang ditunjuk DPTR
    Lcall   Kirim_Karakter		;Tampilkan di LCD
    Inc     DPTR				;
    Djnz    R7,LoopKolom		;Lakukan hingga 16 kali
    Lcall   Baris2_LCD			;Pindah ke baris 2
    Djnz    R6,LoopBaris		;Kembali tampilkan baris berikutnya
    Ret

PesanLCD:
        DB      'Program ini berfungsi untuk menampilkan 1000 karak'
        DB      'ter pada layar LCD M1632 dengan metode  pergeseran'
        DB      'memori eksternal Modul DST-51 di mana arah   perge'
        DB      'seran dapat  diatur oleh PC  melalui Port  Serial.'
        DB      'di mana tanda > akan mengatur  pergeseran  ke arah'
        DB      'kanan tanda < akan mengatur pergeseran ke arah  ki'
        DB      'ri dan sembrg tombol akan menghentikan  pergeseran'
        DB      'Media penyimpanan data untuk 1000 pesan ini menggu'
        DB      'nakan  memori  eksternal  Parallel  EEPROM AT28C64'
        DB      'sebesar delapan kilo byte. Listing program ini dia'
        DB      'ssembly dengan menggunakan software ASM51.exe yang'
        DB      'dapat didownload secara gratis di www.delta-electr'
        DB      'onic.com bagians software. Proses pergeseran dilak'
        DB      'ukan dengan menggeser 1000 pesan yang tersimpan pa'
        DB      'da memori eksternal tersebut sedangkan proses scan'
        DB      'ning tetap pada tiga puluh dua byte  data  pertama' 
        DB      'dari tabel pesan setiap periode  tertentu  di mana' 
        DB      'pengaturan periode dilakukan dengan mengatur delay'
        DB      'yang diberikan setiap kali looping pergeseran dari' 
        DB      '1000 pesan tersebut dilakukan ********************'


Temporary:	
		DB	00

InterupsiSerial:
	Clr	ES			;Matikan interupsi serial
	Mov	Arah,SBUF	;Variabel arah diisi data input serial
	Clr	TI			;Hapus Flag serial 
	Clr	RI			;
	Setb	ES		;Aktifkan interupsi serial
	Reti			;

        END
