1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| ; Initialisation des adresses mémoire pour les variables
ORG 0H
RAM1 EQU 007Ch
RAM2 EQU 007Dh
RAM3 EQU 007Eh
; Déclaration des variables pour les unités, dizaines et centaines
Unites DATA RAM1
Dizaines DATA RAM2
Centaines DATA RAM3
; Constantes pour les valeurs THIGH et TLOW
THIGH EQU 0CBH
TLOW EQU 0EAH
; Définition de la deuxième page de la mémoire
RAM EQU 07FH ; 7F = 128 bits
; Déclaration des variables Itr et COMPT
Itr DATA RAM
COMPT DATA RAM - 1
; Définition de la valeur de NCYC
NCYC EQU 1 ; Changez cette valeur si nécessaire
; Saut vers l'adresse 50H pour démarrer le programme
LJMP 50H
; Vecteur d'interruption INT0 (START/STOP)
; Utilisez la fonction CPL pour Démarrer/Arrêter le temporisateur
ORG 0003H
LJMP INT0_ISR
; Implémentation de la routine d'interruption INT0
INT0_ISR:
SETB P3.2 ; Activer le port P3.2
CPL TR0 ; Inverser l'état du compteur TIMER0
RETI ; Retour de l'interruption
; Vecteur d'interruption TIMER0
ORG 000BH
LJMP T0ISR
; Vecteur d'interruption INT1
ORG 0013H
LJMP INT1_ISR
; Implémentation de la routine d'interruption INT1
INT1_ISR:
SETB P3.3 ; Activer le port P3.3
JB TR0, NOT_RUNNING ; Vérifier si le compteur TIMER0 est arrêté
CLR TR0 ; Si oui, arrêter le compteur TIMER0
; Réinitialiser les variables Unites, Dizaines et Centaines à zéro
MOV Centaines, #0
MOV Dizaines, #0
MOV Unites, #0
; Affichage des centaines, dizaines et unités
MOV A, Centaines
CALL LED7
MOV R2, A
MOV A, Dizaines
CALL LED7
MOV R1, A
MOV A, Unites
CALL LED7
MOV R0, A
; Sauter à la sortie de l'interruption
LJMP EXIT_ISR
; Si le compteur TIMER0 n'est pas arrêté, sortir de l'interruption
NOT_RUNNING:
LJMP EXIT_ISR
; Sortie de l'interruption
EXIT_ISR:
RETI
; Initialisation du programme principal
ORG 50H
CLR P3.7 ; Effacer le port P3.7
MOV R0, #00 ; Initialiser R0 à zéro
MOV COMPT, #00 ; Initialiser COMPT à zéro
MOV Itr, #NCYC ; Initialiser Itr à NCYC
; Configuration du TIMER0
MOV TMOD, #00000001B ; Gated 16-bit TIMER0
MOV TCON, #00000001B ; Exécution de TIMER0 et configuration de EXT0 sur front négatif
MOV IE, #10000111B ; Autorisation des interruptions pour TIMER0 et EXT0
; Initialisation des valeurs pour le TIMER0
MOV TH0, #THIGH ; Initialiser TH0 à THIGH
MOV TL0, #TLOW ; Initialiser TL0 à TLOW
boucle:
MOV P0, R0 ; Afficher les unités
MOV P0, #0 ; Rafraîchir l'afficheur 7 segments
MOV P1, R1 ; Afficher les dizaines
MOV P1, #0 ; Rafraîchir l'afficheur 7 segments
MOV P2, R2 ; Afficher les centaines
MOV P2, #0 ; Rafraîchir l'afficheur 7 segments
SJMP boucle ; Boucle infinie
; Routine d'interruption TIMER0
T0ISR:
DJNZ Itr, SAUT ; Décrémenter Itr et sauter à SAUT si différent de zéro
LJMP SORTIE ; Sauter à SORTIE si Itr est nul
SAUT:
CLR TR0 ; Arrêter le TIMER0
MOV TH0, #THIGH ; Réinitialiser TH0 à THIGH
MOV TL0, #TLOW ; Réinitialiser TL0 à TLOW
SETB TR0 ; Activer le TIMER0
RETI ; Retour de l'interruption
SORTIE:
CLR TR0 ; Arrêter le TIMER0
MOV TH0, #THIGH ; Réinitialiser TH0 à THIGH
MOV TL0, #TLOW ; Réinitialiser TL0 à TLOW
SETB TR0 ; Activer le TIMER0
CPL P3.7 ; Inverser l'état de P3.7
MOV Itr, #NCYC ; Réinitialiser Itr à NCYC
INC Unites ; Incrémenter les unités
; Vérifier si les unités sont égales à 10
MOV A, Unites
CJNE A, #10, EndIf_Unites
INC Dizaines ; Incrémenter les dizaines
MOV Unites, #0 ; Réinitialiser les unités à zéro
EndIf_Unites:
; Vérifier si les dizaines sont égales à 10
MOV A, Dizaines
CJNE A, #6, EndIf_Dizaines
INC Centaines ; Incrémenter les centaines
MOV Dizaines, #0 ; Réinitialiser les dizaines à zéro
EndIf_Dizaines:
; Vérifier si les centaines sont égales à 10
MOV A, Centaines
CJNE A, #10, EndIf_Centaines
MOV Centaines, #0 ; Réinitialiser les centaines à zéro
EndIf_Centaines:
; Affichage des centaines
MOV A, Centaines
CALL LED7
MOV R2, A
; Affichage des dizaines
MOV A, Dizaines
CALL LED7
MOV R1, A
; Affichage des unités
MOV A, Unites
CALL LED7
MOV R0, A
RETI
; Tableau de correspondance pour l'affichage des chiffres sur l'afficheur 7 segments
LED7:
INC A
MOVC A,@A+PC
RET
TABLE:
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 6FH, 0FFH, 0
END ; Mot clé indiquant la fin du code |
Partager