.equ PINA = 0x00 ; définition des adresses des ports .equ DDRA = 0x01 .equ PORTA = 0x02 .equ PIND = 0x09 .equ DDRD = 0x0A .equ PORTD = 0x0B .equ WDTCSR = 0x60 .equ EIMSK = 0x3D .equ EICRA = 0x69 .equ EICRB = 0x6A .equ RAMEND = 0x21FF .equ SPH = 0x3E ; initialisation de la pile .equ SPL = 0x3D .def d1 = r20 .def d0 = r21 .def route = r22 .org 0x000 ; Vecteur RESET jmp debut .org 0x0002 jmp b10s .org 0x0004 jmp b1s .org 0x0006 jmp marche .org 0x0008 jmp arret .org 0x0018 jmp wd .org 0x0080 afficheur: .DB 0x7E, 0x0C, 0x37, 0x9F, 0x4D, 0xDB, 0xFB, 0x0E, 0xFF, 0xDF ; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 debut: d1 <- 0 ; Digit dizaines d0 <- 0 ; Digit unités route <- 0 ; 1 : Four en marche, 0 : Four à l'arrêt cli ; Configuration des ports DDRA@IO <- 0xFF DDRB@IO <- 0xFF DDRD@IO <- 0x80 ; Interruptions EIMSK <- 0b00001111 ; On active les interruptions PD[3:0] sur front descendant EICRA <- 0b10101010 EICRB <- 0b00000000 ; Watchdog toutes les secondes WDTCSR <- 0x10 WDTCSR <- 0b01000110 sei call affiche boucle: sleep ; Le programme ne fonctionne que sur interruption jump boucle b1s: ; Bouton +1 seconde inc d0 ; Incrémente le chiffre des unités si d0 < 10 saut finb1s ; Si il reste inférieur à 10, on affiche juste d0 <- 0 ; Sinon, on le remet à 0 et on fait comme si on avait appuyé sur le bouton +10 secondes jump b10s finb1s: call affiche reti b10s: ; Bouton +10 secondes inc d1 ; On incrémente le chiffre des dizaines si d1 < 10 saut finb10s ; Si il reste inférieur à 10, on affiche juste d0 <- 9 ; Sinon, on bloque à 99 d1 <- 9 finb10s: call affiche reti affiche: PORTA@IO <- afficheur@ROM[d1] PORTB@IO <- afficheur@ROM[d0] ret marche: ; Bouton marche route <- 1 ; Met la minuterie en route PORTD@IO <- 0x80 reti arret: ; Bouton annuler route <- 0 ; Remet tout dans sa position d'origine d0 <- 0 d1 <- 0 call affiche reti wd: si route = 0 saut finwd ; Si on est pas en route, ne rien faire dec d0 ; Si on est en route, décrémenter le compteur si d0 < 10 saut prefinwd ; Si le chiffre des unités était strictement supérieur à 0, juste actualiser l'affichage d0 <- 9 ; Si le chiffre des unités était à 0, il passe à 9 et on décrémente celui des dizaines dec d1 si d1 < 10 saut prefinwd ; Si le chiffre des dizaines était strictement supérieur à 0, juste actualiser l'affichage route <- 0 ; Sinon, c'est qu'on était à 00, donc il faut éteindre le four PORTD@IO <- 0x00 d0 <- 0 ; On remet à 00 (avant ces lignes d0 = 9 et d1 = 255) d1 <- 0 prefinwd: call affiche finwd: reti