Vous êtes sur la page 1sur 9

16f84

; "Feux tricolores"
; Fabrice Sincère (C) décembre 2006
; IUT Nancy-Brabois
; version 1.00
; microcontrôleur PIC 16F84A
; développé avec Microchip MPLAB IDE

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 : 20 MHz)

;xxxxxxx
; define
;xxxxxxx

#define LEDVerteFeuRoutePrincipale PORTB,2


#define LEDJauneFeuRoutePrincipale PORTB,3
#define LEDRougeFeuRoutePrincipale PORTB,4

#define LEDVerteFeuRouteSecondaire PORTB,5


#define LEDJauneFeuRouteSecondaire PORTB,6
#define LEDRougeFeuRouteSecondaire PORTB,7

#define LEDVertePietonRoutePrincipale PORTA,0


#define LEDRougePietonRoutePrincipale PORTA,1

#define LEDVertePietonRouteSecondaire PORTA,2


#define LEDRougePietonRouteSecondaire PORTA,3

;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' ; début de la zone des registres d'usage général du


16F84A

compteur1 : 1 ; variable de le boucle de temporisation


compteur2 : 1 ; variable de le boucle de temporisation
compteur3 : 1 ; variable de le boucle de temporisation
duree : 1 ; durée de la temporisation
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

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 d'une résistance externe sur le
port RB0)
; 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 LED Verte Piéton Route principale)
; bit 1 du port A (RA1) = 0 : configuration en sortie (commande de
la LED Rouge Piéton Route principale)
; bit 2 du port A (RA2) = 0 : configuration en sortie (commande de
la LED Verte Piéton Route secondaire)
; bit 3 du port A (RA3) = 0 : configuration en sortie (commande de
la LED Rouge Piéton Route secondaire)
; bit 4 du port A (RA4) = 1 : non utilisé (configuration en entrée,
par exemple)

movlw B'00000011'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée (boutons
poussoirs)
; bit 1 du port B (RB1) = 1 : non utilisé (configuration en entrée,
par exemple)
; bit 2 du port B (RB2) = 0 : configuration en sortie (commande de
la LED Verte Feu Route principale)
; bit 3 du port B (RB3) = 0 : configuration en sortie (commande de
la LED Jaune Feu Route principale)
; bit 4 du port B (RB4) = 0 : configuration en sortie (commande de
la LED Rouge Feu Route principale)
; bit 5 du port B (RB5) = 0 : configuration en sortie (commande de
la LED Verte Feu Route secondaire)
; bit 6 du port B (RB6) = 0 : configuration en sortie (commande de
la LED Jaune Feu Route secondaire)
; bit 7 du port B (RB7) = 0 : configuration en sortie (commande de
la LED Rouge Feu Route secondaire)

bank0
movlw B'00001111'
movwf PORTA ; sorties RA0 à RA3 au niveau haut
(LED éteintes)

movlw B'11111111'
movwf PORTB ; sorties RB2 à RB7 au niveau haut
(LED éteintes)

goto debut_programme

; xxxxxxxxxxxxxxxxxxxxxxxxx
; Routines de temporisation
; xxxxxxxxxxxxxxxxxxxxxxxxx

; La durée de la temporisation est réglée par le registre duree


; (duree)=D'1' 40 ms (pour un quartz 20 MHz)
; (duree)=D'25' 25*40 ms = 1 seconde
; (duree)=D'250' 250*40 ms = 10 secondes
; (duree)=D'0' 256*40 ms = 10,24 secondes (maximum)

temporisation
movf duree, W
movwf compteur3
movlw H'00' ; initialisation des compteurs
movwf compteur1
movwf compteur2

debut1 ; 3 boucles imbriquées


(256*256*compteur3 boucles *3 cycles)
decfsz compteur1, f ; décrémente (compteur1) et compare avec 0
goto debut1 ; (compteur1) différent de 0
;(compteur1) égal à 0 :
decfsz compteur2, f ; décrémente (compteur2) et compare avec 0
goto debut1
decfsz compteur3, f ; décrémente (compteur3) et compare avec 0
goto debut1
return
; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

; à la mise sous tension, les feux oranges clignotent


debut0
movlw D'25' ; temporisation d'environ 1 seconde
(25*40 ms)
movwf duree
call temporisation

bcf LEDJauneFeuRoutePrincipale ;RB3=0 : on allume la LED


Jaune Feu Route principale
bcf LEDJauneFeuRouteSecondaire ;RB6=0 : on allume la LED
Jaune Feu Route secondaire

movlw D'25' ; temporisation d'environ 1 seconde


(25*40 ms)
movwf duree
call temporisation
bsf LEDJauneFeuRoutePrincipale ; RB3 = 1 : on éteint la LED
Jaune Feu Route principale
bsf LEDJauneFeuRouteSecondaire ; RB6 = 1 : on éteint la LED
Jaune Feu Route secondaire

; détection d'un appui sur les boutons poussoirs

btfsc PORTB , 0 ; lecture du port B, test du bit RB0


goto debut0 ; RB0 = 1 (boutons poussoirs
au repos)
; RB0 = 0 (au moins un bouton poussoir est appuyé):

