	.CODE
LShift          EQU   12H
CapsLock        EQU   58H
RShift          EQU   59H
Shift_Flag	bit	0
	ORG   	*
Init_Keyboard:
	Mov	R0,#08H				;Aktifkan Interrupt keyboard
	MOV     IE,#80H				;
	Clr	Shift_Flag			;Matikan Shift Flag
	SETB    IE.0				;
	RET   

Ambil_Keyboard:
	Clr	IE.0
	Push	00H
	CLR   	A				;Tunggu ada Interrupt keyboard
	JNB   	INT0,*				;Level high
	Mov	R0,#08H
Ambil_Keyboard2:				;Ambil data dari P1.4 setiap
	JB    	INT0,*				;kali interrupt keyboard transisi
	MOV   	C,P1.4				;low
	RR    	A				;Geser Acc A
	MOV   	A.7,C				;Simpan data di bit 7 Acc A
	JNB   	INT0,*				;Tunggu Int0 high
	Djnz	R0,Ambil_Keyboard2		;Lakukan 8x
	Jb	INT0,*				;Buang Stop Bit
	Jnb	INT0,*				;
	Jb	INT0,*				;
	Jnb	INT0,*				;
	Pop	00H
	Setb	IE.0
	Ret   


Konversi_ScanCode
	Mov	DPTR,#AddrTable	;Isi DPTR dengan alamat awal AddrTable
	Movc	A,@A+DPTR
	Ret

Keyboard_Interrupt:
	Clr	IE.0				;Keyboard ditekan/dilepas

	Acall	Ambil_Keyboard				;
	Cjne	A,#0F0H,Kybd_TidakLepas		;	
	Jb	INT0,*				;Keyboard dilepas
	Acall	Ambil_Keyboard				;

;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:
	Setb	IE.0
	Clr	C
	Reti

;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	IE.0
	Setb	C
	Reti
		
Capital:	
	Lcall	Capitalize
	Setb	IE.0
	Setb	C
	Reti

AddrTable:
	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

