Vous êtes sur la page 1sur 3

Question pour un champion

Il s'agit de savoir, qui des 4 joueurs, a appuyé en premier ...

 Schéma électrique

Chaque joueur possède un bouton poussoir.

Sur le pupitre du maître du jeu, une LED indique qui a appuyé le premier.

L'initialisation se fait en appuyant sur le bouton poussoir "reset" :

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