UkuranBuffer	EQU	32
STX		EQU	1H
ETX		EQU	2H

Delay_100ms	EQU	16EH
Delay_500mS	EQU	165H
Delay_1detik	EQU	15CH
TabelData	EQU	50H
LShift          EQU   	12H
CapsLock        EQU   	58H
RShift          EQU   	59H
PosisiAwal_LCD		EQU	0216H
KirimPesan_LCD		EQU	022BH
Init_LCD		EQU	0237H
Kirim_Perintah		EQU	0276H
Kirim_Karakter		EQU	0295H
Baris2_LCD		EQU	029FH
Baris1_LCD		EQU	02A4H
KbdData		Bit	P1.4
KbdClock	Bit	INT0

Shift_Flag	bit	0
	ORG   	2000H
	Ajmp	Start
	Org	2023H
	Ajmp	Serial_Interrupt

Start:
	Lcall	Init_LCD
	Acall	Clear_Buffer
	Mov	R0,#TabelData
	Clr	Shift_Flag		;Kondisi flag shift 0	
	Clr	P1.5
	Acall	Init_Serial
	Clr	RI
	Clr	TI
	Setb	EA
	Setb	ES
Loop:
	Jb	KbdClock,$		;Tunggu clock keyboard
	Lcall	AmbilKeyboard		;Ambil data dari keyboard
	Jnc	Loop			;Bukan karakter, loop
	Cjne	A,#0F1H,TidakKirim

KirimPesan:
	Clr	ES
	Mov	R0,#TabelData
	Mov	A,#STX
	Lcall	Serial_Out		
	Lcall	Delay_100mS

KirimTerus:
	Mov	A,@R0
	Jz	SelesaiKirim
	Inc	R0
	Lcall	Serial_Out
	Lcall	Delay_100mS
	Ajmp	KirimTerus

SelesaiKirim:
	Lcall	Delay_100mS
	Mov	A,#ETX
	Lcall	Serial_Out
	Clr	C
	Acall	Clear_Buffer
	Mov	R0,#TabelData
	Lcall	Delay_500mS
	Lcall	Init_LCD
	Clr	TI
	Clr	RI
	Setb	ES
	Ajmp	Loop

TidakKirim:
	Cjne	A,#0DH,TidakHapus
	Lcall	Init_LCD
	Acall	Clear_Buffer
	Mov	R0,#TabelData
	Ajmp	Loop


TidakHapus
	Cjne	R0,#TabelData+16,TidakPindahBaris2
	Ajmp	PindahBaris2

TidakPindahBaris2:
	Cjne	R0,#TabelData+32,TampilSimpanKarakter
	Ajmp	Penuh

TampilSimpanKarakter:
	Mov	@R0,A
	Lcall	Kirim_Karakter
	Inc	R0
	Clr	C			;
	Ajmp	Loop	

PIndahBaris2:
	Push	A
	Lcall	Baris2_LCD
	Pop	A
	Ajmp	TampilSimpanKarakter	

Penuh:
	Lcall	Init_LCD
	Mov	DPTR,#PesanPenuh
	Lcall	KirimPesan_LCD
	Lcall	Delay_1detik
	Lcall	Init_LCD
	Ajmp	KirimPesan

;----- SUBROUTINE PENGAMBILAN SCANCODE ------
;Yang berpengaruh:
;	- Bit Carry
;	- Akumulator menyimpan nilai scan code

Ambil_scancode:
	Push	00H
	CLR   	A				;Tunggu ada Interrupt keyboard
	JNB   	KbdClock,$			;Level high
	Mov	R0,#08H
ambil_scancode2:				;Ambil data dari P1.4 setiap
	JB    	KbdClock,$			;kali interrupt keyboard transisi
	MOV   	C,KbdData			;low
	RR    	A				;Geser Acc A
        MOV     A.7,C                          ;Simpan data di bit 7 Acc A
	JNB   	KbdClock,$			;Tunggu Int0 high
	Djnz	R0,ambil_scancode2		;Lakukan 8x
	Jb	KbdClock,$			;Buang Stop Bit
	Jnb	KbdClock,$			;
	Jb	KbdClock,$			;
	Jnb	KbdClock,$			;
	Pop	00H
	Ret   

;------ Subroutine Konversi Scan Code -----
; Hasil konversi tersimpan di akumulator
; Register yang terpengaruh:
;	- DPTR

Konversi_ScanCode:
	Mov	DPTR,#TabelKeyboard	;Isi DPTR dengan alamat awal 
	Movc	A,@A+DPTR		;TabelKeyboard
	Ret

Serial_Interrupt:
	Clr	ES
	Clr	RI
	Mov	A,SBUF
	Cjne	A,#STX,Noise
	Lcall	Init_LCD
	Acall	Clear_Buffer
	Mov	R0,#TabelData
TerimaTerus2:
	Jnb	RI,*
	Mov	A,SBUF
	Clr	RI
	Cjne	A,#ETX,TerimaTerus
Noise:
	Mov	R0,#TabelData
	Setb	ES
	Reti	

TerimaTerus:
	Clr	RI
	Cjne	R0,#TabelData+16,TidakBaris2
	Push	A
	Lcall	Baris2_LCD
	Pop	A

TidakBaris2:
	Mov	@R0,A
	Lcall	Kirim_Karakter
	Inc	R0
	Ajmp	TerimaTerus2

	




