Bonjour,
je travail régulièrement en assembleur pour nos µControlleur.
Actuellement j'ai dans mes projets 1 seul fichier a51 qui contient tout le code de programme.
Comme j'utilise toujours les mêmes composants (lcd, clavier ...) je voudrais mettre le code assembleur pour chaque peripherique dans un fichier correspondant. Ceci afin de réduire la taille du fichier principale.
Je sais qu'il faut utiliser les fonctions PUBLIC et EXTRN, mais j'ai des problèmes lors de la compilation. Il ne connait pas les variables que mes sous fichier font appel.
Par exemple cette routine que j'ai placé dans un fichier. Je fais appele régulièrement à ces sous programmes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public wait,wait1,wait2,wait3 STRING_ROUTINES SEGMENT CODE ;Zone memoire des waits DSEG AT 48h ;definit le debut du zone de ram ds 03 ;reserve 03 octets pour les 3 octets utilisés par les instructions wait RSEG STRING_ROUTINES ;************ WAIT: ;************ Temporisation pour l'affichage. mov 50h,#0FFh next1: djnz 50h,next1 ret ;************ WAIT1: ;************ Temporisation pour l'emission de carracteres. mov 49h,#0FFh next2: mov 50h,#0FFh next3: djnz 50h,next3 djnz 49h,next2 ret ;************ WAIT2: ;************ Temporisation pour le message de bienvenue. mov 48h,#020h next4: mov 49h,#0FFh next5: mov 50h,#0FFh next6: djnz 50h,next6 djnz 49h,next5 djnz 48h,next4 ret ;************ WAIT3: ;************ Temporisation de repetition de frappe. mov 48h,#004h next7: mov 49h,#0AAh next8: mov 50h,#0FFh next9: djnz 50h,next9 djnz 49h,next8 djnz 48h,next7 ret END
Voici l'exemple du code qui ferai appele à ces sous programmes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 EXTRN CODE (WAIT,WAIT1,WAIT2,WAIT3) ;PUBLIC D_ENV, EM, MES, ADRESSE, FAN_FIN ;************************************************************************ ; Constantes ;************************************************************************ CTR_AFF Equ 7000h ; Registre de controle de l'afficheur. STAT_AFF Equ 7002h ; Registre de status de l'afficheur. DATA_AFF Equ 7001h ; Registre de donnee de l'afficheur (en ecriture). RD_DATA Equ 7003h ; Registre de donnee de l'afficheur (en lecture). ;**************************************************************************** ; Declaration des variables ;**************************************************************************** ;Zonne mémoire pour faire le decompte du temps de non utilisation du clavier DSEG AT 77h TEMP: ds 01 TEMP2: ds 01 ETAT_PROG: ds 01 ; ;Zone memoire des waits DSEG AT 48h ;definit le debut du zone de ram ds 03 ;reserve 03 octets pour les 3 octets utilisés par les instructions wait ; Zone memoire de l'afficheurs DSEG AT 51h ;definit le debut du zone de ram ds 02 ;reserve 02 octets pour pour les données de controle et les données d'affichage ; Zone memoire pour l'envoie des données sur le port RS232 BSEG AT 20h EM bit 01 ;réserve un bit qui sert au drapeau pour l'envoie d'un fichier MES bit 01 ;réserve un bit pour le drapeau de présence de reception d'un message SEL bit 01 VAL bit 01 TOUCHE bit 01 ; Zone memoire pour la reception des données sur le port RS232 DSEG AT 53h ;definit le debut du zone de ram ds 12 ;réserve 09 octets pour la receptioin des données provenant du port RS232 ; Zone memoire pour l'adresse de sauvegarde du message recue par le port RS DSEG AT 45h ;definit le debut du zone de ram ADRESSE: ds 01 ; ; Zone memoire pour l'emmision des données sur le port RS232 DSEG AT 30h ;definit le debut du zone de ram ds 12 ;réserve 09 octets pour la receptioin des données provenant du port RS232 ; Zone memoire pour l'adresse de sauvegarde du message envoyé par le port RS DSEG AT 43h ;definit le debut du zone de ram TAILLE_BUF: ds 01 ;taille du buffer à envoyé de 0à 0C octet INDICE_EM: ds 01 ;Nb d'élément envoyé de 0à 0C octet ;************************************************************************ ; Programme principal ;************************************************************************ ; CSEG AT 0000h ; Programme commence à l'adresse 2000 ; ORG 0000h ; ljmp 2000h CSEG AT 2000h ; Programme commence à l'adresse 2000 ORG 2000h ; on commence à ecrire le programme à l'adresse 2000 ljmp DEPART CSEG AT 2003h ; définit le début de la zone programme pour l'interuption du port serie ORG 2003h ; Définit le début du programme pour le port serie ljmp CLAV ; part au programme de port serie CSEG AT 2023h ; définit le début de la zone programme pour l'interuption du port serie ORG 2023h ; Définit le début du programme pour le port serie ljmp EM_REC ; part au programme de port serie CSEG AT 2100h ; route l'ecriture du programme principal à 2100 ORG 2100h DEPART: acall INIT ; Initialisation : position par defaut. PROG: acall SERIE acall WAIT2 acall TEST_TEMP nop acall WAIT nop jmp PROG ; Fait tourner le programme en boucle.
Je travail sous l'environement KEIL µvision2
Les 2 fichiers je les importes bien dans le projet
merci de votre aide
Partager