; liste des variables utiliseés : caract,cmpt1,cmpt2,cmpt5
; SERIALS correspond à la pin utilisée pour la sortie RS232, ne pas utiliser les sorties à drain ouvert
; SERIALR correspond à la pin utilisée pour l'entrée RS232
;exemple:
;#DEFINE SERIALR	PORTA,0		; entree du pic
;#DEFINE SERIALS	PORTA,1		; sortie du pic 
;********************************************************************
;                     sous routine de reception                     *
;                     Pour une frequence de 4MHz                    *
;             9600 bauds, 8bits, pas de parite, 2bits stop          *
;                l'octet sera dans caract à declarer                *
;******************************************************************** 
receive
	btfsc	SERIALR		; tester si start bit present
	goto	receive		; non attendre
	call	tempo50		; oui attendre 1/2 bit
	call	tempo93 	; se placer au milieu du premier bit
	nop
	nop
	nop
	nop
	movlw	D'8'		; pour 8 bits
	movwf	cmpt5
reloop
	bcf	STATUS,C	; cary=0
	btfsc	SERIALR		; tester si bit=0
	bsf	STATUS,C	; cary=1
	rrf	caract,f	; faire entrer le bit par la gauche
	call	tempo93 	; attendre 1 bit
	decfsz	cmpt5,f		; decrementer le compteur
	goto	reloop		; boucler si pas dernier
	nop
	nop
	return
;********************************************************************
;                     sous routine d'emission                       *
;                     Pour une frequence de 4MHz                    *
;             9600 bauds, 8bits, pas de parite, 2bits stop          *
;                  l'octet est dans caract à declarer               *
;********************************************************************
send
	call	tempo50
	call	tempo93
		;envoyer start bit
	bcf	SERIALS		; envoyer startbit
	movlw	D'8'		; pour 8 bits
	movwf	cmpt5		; dans compteur
	nop
	nop
	call	tempo93 	; attendre 1 bit
		;envoyer 8 bits
send_loop
	rrf	caract,f	; decaler et bit dans cary
	btfsc	STATUS,C	; tester si cary=1
	goto 	X1		; si oui aller en X
	nop
	bcf	SERIALS		; si non serials a 0
	goto	Y1
X1	
	bsf	SERIALS		; serials a 1
	nop
	nop
Y1
	call	tempo93 	; attendre 1 bit
	decfsz	cmpt5,f		; decrementer compteur
	goto	send_loop	; boucler si pas dernier
		;envoyer 2 bits de stop
	bsf	SERIALS		; serials a 1
	call 	tempo93 	; 1 bit
	call	tempo93 	;1 bit
	call	tempo93		;1 bit pour securite
	return

;********************************************************************
;                     sous routines de temporisation                *
;********************************************************************  
tempo93
	clrf	cmpt1		; effacer cmpt1
	movlw	D'29'		; charger 32 dans w
	movwf	cmpt1		; charger w dans cmpt1
boucle1
	decfsz	cmpt1,f		; decrementer et saut si zero
	goto	boucle1		; boucler si pas zero
	return

tempo50
	clrf	cmpt2
	movlw	D'14'
	movwf	cmpt2
boucle2
	decfsz	cmpt2,f
	goto	boucle2
	nop
	nop
	return