;********************************************************************** ; * ; NOM: Decodeur BCD pour PIC16F84 avec affichage sur 7segment * ; Date: 23/04/04 * ; Version: 0.01 * ; Circuit: Plaque d'essai * ; Auteur: FlyingMind * ; * ;********************************************************************** ; * ; Fichier requis: P16F84.inc * ; * ; * ; * ;********************************************************************** ; * ; Notes: affiche avec une frequence de ~1Hz les chiffres de * ; 0 à 9 en utilisant le PORTB, une interruption tmr0 * ; et c'est tout :) Merci a Bigonoff pour ses cours * ; et son fichier de structure. * ; * ;********************************************************************** LIST p=16F84 ; Définition de processeur #include ; 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'00000111' ; Valeur registre option ; Résistance pull-up ON ; Prescaler à 256 INTERMASK EQU H'00A0' ; Masque d'interruption ; Interruptions sur tmr0 TIMEBASE EQU 8 ; Valeur permettant de modifier la vitesse de defilement des chiffres ;********************************************************************* ; MACRO * ;********************************************************************* BANK0 macro bcf STATUS , RP0 ; passer banque0 endm BANK1 macro bsf STATUS , RP0 ; passer banque1 endm READEE macro adeeprom ; lecture d'une adresse EEPROM movfw adeeprom ; charger adresse eeprom movwf EEADR ; adresse à lire dans registre EEADR bsf STATUS , RP0 ; passer en banque1 bsf EECON1 , RD ; lancer la lecture EEPROM bcf STATUS , RP0 ; repasser en banque0 movf EEDATA , w ; charger valeur lue dans W endm ; fin de la macro ;********************************************************************* ; 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 compt1: 1 ; compteur de boucle nbre: 1 ; nombre a afficher sur l'afficheur 7segments ENDC ; Fin de la zone ;********************************************************************* ; DECLARATIONS DE LA ZONE EEPROM * ;********************************************************************* org 0x2100 ; adresse début zone eeprom DE 0x3F ; Valeur du port B lorsque le chiffre affiché est 1 DE 0x06 ; valeur du port B " " " " " 2 DE 0x5B ; etc... DE 0x4F DE 0x66 DE 0x6D DE 0x7D DE 0x07 DE 0x7F DE 0x6F ;********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Adresse 0: initialiser ;********************************************************************** ; 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é ; switch vers différentes interrupts ; inverser ordre pour modifier priorités ;---------------------------------------- btfsc INTCON,T0IE ; tester si interrupt timer autorisée btfss INTCON,T0IF ; oui, tester si interrupt timer en cours goto restorereg ; non s'en aller call inttimer ; oui, traiter interrupt timer bcf INTCON,T0IF ; effacer flag interrupt timer goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS ;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 retfie ; return from interrupt ;********************************************************************** ; INTERRUPTION TIMER 0 * ;********************************************************************** inttimer BANK0 decfsz compt1 , f ;compt1 ?= 0 return ;non, on quitte READEE nbre ;on charge le code BCD de nbre dans W movwf PORTB ;on affiche sur portb les data incf nbre , f ;on icremente nbre movlw TIMEBASE ;en vue de la reinitialisation de compt1 movwf compt1 ;reinitailisation de comp1 movfw nbre ;on charge w avec nbre en prevision du test sublw 10 ;on soustrait a 10 la valeur de nbre (pour inclure 9 a l'ensemble) btfss STATUS,Z ;est-ce egale a 0 ? return ;non, donc je part movwf 0 ;sinon, je remet a 0 nbre movwf nbre return ; fin d'interruption timer ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf PORTA ; Sorties portA à 0 clrf PORTB ; sorties portB à 0 BANK1 ; passer banque1 movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option clrf EEADR ; permet de diminuer la consommation ; Effacer RAM ; ------------ movlw 0x0c ; initialisation pointeur movwf FSR ; pointeur d'adressage indirect init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,6 ; tester si fin zone atteinte (>=40) goto init1 ; non, boucler btfss FSR,4 ; tester si fin zone atteinte (>=50) goto init1 ; non, boucler movlw 0 movwf TRISB ; Port B en sortie (exemple) BANK0 ; passer banque0 movlw TIMEBASE movwf compt1 ;initialisation de compt1 movlw INTERMASK ; masque interruption movwf INTCON ; charger interrupt control goto start ; sauter programme principal ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start ;la, je ne fait rien, libre a vous de mettre quelque chose :D goto start ; boucler END ; directive fin de programme