;------------ Définition des registres temporaires --------------- cblock 0x20 numéro_de_la_touche, unite, dizaine, centaine endc ; lecture des boutons poussoirs par clavier à résistances call tempo ;att de qques µsec pour stabiliser la tension à convertir clrf unite clrf dizaine clrf centaine bsf ADCON0,2 ;lance la conv + temps d'attente btfsc ADCON0,2 goto $-1 ;ici : conversion de ADRESH en décimal : facultatif btfss ADRESH,0 goto $+.3 movlw .1 ;ajout direct 0001 addwf unite btfss ADRESH,1 goto $+.3 movlw .2 ;ajout direct 0002 addwf unite btfss ADRESH,2 goto $+.3 movlw .4 ;ajout direct 0004 addwf unite btfss ADRESH,3 goto $+.3 movlw .8 ;ajout direct 0008 addwf unite btfss ADRESH,4 goto $+.5 movlw .1 ;ajout direct 0016 addwf dizaine movlw .6 addwf unite btfss ADRESH,5 goto $+.5 movlw .3 ;ajout direct 0032 addwf dizaine movlw .2 addwf unite btfss ADRESH,6 goto $+.5 movlw .6 ;ajout direct 0064 addwf dizaine movlw .4 addwf unite btfss ADRESH,7 goto $+.7 movlw .1 ;ajout direct 0128 addwf centaine movlw .2 addwf dizaine movlw .8 addwf unite call boucle_des_retenues bsf lcd_rs ; RS à 1 = donnée à afficher movlw b'00110000';pour chiffre ascii iorwf centaine,f movfw centaine ; call envoiaffi movlw b'00110000';pour chiffre ascii iorwf dizaine,f movfw dizaine ; call envoiaffi movlw b'00110000';pour chiffre ascii iorwf unite,f movfw unite ; call envoiaffi movlw b'00100101' ;% call envoiaffi movlw b'00100000' ;esp call envoiaffi ;............................................................................... ;interprétation du clavier à résistances clrf numéro_de_la_touche movlw .250 subwf ADRESH,w btfsc STATUS,C goto pas_de_touche clrf numéro_de_la_touche incf numéro_de_la_touche movlw .11 ; ces chiffres correspondent aux valeurs MEDIANES ;des tensions entre 2 touches subwf ADRESH,w btfsc STATUS,C incf numéro_de_la_touche movlw .33 subwf ADRESH,w btfsc STATUS,C incf numéro_de_la_touche movlw .55 subwf ADRESH,w btfsc STATUS,C incf numéro_de_la_touche movlw .79 subwf ADRESH,w btfsc STATUS,C incf numéro_de_la_touche movlw .105 subwf ADRESH,w btfsc STATUS,C incf numéro_de_la_touche ;renvoie vers les fonctions movlw .1 xorwf numéro_de_la_touche,w btfsc STATUS,Z call enregistrement movlw .2 xorwf numéro_de_la_touche,w btfsc STATUS,Z call stopcomplet movlw .3 xorwf numéro_de_la_touche,w btfsc STATUS,Z call arriere movlw .4 xorwf numéro_de_la_touche,w btfsc STATUS,Z call lecture movlw .5 xorwf numéro_de_la_touche,w btfsc STATUS,Z call avance pas_de_touche movlw b'00110000';pour chiffre ascii iorwf numéro_de_la_touche,f movfw numéro_de_la_touche call envoiaffi tempo MOVLW .40 movwf temp DECFSZ temp,F ; on décrémente w et on saute la prochaine instruction si GOTO $-1 ; le registre w = 0 sinon retour à tempo RETURN ;**************************************************************************** envoiaffi ;déserialisation et envoie vers les registres à décalage movwf temp bcf d_4094 btfsc temp,7 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,6 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,5 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,4 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,3 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,2 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,1 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 bcf d_4094 btfsc temp,0 bsf d_4094 nop bsf h_4094 ; ;coup d'horloge 4094 bcf h_4094 nop nop nop nop bsf lcd_e nop nop nop bcf lcd_e call tempo return ;**********************************************************routines afficheur LCD****************** cursorhome movlw b'00000010' ;cursor return home call envoiaffi call megatempo return cleardisplay movlw b'00000001' ;clear display call envoiaffi call megatempo return affiligne1 movlw b'10000000' ;set DD RAM address RS à 0 call envoiaffi return affiligne2 movlw b'11000000' ;set DD RAM address RS à 0 call envoiaffi return ;******************************************************conversion en decimal boucle_des_retenues movlw .10 subwf unite,w btfss STATUS,C ; test: supérieur à 10 goto $+.5 ;la somme est inférieure à 10 movlw .10 ; la somme est supérieure ou égale à 10 subwf unite incf dizaine goto $-.7 movlw .10 subwf dizaine,w btfss STATUS,C ; test: supérieur à 10 goto $+.5 ;la somme est inférieure à 10 movlw .10 ; la somme est supérieure ou égale à 10 subwf dizaine incf centaine goto $-.7 movlw .10 subwf centaine,w btfss STATUS,C ; test: supérieur à 10 goto $+.5 ;la somme est inférieure à 10 movlw .10 ; la somme est supérieure ou égale à 10 subwf centaine incf millier goto $-.7 movlw .10 subwf millier,w btfss STATUS,C ; test: supérieur à 10 goto $+.5 ;la somme est inférieure à 10 movlw .10 ; la somme est supérieure ou égale à 10 subwf millier incf dixmil goto $-.7 return interruption retfie END