EX1 :
.ORG 0x00 ; Adresse de départ
; Initialisation des valeurs
LDI R0, 14 ; Charger 14 dans R0 (premier nombre)
LDI R1, 4 ; Charger 4 dans R1 (deuxième nombre)
; Début du calcul du PGCD
PGCD:
CP R0, R1 ; Comparer R0 et R1
BRLO Swap ; Si R0 < R1, échanger les deux registres
SUB R0, R1 ; R0 = R0 - R1
BRNE PGCD ; Si R0 ≠ 0, continuer la boucle
RJMP Done ; Sinon, le PGCD est trouvé
Swap:
MOV R4, R0 ; Sauvegarder R0 dans R4
MOV R0, R1 ; R0 = R1
MOV R1, R4 ; R1 = ancienne valeur de R0
RJMP PGCD ; Retour au début de la boucle
Done:
MOV R2, R1 ; Le PGCD est dans R1 (ou R0, car ils sont égaux à ce stade)
RJMP Done ; Boucle infinie pour terminer
EX2 :
.ORG 0x0000 ; Définir l'adresse de départ du programme
.EQU N = 0x30 ; N = 48 (limite du compteur)
; Initialisation des registres et des ports
LDI R16, 0x00 ; Initialiser le compteur à 0
LDI R20, 0xFF ; Configurer toutes les broches de PORTB en sortie (pour les boutons)
OUT DDRD, R20 ; Configurer toutes les pins de PORTB comme sorties
LDI R21, N ; Charger la valeur N (limite du compteur) dans R21
; Configurer PB5 (BP_comp) et PB4 (BP_reset) comme entrées
CBI DDRB, 5 ; Configurer PB5 (BP_comp) comme entrée
CBI DDRB, 4 ; Configurer PB4 (BP_reset) comme entrée
; Boucle principale
BP_comp:
SBIS PINB, 5 ; Vérifier si BP_comp est appuyé (PB5 = 0)
RJMP BP_reset ; Si BP_reset est appuyé, aller à BP_reset
RJMP increm ; Si BP_comp est appuyé, passer à increm
; Incrémenter le compteur
increm:
INC R16 ; Incrémenter le compteur
CPI R16, N ; Comparer le compteur avec N
BREQ LED ; Si égal à N, aller à LED
RJMP BP_comp ; Sinon, revenir à BP_comp
; Affichage du compteur sur les LEDs
LED:
OUT PORTD, R16 ; Afficher la valeur du compteur sur PORTD (8 LEDs)
RJMP mettre_zero ; Passer à la fonction pour remettre le compteur à zéro
; Remettre le compteur à zéro après avoir atteint N
mettre_zero:
LDI R16, 0x00 ; Remettre le compteur à 0
RJMP BP_comp ; Revenir à la vérification du bouton BP_comp
; Fonction de réinitialisation (BP_reset)
BP_reset:
LDI R16, 0x00 ; Remettre le compteur à 0
OUT PORTD, R16 ; Afficher 0 sur les LEDs
RCALL retard ; Appeler la fonction de retard
RJMP BP_comp ; Revenir à BP_comp
; Fonction de retard (simple boucle)
retard:
LDI R18, 0xFF ; Charger un délai dans R18
retard_loop:
NOP ; No Operation (NOP) pour créer un petit délai
DEC R18 ; Décrémenter R18
BRNE retard_loop ; Si R18 != 0, continuer la boucle de retard
RET ; Retour de la fonction de retard
EX3 :
.ORG 0x00
.EQU ADS_RAM=0x0400 ; Adresse de départ de la RAM
.EQU RAM_SIZE=20 ; Nombre de cases mémoire à examiner
CBI DDRB,5 ; Configurer PB5 comme entrée (bouton poussoir)
SBI DDRB,4 ; Configurer PB4 comme sortie (LED)
LDI R30, LOW(ADS_RAM) ; Charger la partie basse de l'adresse RAM
LDI R31, HIGH(ADS_RAM) ; Charger la partie haute de l'adresse RAM
BP_charger:
SBIS PINB, 5 ; Attendre que le bouton soit pressé
RJMP BP_charger
IN R18, PIND ; Lire la donnée depuis le port D
CLR R3 ; Initialiser R3 à 0
CLR R4 ; Initialiser R4 à 0
CLR R17 ; Réinitialiser le compteur
search_loop:
LD R0, Z ; Charger la donnée pointée par Z
CP R0, R18 ; Comparer avec la donnée lue
BREQ found_data ; Si trouvé, sauter à found_data
ADIW ZL, 1 ; Incrémenter Z (passer à l'adresse suivante)
INC R17 ; Incrémenter le compteur
CPI R17, RAM_SIZE ; Vérifier si toutes les cases ont été parcourues
BRLO search_loop ; Continuer si la fin n'est pas atteinte
RJMP mettre_zero ; Si la donnée n'est pas trouvée après tout le parcours
found_data:
MOV R3, R30 ; Stocker l'adresse basse dans R3
MOV R4, R31 ; Stocker l'adresse haute dans R4
SBI PORTB, 4 ; Allumer la LED
RJMP BP_charger ; Retourner à l'attente du bouton poussoir
mettre_zero:
CLR R3 ; Mettre R3 à 0
CLR R4 ; Mettre R4 à 0
CBI PORTB, 4 ; Éteindre la LED
RJMP BP_charger ; Retourner à l'attente du bouton poussoir
EX4 :
.EQU LED = 5
SBI DDRB,LED
comparaison:
CP R0,R1
BRGE allume_led
RJMP attient_led
allume_led:
SBI PORTB,LED
RJMP comparaison
attient_led
CBI PORTB,LED
RJMP comparaison
EX4 :
; Définir le symbole pour la LED
.EQU LED = 5 ; LED connectée à PB5
.ORG 0x00 ; Adresse de départ
start:
; Initialisation du Port B
LDI R16, (1 << LED) ; Charger la valeur pour définir PB5 comme sortie
OUT DDRB, R16 ; Configurer PB5 en sortie
; Charger les données signées dans R0 et R1
LDI R0, -5 ; Exemple : Charger -5 dans R0
LDI R1, 3 ; Exemple : Charger 3 dans R1
; Comparaison des deux valeurs
CP R0, R1 ; Comparer R0 et R1 (signé)
BRGE led_on ; Si R0 ≥ R1, aller à l'allumage de la LED
led_off:
CBI PORTB, LED ; Éteindre la LED (PB5 = 0)
RJMP end ; Fin du programme
led_on:
SBI PORTB, LED ; Allumer la LED (PB5 = 1)
end:
RJMP end ; Boucle infinie pour terminer
EX5 :
.ORG 0x00
.EQU data1=0x0967
.EQU data2=0x1200
CBI DDRB,5
CBI DDRB,4
MOVW R1,data1
MOVW R3,data2
ADIW R5:R4,R1
ADIW R5:R4,R3
BRLO retenu
BRVS over_flow
RJMP end
retenu:
SBI PORTB,5
RET
overflow:
SBI PORTB,4
RET
end:
RJMP end
EX6 :
.ORG 0x00
.EQU tem=0x5A
.EQU led=5
SBI PORTB,led
LDI R16, 0x00
OUT DDRD, R16
LDI R1,tem
IN R0,PORTD
CP R0,R1
BRSH allume_led
RJMP eteint_led
allume led:
SBI PORTB,5
RJMP end
eteint_led:
CBI PORTB,led
RJMP end
end:
RJMP end
EX7 :
.ORG 0x00 ; Début du programme
; Entrée : Nombre binaire 8 bits dans R0
; Sortie :
; - Chiffre fort (centaines) dans R7
; - Chiffre milieu (dizaines) dans R6
; - Chiffre faible (unités) dans R5
LDI R16, 100 ; Charger 100 dans R16 pour calculer les centaines
CLR R7 ; Initialiser R7 (chiffres des centaines)
centaines_loop:
CP R0, R16 ; Comparer R0 avec 100
BRLO dizaines ; Si R0 < 100, passer au calcul des dizaines
SUB R0, R16 ; R0 = R0 - 100
INC R7 ; Incrémenter le compteur des centaines
RJMP centaines_loop ; Répéter jusqu'à ce que R0 < 100
dizaines:
LDI R16, 10 ; Charger 10 dans R16 pour calculer les dizaines
CLR R6 ; Initialiser R6 (chiffres des dizaines)
dizaines_loop:
CP R0, R16 ; Comparer R0 avec 10
BRLO unites ; Si R0 < 10, passer au calcul des unités
SUB R0, R16 ; R0 = R0 - 10
INC R6 ; Incrémenter le compteur des dizaines
RJMP dizaines_loop ; Répéter jusqu'à ce que R0 < 10
unites:
MOV R5, R0 ; Copier le reste (R0) dans R5 (chiffres des unités)
fin:
RJMP fin ; Boucle infinie pour terminer le programme
EX8 :
.ORG 0x00 ; Début du programme
.EQU char_recherche = 'o' ; Caractère à rechercher ('o' dans cet exemple)
.DEF temp = R16 ; Registre temporaire
; Chaîne de caractères en ROM
chaine: .DB "Bonjour tous le monde", 0
; Initialisation
LDI ZL, LOW(chaine << 1) ; Charger l'adresse basse de la chaîne dans ZL
LDI ZH, HIGH(chaine << 1) ; Charger l'adresse haute de la chaîne dans ZH
CLR R0 ; Initialiser le compteur d'occurrences à 0
boucle:
LPM temp, Z+ ; Charger le prochain caractère de la chaîne (Z pointe vers la chaîne en ROM)
CPI temp, 0 ; Comparer le caractère avec 0 (fin de chaîne)
BREQ fin ; Si c'est la fin de chaîne, sauter à la fin
CPI temp, char_recherche; Comparer le caractère avec le caractère recherché
BRNE boucle ; Si ce n'est pas une correspondance, continuer la boucle
INC R0 ; Incrémenter le compteur d'occurrences
RJMP boucle ; Recommencer la boucle
fin:
RJMP fin ; Boucle infinie à la fin du programme
EX9 :
.ORG 0x00 ; Début du programme
; Le registre R0 contient le chiffre (0-9)
; Le registre R1 contiendra le code ASCII correspondant
LDI R16, '0' ; Charger le code ASCII du caractère '0' dans R16
ADD R1, R0, R16 ; Ajouter le code ASCII de '0' au chiffre dans R0
; Le résultat est le code ASCII correspondant au chiffre
; Fin du programme (peut être utilisé dans une boucle ou étendu pour d'autres traitements)
RJMP $
EX10 :
; Définition des broches pour les LEDs
.EQU R1 = 0 ; Feu rouge voie 1 -> PD0
.EQU O1 = 1 ; Feu orange voie 1 -> PD1
.EQU V1 = 2 ; Feu vert voie 1 -> PD2
.EQU R2 = 3 ; Feu rouge voie 2 -> PD3
.EQU O2 = 4 ; Feu orange voie 2 -> PD4
.EQU V2 = 5 ; Feu vert voie 2 -> PD5
.DEF delay_counter = R16 ; Registre pour compter les cycles de délai
.DEF i = R17 ; Registre pour des boucles internes
; Début du programme
.ORG 0x00
RESET:
LDI R16, 0xFF ; Configurer PORTD en sortie
OUT DDRD, R16
MAIN_LOOP:
; État 1 : V1 allumé, R2 allumé (voie 1 passe)
SBI PORTD, V1 ; Allumer V1 (vert voie 1)
SBI PORTD, R2 ; Allumer R2 (rouge voie 2)
CALL DELAY_30S ; Attendre 30 secondes
CBI PORTD, V1 ; Éteindre V1
; État 2 : O1 allumé, R2 toujours allumé
SBI PORTD, O1 ; Allumer O1 (orange voie 1)
CALL DELAY_2S ; Attendre 2 secondes
CBI PORTD, O1 ; Éteindre O1
; État 3 : R1 allumé, R2 allumé (sécurité)
SBI PORTD, R1 ; Allumer R1 (rouge voie 1)
CALL DELAY_10S ; Attendre 10 secondes
CBI PORTD, R2 ; Éteindre R2
; État 4 : R1 allumé, V2 allumé (voie 2 passe)
SBI PORTD, V2 ; Allumer V2 (vert voie 2)
CALL DELAY_30S ; Attendre 30 secondes
CBI PORTD, V2 ; Éteindre V2
; État 5 : R1 allumé, O2 allumé
SBI PORTD, O2 ; Allumer O2 (orange voie 2)
CALL DELAY_2S ; Attendre 2 secondes
CBI PORTD, O2 ; Éteindre O2
; État 6 : R1 et R2 allumés (sécurité)
SBI PORTD, R2 ; Allumer R2 (rouge voie 2)
CALL DELAY_10S ; Attendre 10 secondes
CBI PORTD, R1 ; Éteindre R1
RJMP MAIN_LOOP ; Répéter le cycle
; ================== Sous-programmes de délai ==================
; Délai approximatif basé sur une fréquence de 16 MHz et un prescaler.
; Boucle interne pour générer des délais de quelques secondes.
DELAY_30S:
LDI delay_counter, 30
DELAY_LOOP_30S:
CALL DELAY_1S
DEC delay_counter
BRNE DELAY_LOOP_30S
RET
DELAY_10S:
LDI delay_counter, 10
DELAY_LOOP_10S:
CALL DELAY_1S
DEC delay_counter
BRNE DELAY_LOOP_10S
RET
DELAY_2S:
LDI delay_counter, 2
DELAY_LOOP_2S:
CALL DELAY_1S
DEC delay_counter
BRNE DELAY_LOOP_2S
RET
DELAY_1S:
LDI i, 250 ; Nombre d'itérations (approximatif)
DELAY_LOOP_1S:
NOP
NOP
DEC i
BRNE DELAY_LOOP_1S
RET
.END