	list p=16F877
	Title "UART Uygulamasi-H/W"
	#include<P16F877.INC>
	variable KRAM=0x20
	cblock KRAM
	SAYAC
	endc
	variable KRAM=SAYAC+1
	
	
	org	0x03		;reset vektörü
	goto 	baslangic	
	org	0x05
	
baslangic
	bsf	STATUS,RP0	;1,yazmaç bankına geçilir.	
	movlw 	19h		;H/W UART 'ın seri veri alışverişi
;	movwf	SPBRG		;9600 baud 'a (10 MHz 'te)
	movlw	b'00100100'	;asenkron ,yüksek baud hızı
	movwf	TXSTA		;ayarlanmaktadır	
	bcf	STATUS,RP0	;0.yazmaç bankına dönülür
	
	movlw	b'10010000'	;H/W UART sürekli veri almaya uygun
	movwf	RCSTA		;durumda yapılanmıştır.
	call	LCDbaslangic
	call	LCDsifirla
anadongu
	call	verial		;W yazmacında saklanan veri
	movwf	TXREG		;(karakter) PC ye geri gönderilir ve
	call	LCDyekaraktergonder	;LCD 'de gösterilir
	goto	anadongu	
verial
	movlw	06h		;istenmeyen bitler maskelenir ve
	andwf	RCSTA,W		;veri alışveriş hataları kontrol edilir
	btfss	STATUS,Z	
	goto	verialimindahatavar
verihazirmi?
	btfss	PIR1,5		;verinin hazır olup olmadıgı kontrol edilir
	goto	verihazirmi?
	movf	RCREG,W		;giriş verisi w yazmacında saklanır
	bcf	PIR1,5
	return
verialimindahatavar
	bcf	RCSTA,4		;alıcının durumu sıfırlanır
	bsf	RCSTA,4
	goto	verial

	cblock	KRAM
	SAY1
	SAY2
	endc
	variable KRAM=SAY2+1

	#define	RS	PORTE,0
	#define	EN	PORTE,1
	#define RW	PORTE,2


	
LCDbaslangic
	bsf	STATUS,RP0	;1. bank
	movlw	b'00000010'	;E portunun tüm bitleri sayısal I/O
	movwf 	ADCON1		;A portunun RA4 hariç bitleri analog giriş
	movlw	b'00000000'	
	movwf	TRISD		;D portunun tüm bitleri sayısal çıkış
	movwf	TRISE		;E portunun tüm bitleri sayısal çıkış
	bcf	STATUS,RP0	;0. bank
	bcf	RW	
	bcf	EN
	bcf	RS	
	call	_125us_gecikme	;125 mikrosaniye gecikme
	movlw	0x38		;8 bit,5x7
	movwf	PORTD		;0011 1000
	call	darbe
	movlw	0x0f		;gösterge açık,imleçyanıp sönüyor
	movwf 	PORTD		;0000 1111
	call	darbe		
	movlw	0x01		;gösterge temizlenir
	movwf	PORTD		;0000 0001
	call	darbe	
	call	_5ms_gecikme	;başlangıç işleminin bitiminde
				;5msn gecikme konur
	return

LCDyekaraktergonder		;w yazmacındaki karakter bilgisini
	movwf	PORTD		;LCD ye göndermektedir
	bcf	RW
	bsf	RS
	call	darbe
	return
LCDsifirla			;gösterge sıfırlama rutini
	bcf	RW
	bcf	EN
	bcf	RS
	call	_125us_gecikme	;125 mikro saniye gecikme
	movlw	0x01		;gösterge temizlenir
	movwf	PORTD		;0000 0001
	call	darbe
	call	_5ms_gecikme	;sıfırlama işleminin bitiminde
				;5msn gecikme konur
	return			
_125us_gecikme			;ortalama 42x3=126 çevrim elde edilmektedir
	movlw	0x2A		;4MHz osilatör frekansında bir komut
	movwf	SAY1		;çevirimi 1 mikrosaniye gerçekleşmektedir
gec1	decfsz	SAY1,f		;42(ondalık)sayısı yani 0x2A SAY1
	goto	gec1		;yazmacına yüklenir ve her çevrimde
				;bir azaltılır
	return	
_5ms_gecikme
	movlw	0x29		;40(ondalık)sayısı
	movwf	SAY2		;SAY2 yazmacına yüklenir
gec2	call	_125us_gecikme	;125 mikrosaniyelik gecikme
	decfsz	SAY2,f		;40 defa işleme konur
	goto gec2		;40x125 usn=5msn
	return
darbe				;LCD ye komut veya karekter verisi
				;yüklenirken EN bitine darbe uygulanması
				;gerekmektedir
	bsf	EN		;EN biti 1
	nop			;1 mikrosaniye gecikme
	bcf 	EN		;EN biti yeniden 0
	call	_125us_gecikme	;125 mikrosaniye gecikme
	return

	end
	
	