;------ Subroutine mengambil data dari keyboard
; Register yang terpengaruh:
;	- akumulator sebagai karakter hasil konversi
;	- bit carry
; Cara kerja:
;	- apabila bit carry set maka hasil berupa karakter di akumulator
;	- apabila bit carry clear maka hasil bukan karakter
;	- apabila scan code adalah kode shift atau caps lock, maka shift
;	  flag di komplemen

AmbilKeyboard:
	Acall	Ambil_scancode		;
	Cjne	A,#0F0H,Kybd_TidakLepas	;	
	Jb	KbdClock,$		;Keyboard dilepas
	Acall	Ambil_scancode		;

;PERIKSA TOMBOL YANG DILEPAS
;Periksa tombol shift atau karakter yang dilepas
;Shift atau tombol lain yang dilepas?
	Cjne	A,#LShift,Bukan_LShiftlepas	;Shift dilepas?
	Ajmp	Komplemen_ShiftFlg		;Ya! Komplemen Shift Flag

Bukan_LShiftlepas:	
	Cjne	A,#RShift,Bukan_Shiftlepas	;A<>RShift, bukan Shift kiri
						;atau shift kanan dilepas
Komplemen_ShiftFlg:
	Cpl	Shift_Flag			

Bukan_Shiftlepas:
	Clr	C
	Ret

;KEYBOARD DITEKAN
;- Periksa yang ditekan:
;	- Shift -> Komplemen Shift Flag
;	- CapsLock -> Komplemen Shift Flag
;	- Bukan Shift atau Capslock -> Konversi Scan Code
;	- Shift Flag set -> Capital
;	- Shift Flag clear -> Non Capital

Kybd_TidakLepas:
	Cjne	A,#Lshift,Bukan_Lshifttekan	;Shift Kiri ditekan?
	Ajmp	Komplemen_ShiftFlg		;Komplemen Shift Flag

Bukan_LShifttekan:
	Cjne	A,#RShift,Bukan_RShifttekan	;Shift Kanan ditekan?
	Ajmp	Komplemen_ShiftFlg		;Komplemen Shift Flag

Bukan_RShifttekan:
	Cjne	A,#CapsLock,BukanCapsLock	;Caps Lock ditekan
	Ajmp	Komplemen_ShiftFlg		;Komplemen Shift Flag

BukanCapsLock:
	Acall	Konversi_Scancode		;Konversi scan code table
	Jb	Shift_Flag,Capital		;Shift Flag set -> capital
	Setb	C
	Ret
 		
Capital:	
	Lcall	Capitalize
	Setb	C
	Ret

Capitalize:          
	Cjne	A,#'a',Periksa_Carry	;Acc A >= 'a'?
					;
Periksa_Carry:				;
	Jnc	lebih_kecil_z?		;Ya! periksa terhadap 'z'
	Ret				;Tidak! Tidak ada perubahan

lebih_kecil_z?:				;Acc A =< 'z'?  
	Cjne	A,#'z',Periksa_Carry2	;
	Ajmp	Kapital			;Ya! Ubah menjadi kapital

Periksa_Carry2:
	Jc	Kapital			;
	Ret				;Tidak! Tidak ada perubahan

Kapital:
	Clr	C
	Subb	A,#20H
	Ret

Clear_Buffer:
	Mov	R0,#TabelData
	Mov	R7,#UkuranBuffer+1

LoopClearBuffer:
	Mov	A,#00H
	Mov	@R0,A
	Inc	R0
	Djnz	R7,LoopClearBuffer
	Ret	

Init_Serial:
	MOV     SCON,#52H        ; Mode 1 Ren
	MOV	TMOD,#20H        ; T1 Mode 2
	MOV	TH1,#0FDH        ; 9600 Baudrate
	MOV     TCON,#040H       ; T1 On, T0 Off
	MOV     PCON,#00H        ;
	RET   

Serial_Out:
	Clr	TI
	Mov	SBUF,A
	Jnb	TI,$
	Clr	TI
	Ret

TabelKeyboard:
	DB	00
	DB	0F9H		
	DB	00
	DB	0F5H,0F3H,0F1H,0F2H,0FCH	;Function Key, FC = F12
	DB	00H				
	DB	0FAH,0F8H,0F6H,0F4H		;FA=F10
	DB	0C0H	;Tab	(Special Code)
	DB	'~'	;~
	DB	00H
	DB	00H
	DB	0C1H	;AltL	(Special Code)
	DB	0C2H	;ShiftL	(Special Code)
	DB	00H
	DB	0C3H	;CtrlL	(Special Code
	DB	'q1'
	DB	00H,00H,00H
	DB	'zsaw2'
	DB	00H,00H
	DB	'cxde43'
	DB	00H,00H
	DB	' vftr5'
	DB	00H,00H
	DB	'nbhgy6'
	DB	00H,00H,00H
	DB	'mju78'
	DB	00H,00H
	DB	',kio09'
	DB	00H,00H
	DB	'./l;p-'
	DB	00H,00H,00H
	DB	2CH 		; '
	DB	00H
	DB	'[='
	DB	00H,00H
	DB	0C5H	
	DB	0C6H
	DB	0AH		;Enter
	DB	']'
	DB	00H
	DB	'\'
	DB	00H,00H,00H,00H,00H,00H,00H,00H
	DB	08H		;BackSpace
	DB	00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
	DB	0DH		;Esc
	DB	00H
	DB	0FBH		;Function Key F11
	DB	00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
	DB	0F7H		;Function Key

PesanPenuh:
	DB	'Buffer Penuh',$0F

;	include	c:\programs\alds31\routines\phone3.asm
;	include	c:\programs\alds31\routines\memori.asm