; 4 Key Debouncing avec 12C508
; 4 poussoirs sont connectés via des pull-up à GP2:5
; Lignes GP1:2 à 0 en normal, veille
; Des qu'un poussoir est enclenché (mise à zero de l'entrée correspondante bp(i)) on envoie un start positif de 5µs sur GP2
; Puis pendant 100ms on code sur 2 bits (GP1:2) le poussoir enfoncé
; Au bout des 100ms on attends à nouveau 250ms. Si le même code est present sur les entrées poussoirs, on renverra l'info sur les lignes toutes les 200ms

	list p=12c508a
	include <p12c508a.inc>

	__CONFIG _WDT_OFF & _INTRC_OSC & _MCLRE_OFF & _CP_ON


	cblock	0x07
		code
		codebis
		PDel0
		PDel1
	endc

#DEFINE	start	GPIO,2
#DEFINE	bp1	GPIO,0
#DEFINE	bp2	GPIO,3
#DEFINE	bp3	GPIO,4
#DEFINE	bp4	GPIO,5

; Programme principal
; -------------------

	org	0x00
	movlw	B'00111100'	; GP0,1 en sortie, le reste en entrée
	TRIS	GPIO	; toutes les broches en sortie
	movlw	B'11001111'	; pas de pull-up, pas de pin change
	OPTION
	clrf	GPIO	; on remet à zero les sorties
	call	T50ms
loop	btfss	bp1	; boucle principale = scrutation des touches
	goto	push1
	btfss	bp2
	goto	push2
	btfss	bp3
	goto	push3
	btfss	bp4
	goto	push4
	goto	loop

push1	movlw	B'00000000'	; bouton 1
	movwf	code
	goto	send_start
push2	movlw	B'00000010'	; bouton 2
	movwf	code
	goto	send_start
push3	movlw	B'00000100'	; bouton 3
	movwf	code
	goto	send_start
push4	movlw	B'00000110'
	movwf	code
send_start	bsf	start	; envoi du bit de start
	nop
	nop
	nop
	movf	code,w
	movwf	GPIO	; on envoie le code
	call	T50ms
	call	T50ms	; 100ms
	clrf	GPIO
	call	T50ms
	call	T50ms
	call	T50ms
	call	T50ms
	call	T50ms	; 250ms, soit un total cumulé de 350ms pour le premier appui
retest	btfss	bp1	; on va retester si la touche est tjrs enfoncée
	goto	push1bis
	btfss	bp2
	goto	push2bis
	btfss	bp3
	goto	push3bis
	btfss	bp4
	goto	push4bis
	goto	loop	; aucune touche n'est plus appuyée
push1bis	movlw	B'00000000'
	movwf	codebis
	goto	resend
push2bis	movlw	B'00000010'
	movwf	codebis
	goto	resend
push3bis	movlw	B'00000100'
	movwf	codebis
	goto	resend
push4bis	movlw	B'00000110'
	movwf	codebis
resend	movf	codebis,w
	subwf	code,w
	btfss	STATUS,Z	; la touche est-elle restée enfoncée ?
	goto	loop	; non !
	bsf	start	; oui !
	nop
	nop
	nop
	movf	code,w
	movwf	GPIO
	call	T50ms
	call	T50ms
	clrf	GPIO
	call	T50ms
	call	T50ms	; le code a été renvoyé pendant 200ms
	goto	retest	; on va voir si la touche est toujours enfoncée

; Tempo 50ms
; ----------

T50ms	movlw	D'55'
	movwf	PDel0
PLoop1	movlw	D'181'
	movwf	PDel1
PLoop2	nop
	nop
	decfsz	PDel1,f
	goto	PLoop2
	decfsz	PDel0,f
	goto	PLoop1
	return

	END