bcf LEDVerteFeuRoutePrincipale ; on allume la led


bcf LEDRougeFeuRouteSecondaire ; on allume la led
bcf LEDRougePietonRoutePrincipale ; on allume la led
bcf LEDVertePietonRouteSecondaire ; on allume la led

debut2
movlw D'125' ; temporisation d'environ 5 secondes
(125*40 ms)
movwf duree
call temporisation

;xxxx

bsf LEDVerteFeuRoutePrincipale ; on éteint la led


bcf LEDJauneFeuRoutePrincipale ; on allume la led
bsf LEDVertePietonRouteSecondaire ; on éteint la led
bcf LEDRougePietonRouteSecondaire ; on allume la led

movlw D'75' ; temporisation d'environ 3 secondes


(75*40 ms)
movwf duree
call temporisation

;xxx

bsf LEDJauneFeuRoutePrincipale ; on éteint la led


bcf LEDRougeFeuRoutePrincipale ; on allume la led
bcf LEDVerteFeuRouteSecondaire ; on allume la led
bsf LEDRougeFeuRouteSecondaire ; on éteint la led
bcf LEDVertePietonRoutePrincipale ; on allume le led
bsf LEDRougePietonRoutePrincipale ; on éteint la led

movlw D'250' ; temporisation d'environ 10 secondes


(250*40 ms)
movwf duree
call temporisation

;xxx

bsf LEDVerteFeuRouteSecondaire ; on éteint la led


bcf LEDJauneFeuRouteSecondaire ; on allume la led
bsf LEDVertePietonRoutePrincipale ; on éteint la led
bcf LEDRougePietonRoutePrincipale ; on allume le led

movlw D'75' ; temporisation d'environ 3 secondes


(75*40 ms)
movwf duree
call temporisation
;xxx

bcf LEDVerteFeuRoutePrincipale ; on allume la led


bsf LEDRougeFeuRoutePrincipale ; on éteint la led
bsf LEDJauneFeuRouteSecondaire ; on éteint la led
bcf LEDRougeFeuRouteSecondaire ; on allume la led
bcf LEDVertePietonRouteSecondaire ; on allume la led
bsf LEDRougePietonRouteSecondaire ; on éteint la led

; détection d'un appui sur les boutons poussoirs


debut3
btfsc PORTB , 0 ; lecture du port B, test du bit RB0
goto debut3 ; RB0 = 1 (boutons poussoirs
au repos)
; RB0 = 0 (au moins un bouton poussoir est appuyé):
goto debut2

END
16f628

; "Feux tricolores"
; Fabrice Sincère (C) décembre 2006
; IUT Nancy-Brabois
; version 1.00
; 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

;xxxxxxx
; define
;xxxxxxx

#define LEDVerteFeuRoutePrincipale PORTB,2


#define LEDJauneFeuRoutePrincipale PORTB,3
#define LEDRougeFeuRoutePrincipale PORTB,4

#define LEDVerteFeuRouteSecondaire PORTB,5


#define LEDJauneFeuRouteSecondaire PORTB,6
#define LEDRougeFeuRouteSecondaire PORTB,7

#define LEDVertePietonRoutePrincipale PORTA,0


#define LEDRougePietonRoutePrincipale PORTA,1

#define LEDVertePietonRouteSecondaire PORTA,2


#define LEDRougePietonRouteSecondaire PORTA,3
;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' ; début de la zone des registres d'usage général du


16F628A

compteur1 : 1 ; variable de le boucle de temporisation


compteur2 : 1 ; variable de le boucle de temporisation
compteur3 : 1 ; variable de le boucle de temporisation
duree : 1 ; durée de la temporisation

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 d'une résistance externe sur le
port RB0)
; 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 LED Verte Piéton Route principale)
; bit 1 du port A (RA1) = 0 : configuration en sortie (commande de
la LED Rouge Piéton Route principale)
; bit 2 du port A (RA2) = 0 : configuration en sortie (commande de
la LED Verte Piéton Route secondaire)
; bit 3 du port A (RA3) = 0 : configuration en sortie (commande de
la LED Rouge Piéton Route secondaire)
; bit 4 du port A (RA4) = 1 : non utilisé (configuration en entrée,
par exemple)

movlw B'00000011'
movwf TRISB
; bit 0 du port B (RB0) = 1 : configuration en entrée (boutons
poussoirs)
; bit 1 du port B (RB1) = 1 : non utilisé (configuration en entrée,
par exemple)
; bit 2 du port B (RB2) = 0 : configuration en sortie (commande de
la LED Verte Feu Route principale)
; bit 3 du port B (RB3) = 0 : configuration en sortie (commande de
la LED Jaune Feu Route principale)
; bit 4 du port B (RB4) = 0 : configuration en sortie (commande de
la LED Rouge Feu Route principale)
; bit 5 du port B (RB5) = 0 : configuration en sortie (commande de
la LED Verte Feu Route secondaire)
; bit 6 du port B (RB6) = 0 : configuration en sortie (commande de
la LED Jaune Feu Route secondaire)
; bit 7 du port B (RB7) = 0 : configuration en sortie (commande de
la LED Rouge Feu Route secondaire)

