LIST p=16F84 ; Définition de processeur #include ; Définitions de variables __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 * ;********************************************************************* TRISA_VAL EQU H'F9' ; PORT A en entrée TRISB_VAL EQU H'00' ; PORTB en sortie INTCON_VAL EQU H'A0' ; Validation des interruptions pour le TIMER0 OPTION_VAL EQU H'27' ; TIMER 0 en mode compteur avec prescaler : 256 INIT_TIMER EQU H'00' ; valeur max INIT_CHEN EQU H'FE' ; 1 diode allumee ;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE BOUTON PORTA,0 ; bouton-poussoir #DEFINE SEG1 PORTA,1 ; segment du milieu #DEFINE SEG2 PORTA,2 ; segment du milieu ;********************************************************************* ; MACRO * ;********************************************************************* BANK0 macro bcf STATUS , RP0 ; passer banque0 endm BANK1 macro bsf STATUS , RP0 ; passer banque1 endm ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C ; début de la zone variables w_temp : 1 ; Sauvegarde du registre W status_temp : 1 ; Sauvegarde du registre STATUS ENDC ; Fin de la zone ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x00 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* org 0x50 init BANK1 ; sélectionner banque 1 movlw TRISA_VAL ; charger valeur movwf TRISA ; configurer le port A movlw TRISB_VAL ; charger valeur movwf TRISB ; configurer le port B movlw OPTION_VAL ; charger valeur movwf OPTION_REG ; configurer le TIMER0 BANK0 ; repasser banque 0 movlw INTCON_VAL ; charger valeur movwf INTCON ; configurer les interruptions movlw INIT_CHEN movwf PORTB movlw INIT_TIMER ; valeur de réglage du timer movwf TMR0 ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start btfsc BOUTON ; recopie du bouton sur le segment milieu goto cest1 goto cest0 cest0 bcf SEG1 bcf SEG2 goto start cest1 bsf SEG1 bsf SEG2 goto start goto start ;********************************************************************** ; ROUTINE INTERRUPTION * ;********************************************************************** ;sauvegarder registres ;--------------------- org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé ;traitement de l'interruption ;---------------------------- movlw INIT_TIMER ; valeur de réglage du timer movwf TMR0 rlf PORTB,f ; décaler à gauche bsf PORTB,0 ; un 1 à droite btfss STATUS,0 ; fin des 8 décalages bcf PORTB,0 ; reinitialise à FE ;restaurer registres ;------------------- restorereg swapf status_temp,w ; swap ancien status, résultat dans w _ movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status bcf INTCON,T0IF ; effacer flag interrupt timer retfie ; return from interrupt END ; directive fin de programme