Vous êtes sur la page 1sur 6

16f84

; "Question pour un champion"


; Fabrice Sincère (C) novembre 2006
; version 1.01
; microcontrôleur PIC 16F84A

List p=16F84A ; processeur utilisé


#include <p16F84A.inc>

__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC


;bits de configuration :
;code protect OFF
;watchdog timer OFF
;power up timer ON
;oscillateur HS (quartz à grande fréquence)

;xxxxxx
; macro
;xxxxxx

bank1 macro ; passage en banque 1


bsf STATUS,RP0
endm

bank0 macro ; passage en banque 0


bcf STATUS,RP0
endm

;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx

CBLOCK H'00C'
mem : 1 ; registre de stockage de l'état du port B
;(ce qui évite tout problème en cas
d'évolution
; du port B pendant les phases de test)
ENDC

;xxxxxxxxxxxxxxxxxxxx
; demarrage sur reset
;xxxxxxxxxxxxxxxxxxxx

org H'0000'
goto initialisation

;xxxxxxxxxxxxxxx
; initialisation
;xxxxxxxxxxxxxxx

initialisation

bank0
clrf PORTA ; mise à 0 des sorties du port A
clrf PORTB ; mise à 0 des sorties du port B

bank1
movlw B'00000000'
movwf OPTION_REG
; bit 7 = 0 : activation des résistances de pull-up du port B
; (cela permet de faire l'économie de 5 résistances externes)
; bits 0 à 6 : ici, options non utilisées (on les met à 0, par
exemple)

movlw B'00010000'
movwf TRISA
; bit 0 du port A (RA0) = 0 : configuration en sortie (commande de
la LED1)
; bit 1 du port A (RA1) = 0 : configuration en sortie (commande de
la LED2)
; bit 2 du port A (RA2) = 0 : configuration en sortie (commande de
la LED3)
; bit 3 du port A (RA3) = 0 : configuration en sortie (commande de
la LED4)
; bit 4 du port A (RA4) = 1 : non utilisée (configuration en
entrée, par exemple)

movlw B'11111111'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée (bouton
poussoir du joueur 1)
; bit 1 du port B (RB1) = 1 : configuration en entrée (bouton
poussoir du joueur 2)
; bit 2 du port B (RB2) = 1 : configuration en entrée (bouton
poussoir du joueur 3)
; bit 3 du port B (RB3) = 1 : configuration en entrée (bouton
poussoir du joueur 4)
; bit 4 du port B (RB4) = 1 : configuration en entrée (bouton
poussoir reset)
; bits 5 à 7 du port B : non utilisés (configuration en entrée, par
exemple)

bank0
movlw B'11111111'
movwf PORTA ; on éteint toutes les leds

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

movf PORTB, W ; lecture du port B


movwf mem ; mise en mémoire tampon

; test bouton(s) poussoir(s) appuyé(s)


; on teste si l'état logique du port B est différent de 'xxx11111':
movlw B'00011111'
andwf mem, f ; met à 0 les bits 5 à 7 de mem
subwf mem, W ; comparaison avec 00011111
btfsc STATUS,Z ; test du bit Z
goto debut_programme; boutons poussoirs au repos (Z=1)

; autrement, au moins un bouton poussoir est appuyé (Z=0) :


btfss mem, 4 ; test du bit 4 (RB4 : bouton poussoir reset)
goto debut_programme ; bouton appuyé (RB4 = 0)

; bouton poussoir au repos (RB4 = 1):


; test bouton joueur 1
btfsc mem, 0 ; test du bit 0 (RB0 : bouton joueur 1)
goto label_j2 ; bouton au repos (RB0 = 1)
; bouton appuyé :
movlw B'11111110'
movwf PORTA ; on allume la led1
goto label_reset ;

label_j2 ; test bouton joueur 2

btfsc mem, 1 ; test du bit 1 (RB1 : bouton joueur 2)


goto label_j3 ; bouton au repos
; bouton appuyé :
movlw B'11111101'
movwf PORTA ; on allume la led2
goto label_reset

label_j3 ; test bouton joueur 3

btfsc mem, 2 ; test du bit 2 (RB2 : bouton joueur 3)


goto label_j4 ; bouton au repos
; bouton appuyé
movlw B'11111011'
movwf PORTA ; on allume la led3
goto label_reset ;

label_j4 ; le bouton du joueur 4 est donc forcement appuyé

movlw B'11110111'
movwf PORTA ; on allume la led4

label_reset ; test bouton reset

btfsc PORTB,4 ; lecture du port B, test du bit RB4


goto label_reset ; bouton au repos
; bouton appuyé :
movlw B'11111111'
movwf PORTA ; on éteint toutes les leds
goto debut_programme ;

END

16f628

; "Question pour un champion"


; Fabrice Sincère (C) novembre 2006
; version 1.05
; microcontrôleur PIC 16F628A
; développé avec Microchip MPLAB IDE

List p=16F628A ; processeur utilisé


#include <p16F628A.inc>

__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF &
_DATA_CP_OFF & _BOREN_OFF & _MCLRE_ON
;bits de configuration :
;code protect OFF
;watchdog timer OFF
;power up timer ON
;oscillateur HS (quartz à grande fréquence)
;low voltage program OFF
;data EE read protect OFF
;brown out detect OFF
;master clear enable ON

;xxxxxx
; macro
;xxxxxx

bank1 macro ; passage en banque 1


bsf STATUS,RP0
bcf STATUS,RP1
endm

bank0 macro ; passage en banque 0


bcf STATUS,RP0
bcf STATUS,RP1
endm

;xxxxxxxxxxxxxxxxxxxxxxxxx
; déclaration de variables
;xxxxxxxxxxxxxxxxxxxxxxxxx

CBLOCK H'020'
mem : 1 ; registre de stockage de l'état du port B
;(ce qui évite tout problème en cas
d'évolution
; du port B pendant les phases de test)
ENDC

;xxxxxxxxxxxxxxxxxxxx
; démarrage sur reset
;xxxxxxxxxxxxxxxxxxxx

org H'0000'
goto initialisation

;xxxxxxxxxxxxxxx
; initialisation
;xxxxxxxxxxxxxxx

initialisation

bank0

clrf PORTA ; mise à 0 des sorties du port A


clrf PORTB ; mise à 0 des sorties du port B

movlw B'00000111'
movwf CMCON ; inactivation des comparateurs
analogiques

bank1
movlw B'00000000'
movwf OPTION_REG
; bit 7 = 0 : activation des résistances de pull-up du port B
; (cela permet de faire l'économie de 5 résistances externes)
; bits 0 à 6 : ici, options non utilisées (on les met à 0, par
exemple)

movlw B'00110000'
movwf TRISA
; bit 0 du port A (RA0) = 0 : configuration en sortie (commande de
la LED1)
; bit 1 du port A (RA1) = 0 : configuration en sortie (commande de
la LED2)
; bit 2 du port A (RA2) = 0 : configuration en sortie (commande de
la LED3)
; bit 3 du port A (RA3) = 0 : configuration en sortie (commande de
la LED4)
; bit 4 du port A (RA4) = 1 : non utilisée (configuration en
entrée, par exemple)

movlw B'11111111'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée (bouton
poussoir du joueur 1)
; bit 1 du port B (RB1) = 1 : configuration en entrée (bouton
poussoir du joueur 2)
; bit 2 du port B (RB2) = 1 : configuration en entrée (bouton
poussoir du joueur 3)
; bit 3 du port B (RB3) = 1 : configuration en entrée (bouton
poussoir du joueur 4)
; bit 4 du port B (RB4) = 1 : configuration en entrée (bouton
poussoir reset)
; bits 5 à 7 du port B : non utilisés (configuration en entrée, par
exemple)

bank0
movlw B'11111111'
movwf PORTA ; on éteint toutes les leds

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

movf PORTB, W ; lecture du port B


movwf mem ; mise en mémoire tampon

; test bouton(s) poussoir(s) appuyé(s)


; on teste si l'état logique du port B est différent de 'xxx11111':
movlw B'00011111'
andwf mem, f ; met à 0 les bits 5 à 7 de mem
subwf mem, W ; comparaison avec 00011111
btfsc STATUS,Z ; test du bit Z
goto debut_programme; boutons poussoirs au repos (Z=1)

; autrement, au moins un bouton poussoir est appuyé (Z=0) :


btfss mem, 4 ; test du bit 4 (RB4 : bouton
poussoir reset)
goto debut_programme ; bouton appuyé (RB4 = 0)

; bouton poussoir au repos (RB4 = 1):


; test bouton joueur 1
btfsc mem, 0 ; test du bit 0 (RB0 : bouton joueur 1)
goto label_j2 ; bouton au repos (RB0 = 1)
; bouton appuyé :
movlw B'11111110'
movwf PORTA ; on allume la led1
goto label_reset

label_j2 ; test bouton joueur 2


btfsc mem, 1 ; test du bit 1 (RB1 : bouton joueur 2)
goto label_j3 ; bouton au repos
; bouton appuyé :
movlw B'11111101'
movwf PORTA ; on allume la led2
goto label_reset

label_j3 ; test bouton joueur 3

btfsc mem, 2 ; test du bit 2 (RB2 : bouton joueur 3)


goto label_j4 ; bouton au repos
; bouton appuyé
movlw B'11111011'
movwf PORTA ; on allume la led3
goto label_reset ;

label_j4 ; le bouton du joueur 4 est donc forcement appuyé

movlw B'11110111'
movwf PORTA ; on allume la led4

label_reset ; test bouton reset

btfsc PORTB,4 ; lecture du port B, test du bit RB4


goto label_reset ; bouton au repos
; bouton appuyé :
movlw B'11111111'
movwf PORTA ; on éteint toutes les leds
goto debut_programme ;

END