bank0
movlw B'00001111'
movwf PORTA ; sorties RA0 à RA3 au niveau haut
(LED éteintes)

movlw B'11111111'
movwf PORTB ; sorties RB2 à RB7 au niveau haut
(LED éteintes)

goto debut_programme

; xxxxxxxxxxxxxxxxxxxxxxxxx
; Routines de temporisation
; xxxxxxxxxxxxxxxxxxxxxxxxx

; La durée de la temporisation est réglée par le registre duree


; (duree)=D'1' 40 ms (pour un quartz 20 MHz)
; (duree)=D'25' 25*40 ms = 1 seconde
; (duree)=D'250' 250*40 ms = 10 secondes
; (duree)=D'0' 256*40 ms = 10,24 secondes (maximum)

temporisation
movf duree, W
movwf compteur3
movlw H'00' ; initialisation des compteurs
movwf compteur1
movwf compteur2

debut1 ; 3 boucles imbriquées


(256*256*compteur3 boucles *3 cycles)
decfsz compteur1, f ; décrémente (compteur1) et compare avec 0
goto debut1 ; (compteur1) différent de 0
;(compteur1) égal à 0 :
decfsz compteur2, f ; décrémente (compteur2) et compare avec 0
goto debut1
decfsz compteur3, f ; décrémente (compteur3) et compare avec 0
goto debut1
return
; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

;xxxxxxxxxxxxxxxxxxxxx
; programme principal
;xxxxxxxxxxxxxxxxxxxxx

debut_programme

; à la mise sous tension, les feux oranges clignotent


debut0
movlw D'25' ; temporisation d'environ 1 seconde
(25*40 ms)
movwf duree
call temporisation

bcf LEDJauneFeuRoutePrincipale ;RB3=0 : on allume la LED


Jaune Feu Route principale
bcf LEDJauneFeuRouteSecondaire ;RB6=0 : on allume la LED
Jaune Feu Route secondaire

movlw D'25' ; temporisation d'environ 1 seconde


(25*40 ms)
movwf duree
call temporisation

bsf LEDJauneFeuRoutePrincipale ; RB3 = 1 : on éteint la LED


Jaune Feu Route principale
bsf LEDJauneFeuRouteSecondaire ; RB6 = 1 : on éteint la LED
Jaune Feu Route secondaire

; détection d'un appui sur les boutons poussoirs

btfsc PORTB , 0 ; lecture du port B, test du bit RB0


goto debut0 ; RB0 = 1 (boutons poussoirs
au repos)
; RB0 = 0 (au moins un bouton poussoir est appuyé):

bcf LEDVerteFeuRoutePrincipale ; on allume la led


bcf LEDRougeFeuRouteSecondaire ; on allume la led
bcf LEDRougePietonRoutePrincipale ; on allume la led
bcf LEDVertePietonRouteSecondaire ; on allume la led

debut2
movlw D'125' ; temporisation d'environ 5 secondes
(125*40 ms)
movwf duree
call temporisation

;xxxx

bsf LEDVerteFeuRoutePrincipale ; on éteint la led


bcf LEDJauneFeuRoutePrincipale ; on allume la led
bsf LEDVertePietonRouteSecondaire ; on éteint la led
bcf LEDRougePietonRouteSecondaire ; on allume la led
movlw D'75' ; temporisation d'environ 3 secondes
(75*40 ms)
movwf duree
call temporisation

;xxx

bsf LEDJauneFeuRoutePrincipale ; on éteint la led


bcf LEDRougeFeuRoutePrincipale ; on allume la led
bcf LEDVerteFeuRouteSecondaire ; on allume la led
bsf LEDRougeFeuRouteSecondaire ; on éteint la led
bcf LEDVertePietonRoutePrincipale ; on allume le led
bsf LEDRougePietonRoutePrincipale ; on éteint la led

movlw D'250' ; temporisation d'environ 10 secondes


(250*40 ms)
movwf duree
call temporisation

;xxx

bsf LEDVerteFeuRouteSecondaire ; on éteint la led


bcf LEDJauneFeuRouteSecondaire ; on allume la led
bsf LEDVertePietonRoutePrincipale ; on éteint la led
bcf LEDRougePietonRoutePrincipale ; on allume le led

movlw D'75' ; temporisation d'environ 3 secondes


(75*40 ms)
movwf duree
call temporisation

;xxx

bcf LEDVerteFeuRoutePrincipale ; on allume la led


bsf LEDRougeFeuRoutePrincipale ; on éteint la led
bsf LEDJauneFeuRouteSecondaire ; on éteint la led
bcf LEDRougeFeuRouteSecondaire ; on allume la led
bcf LEDVertePietonRouteSecondaire ; on allume la led
bsf LEDRougePietonRouteSecondaire ; on éteint la led

; détection d'un appui sur les boutons poussoirs


debut3
btfsc PORTB , 0 ; lecture du port B, test du bit RB0
goto debut3 ; RB0 = 1 (boutons poussoirs
au repos)
; RB0 = 0 (au moins un bouton poussoir est appuyé):
goto debut2

END