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