Vous êtes sur la page 1sur 8

;**********************************************************************

; *
; GROUPE : 2 A / R ... *
; POSTE : (1 à 8) : ... *
; DATE DE REMISE DU RAPPORT : .../.../....... *
; *
;**********************************************************************
; *
; Auteur : *
; Titre : *
; Date : *
; *
;**********************************************************************
; *
; Hardware (quoi est câblé où ?) *
; *
; *
; *
; *
;**********************************************************************

LIST p=16F84 ; Définition de processeur


#include <p16F84.inc> ; Définitions des constantes

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

; '__CONFIG' précise les paramètres encodés dans le processeur au moment


de
; la programmation du processeur. Les définitions sont dans le fichier
include.
; Voici les valeurs et leurs définitions :
; _CP_ON Code protection ON : impossible de relire
; _CP_OFF Code protection OFF
; _PWRTE_ON Timer reset sur power on en service
; _PWRTE_OFF Timer reset hors-service
; _WDT_ON Watch-dog en service
; _WDT_OFF Watch-dog hors service
; _LP_OSC Oscillateur quartz basse vitesse
; _XT_OSC Oscillateur quartz moyenne vitesse
; _HS_OSC Oscillateur quartz grande vitesse
; _RC_OSC Oscillateur à réseau RC

;*********************************************************************
; ASSIGNATIONS *
;*********************************************************************

OPTIONVAL EQU B'01000000' ; Valeur registre option


; Résistance pull-up ON
; Interrupt flanc montant RB0
; Préscaler timer à 8

INTERMASK EQU B'00000000' ; Masque d'interruption


; Pas d'interruption

CONFIG_PORTA EQU B'00011111' ; Les 5 ports du PORTA sont configurés


en entrée

CONFIG_PORTB EQU B'11110000' ; Les 4 premier ports du PORTB sont


configurés en entrée
; les 4 dernier en sorties

;*********************************************************************
; DEFINE *
;*********************************************************************

;Exemple :
;#DEFINE LED PORTB <3:0>
;*********************************************************************
; MACRO *
;*********************************************************************

BANQUE1 macro
bsf STATUS,RP0 ; sélectionner BANQUE 1
endm

BANQUE0 macro
bcf STATUS,RP0 ; sélectionner BANQUE 0
endm

Lecture macro ; Début de la macro "Lecture"


RLF PORTB,W
RLF PORTB,F
movlw d'12' ;
movwf FSR ; Move 12 dans FSR
movlw d'4' ;
movwf Cpt ; Move 4 dans Cpt
pulling
Btfss INTCON, RBIF ; Test de RBIF
goto pulling ; Pulling si RBIF = 0
bcf INTCON, RBIF ; Reset de RBIF Si = 1
movfw PORTB ;
movwf Chiffre ; Stockage de la PortB dans Chiffre
;
movlw b'11110000' ;
subwf Chiffre ;
btfss STATUS,Z ; Test de Chiffre
goto pulling ; Retour à pulling si PortB =
"11110000" (15 = pas de touche)
swapf PORTB,w ; Swap les 4 premier et denier Bit de
PortB et stock dans W
movwf INDF ; stock la PortB dans la RAM
incf FSR ; inc FSR
decfsz Cpt ; décrémente et test si Cpt = 0
goto pulling ; retour à pulling pour le prochain
chiffre
endm ; fin de la macro "Lecture"

CodeOk macro ; Début de la macro "CodeOk"


movlw d'12' ;
movwf FSR ; Move 12 dans FSR
movlw d'4' ;
movwf Cpt ; Move 4 dans Cpt
movlw d'0' ;
movwf EEADR ; Move 0 dans EEADR
Début ;
movlw b'00001111' ; On filtre pour garde que les 4
dernier bit de INDF et on stock
andwf INDF,w ; le résulta dans "W"

bsf EECON1, RD ; Activer la lecture


subwf EEDATA,w ; Calcule pour savoir si la valur de la
RAM = EEDATA et stocker dans W
bcf EECON1, RD ; Désactiver la lecture

btfss STATUS,Z ; Test de W


goto Fail ; Si W = 1 Test ==> Fail et fin du
programme
bsf Résultat,0 ; Si W = 0, renvoi 1 car le code saisi
est bon et continue le programme
decfsz Cpt ; Décrémente et test si Cpt = 0
goto suite ; Si Cpt = 1, on continue le programme
goto fin ; Si Cpt = 0, fini du programme
suite ;
incf FSR ; incrémentation de FRS
incf EEADR ; incrémentation de EEDATA
goto Début ; Retour au Début
Fail ;
bcf Résultat,0 ; Renvoi 0 si le code saisi est mauvais
fin ;
endm ; fin de la macro "Lecture"

;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************

CBLOCK 0x00C ; début de la zone variables


Cpt
Cpt1
Chiffre
Résultat : 1
ENDC ; Fin de la zone

;*********************************************************************
; DECLARATIONS DE LA ZONE EEPROM *
;*********************************************************************

org 0x2100 ; adresse début zone eeprom

DE d'1' ; adresse h'00' initialisée à 1


DE d'2' ; adresse h'01' initialisée à 2
DE d'3' ; adresse h'02' initialisée à 3
DE d'4' ; adresse h'03' initialisée à 4

;**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************

org 0x000 ; Adresse de départ après reset

;*********************************************************************
; INITIALISATIONS *
;*********************************************************************

init

BANQUE1 ; sélectionner BANQUE 1

movlw OPTIONVAL ; charger masque


movwf OPTION_REG ; initialiser registre option

movlw CONFIG_PORTA ; configuration du PORTA


movwf TRISA

movlw CONFIG_PORTB ; configuration du PORTB


movwf TRISB

BANQUE0 ; Sélectionner BANQUE 0

movlw INTERMASK ; masque interruption


movwf INTCON ; charger interrupt control

clrf PORTA ; Sorties portA à 0


clrf PORTB ; sorties portB à 0

;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
start

Lecture ; lancement de la macro "Lecture"

CodeOk ; lancement de la macro "CodeOk"

btfss Résultat,0 ; vérification du résulta


goto start ; retry si résulta = 0
goto blink ; lancement du clignotement si résulta = 1

blink
movlw d'5' ; initialisation de Cpt1 à 5
movwf Cpt1 ; pour 5 inversion de LED
encore2
xorwf PORTB,0 ; clignotement de la LED 0
xorwf PORTB,1 ; clignotement de la LED 1
xorwf PORTB,2 ; clignotement de la LED 2
xorwf PORTB,3 ; clignotement de la LED 3
call Tempo ; appelle de la tempo
decfsz Cpt1 ; décrémente et sc
goto encore2
goto start ; boucler

;;clignotement ;;

Tempo ;tempo de 1 sec


bsf STATUS, RP0 ; Passer en banque 1
movlw B'10000111' ; Prescaler 256
movwf OPTION_REG ;
bcf STATUS, RP0 ; retour en banque 0
movlw D'16' ;
movwf Cpt ; initialisation du compteur cpt à 16
encore
movlw d'0' ; initialisation de TIMER0 à 256
movwf TMR0 ;
polling
btfss INTCON, T0IF ; pulling du flag de Timer0
goto polling ;
decfsz Cpt ; test Cpt si = 0
goto encore ; renvois à "encore" si cpt n'est pas =
à 0

return ; fin de la tempo

;*********************************************************************
; PROCEDURES *
;*********************************************************************

END ; directive fin de programme

Vous aimerez peut-être aussi