Code : Tout sélectionner
;*******************************************************************************
; Descriptif du projet:
;Decompteur programmable, sur 4 digits 7 segemnts,
;2 BP: un,+ variable. Un validation deplacement et demarrage decompteur.
;
; Le projet peut etre vue comme 4 modules independants:
;-Affichage des 4 digits avec selection du digit pour programmation
;-BP pour la programmation,selection digit ,Arrêt/marche decompteur
;-Décompteur, decompte les minutes et secondes preprogrammees
;-Alarme pas traite dans le source
;
;*******************************************************************************
; Note:PIC 16F877
;
;*******************************************************************************
ERRORLEVEL-302
list p=16f877 ;liste directive du 16F877
#include "p16f877.inc"
;********************** chargement des Macros **********************************
#include /home/moi/MPLABXProjects/8bits_MACRO_ASM/Macro_16F_ASM.asm
;***************************** Configuation des fuses **************************
;
; CONFIG
; __config 0x3D3A
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _CP_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF
;
;
;*********************** déclaration des variables *****************************
;Toutes ces variables sont globales, pour le fichier source.
; MEM MEM_us MEM1 MEM1_us MEM2 sont globales,pour l'ensemble du projet.
;
;
;*******************************************************************************
GLOBAL MEM,MEM1 ;variables utilisables dans tout le projet
GLOBAL MEM_us,MEM1_us ;pour macro delay
GLOBAL MEM2
Group_gobal udata 0x20
MEM res 1 ;MEM :MEM2 sont necessaires
MEM_us res 1
MEM1 res 1 ;pour les macros delay
MEM1_us res 1
MEM2 res 1 ;
;***********************
Group_Local udata 0x30
ComptSu res 1 ;comteur seconde
ComptSd res 1
ComptMu res 1 ;compteur minute
ComptMd res 1
Index res 1 ;lors programmation et digit concerné
Temp res 1 ;compteur temps
Temp_Val res 1 ;compteur temps touche val
Sauv res 2 ;pour sauvegarde (2) registres lors INT
;*********************** Definition des Externes *******************************
;
;*********************** Déclarations des définitions **************************
#DEFINE _XTAL_FREQ .4000000 ;ici FOSC =4MHz
#DEFINE BP_Plus PORTB,0
#DEFINE BP_Val PORTB,1
;*********************** Assignations ou constantes ****************************
DRAM EQU 0x20 ;début Mémoire Ram banque0
;*********************** MACROS ************************************************
; les MACRO sont regroupe dans le fichier Macro_16F_ASM.asm
;
;*********************** TOUT COMMENCE ICI *************************************
ORG 0X00 ;au Rest le pointeur instruction est ICI
GOTO Debut ;saut sur le label debut
ORG 0X04 ;vecteur INT
MOVWF Sauv ;sauve W
SWAPF STATUS,W ;
MOVWF Sauv+1 ;sauve status
BTFSS PIR1,TMR1IF ;test flag si TIMER1
GOTO Int0 ;NON test TMIER0
MOVLW 0x3C ; int toute le 100ms
MOVWF TMR1H
MOVLW 0xB3 ;et on recharge le TIMER1
MOVWF TMR1
BCF PIR1,TMR1IF ;RAZ du drapeau de TMR1
INCF Temp,F ; à 10 cela fera 1s
INCF Temp_Val,F ;tempo pour le BP Val
; BTFSC Index,7 ; en programmation temps
; GOTO IntS ; oui
; MOVLW 0X0A ;on test si 10fois 100mS
; SUBWF Temp,W
; BTFSS STATUS,Z
; GOTO IntS ;NON
; CLRF Temp ;OUI RAZ compteur temps et on decompte
; appel module decomptage
GOTO IntS
Int0 BTFSS INTCON,T0IF ;Test flag si TIMER0
GOTO IntS ;NON on sort
BCF INTCON,T0IE ;arret int TMR0
Aff7S ; appel a la macro Aff7S
MOVLW 0XA
MOVWF TMR0 ;Apres aff7C charge Timer0 pour 1ms
BCF INTCON,T0IF ;RAZ Flag TIMER0
BSF INTCON,T0IE ;mise en service int TMR0
IntS SWAPF Sauv+1,0
MOVWF STATUS ;restaure status
SWAPF Sauv, 1
SWAPF Sauv, 0 ;restaure W
RETFIE
;*********************** Alumage segments afficheur ****************************
LedTable
ADDWF PCL,F ; ajout au PC
RETLW B'00111111' ; LED allum?es pour afficher 0
RETLW B'00000110' ; LED allum?es pour afficher 1
RETLW B'01011011' ; LED allum?es pour afficher 2
RETLW B'01001111' ; LED allum?es pour afficher 3
RETLW B'01100110' ; LED allum?es pour afficher 4
RETLW B'01101101' ; LED allum?es pour afficher 5
RETLW B'01111101' ; LED allum?es pour afficher 6
RETLW B'00000111' ; LED allum?es pour afficher 7
RETLW B'01111111' ; LED allum?es pour afficher 8
RETLW B'01100111' ; LED allum?es pour afficher 9
;**********ici c'est votre programme principale ou main ************************
Debut
;*********************** Mise a zéro de la mémoire RAM banque0 *****************
MOVLW DRAM
MOVWF FSR
Effa CLRF INDF
INCF FSR,F ;RAZ RAM
BTFSS FSR,7
GOTO Effa
;*********************** Initialisation des ports ******************************
CLRF PORTA
CLRF PORTB ;efface les sorties des ports
CLRF PORTC
Banque1 ;accés bank1
CLRF TRISA ;RA:RA5 en sortie
MOVLW B'00000111' ;RB0:RB1 en entrées
MOVWF TRISB
CLRF TRISC ;RC0:RC7 en sortie
MOVLW B'00000110' ;PORTA digitale
MOVWF ADCON1
;*********************** validation des INT ************************************
MOVLW (1<<GIE)|(1<<PEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)
MOVWF INTCON ;Initialisation des INT
BSF PIE1,TMR1IE ;valide int TMR1
;******************* Initialisation des timers/compteurs ***********************
; ici on va travailler avec le TIMER1 et TIMER0
;*******************************************************************************
;TIMER0 nous donne 1ms pour le module clavier et decomptage, apres affichage segments
Timer0 .1000 ;int toute les 1ms
;**********************
;TIMER1 dans la programation gere le temps de clignotement sinon tempo du decomptage
;et temps appui sur BP validation
Timer1 .100000 ;int toute les 100ms
BSF T1CON,TMR1ON ; mise en service Timer1
;********************** fixation des variables *********************************
Raz_Var CLRF ComptSu ;
CLRF ComptSd ;
CLRF ComptMu ;raz des variables Temps
CLRF ComptMd ;
Init_Va MOVLW ComptSu ;intialise le pointeur sur 1er variable
MOVWF FSR ;charge le pointeur de adresse unite S
MOVLW B'10000001' ;B0:B3 index sur 1er digit
MOVWF Index ;B7: mode programmation
;********************** Boucle principale **************************************
BouP BTFSC BP_Val ;BP val appuiyé ?
GOTO Plus ;NON voir le BP plus
CALL Temp800µs ;OUI petite tempo anti rebond
CLRF Temp_Val ;declenche la tempo
Val1 BTFSC BP_Val ;malgres la tempo
GOTO Val0 ;le BP a etait relaché donc on sort
BTFSS Temp_Val,2 ;appuie long 400ms?
GOTO Val1 ;NON on reboucle
BTFSS Index,7 ;fin tempo mode programmation?
GOTO Raz_Var ;oui arret decomptage on boucle sur RAZ
BCF Index,7 ;NON on passe en decomptage
GOTO Start_D ;on lancement decomptage
;**********************
Val0 BTFSS Index,7 ;mode Decomptage?
GOTO Decom ;oui
BCF STATUS,C
RLF Index,F ;decalage index digit vers la GAUCHE
BTFSC Index,4 ;Index hors butée?
GOTO Init_Va ;oui on reinitialise les variables
BSF Index,7 ;repositionne le bit programmation
INCF FSR,F ;NON pointeur variable +1
GOTO BouP ;boucle principale
;*********************** Bouton plus *******************************************
Plus BTFSS Index,7 ;mode decomptage ?
GOTO Decom ;oui
BTFSC BP_Plus ;BP_Plus appuyé?
GOTO BouP ;NON on reboucle sur Principale
CALL Temp800µs ;petite tempo antirebond
Plus0 BTFSS BP_Plus ;BP_Plus relaché
GOTO Plus0 ;NON on boucle
INCF INDF,F ;adresse pointé +1
MOVLW 0X0A ;test butée 9
BTFSS Index,0
BTFSC Index,2 ;on test les digits max 9 ou 5
GOTO Plus1
MOVLW 0X6 ;test butée 5
Plus1 SUBWF INDF,W
BTFSC STATUS,C
CLRF INDF ;si butée raz adresse pointé
GOTO BouP ;on Reboucle sur boucle principale
;*******************************************************************************
Start_D BTFSS BP_Val
GOTO Start_D ;attend que BP_Val soit relaché
CLRF Temp ;RAZ du compteur temps, decomptage parti
;*********************** Lance decomptage **************************************
Decom MOVFW ComptSu ;on effectue un OU logique
IORWF ComptSd,W
IORWF ComptMu,W ;avec les variables Temps et on
IORWf ComptMd,W ;test si zero
BTFSC STATUS,Z
GOTO Init_Va ;oui initialise variables
MOVLW 0X0A ;on test si 10fois 100mS
SUBWF Temp,W
BTFSS STATUS,Z
GOTO BouP ;NON
CLRF Temp ;OUI RAZ compteur temps et on decompte
;*********************** *
DECF ComptSu,F ;uS-1
BTFSS ComptSu,7 ;debordement?
GOTO BouP ;NON
MOVLW 0X09
MOVWF ComptSu ;uS= 9
;*********************** *
DECF ComptSd,F ;Sd -1
BTFSS ComptSd,7 ;debordement?
GOTO BouP ;NON
MOVLW 0X5
MOVWF ComptSd ;Sd =9
;*********************** * ici c'est notre macro
DECF ComptMu,F ;Mu-1
BTFSS ComptMu,7 ;debordement?
GOTO BouP ;NON
MOVLW 0X9
MOVWF ComptMu ;Mu =9
;*********************** *
DECF ComptMd ;Md -1
GOTO BouP
;*********************** ici c'est des SPG **************************************
;ici spg car plusieurs fois utilisés dans le source sinon macro
;********************** Tempo de 800µs *****************************************
Temp800µs
delay_us .800
RETURN
;*********************** Tempo de 1ms ******************************************
END ;fin pour le compilateur
sur ce bonne fin d'année a bientôt, le plaisir de vous retrouver en 2017
A+
PS pour la programmation modulaire ici http://www.techno-science.net/?onglet=g ... tion=11420 aussi ou sur votre moteur de recherche favori