Académique Documents
Professionnel Documents
Culture Documents
I. Introduction
▪ 1972 : naissance du C dans les laboratoires BELL par Dennis Ritchie et développement du
système d'exploitation UNIX.
▪ 1978 : vulgarisation du langage et sortie du livre de B. Kernighan et D. Ritchie "The C
programming language".
▪ 1983 : normalisation A.N.S.I du langage C. Ce travail commence en 83 et dure 5 ans.
▪ 1988 : existence d'une norme : " C-ANSI ". La 2ème édition du livre de Kernighan et Ritchie
devient la référence.
Le langage C est un langage:
▪ PORTABLE : Les modifications d'un programme pour passer d’un système à un autre sont
minimes.
▪ COMPLET : Un texte C peut contenir des séquences de bas niveau (proches du matériel) en
assembleur.
▪ SOUPLE : Tout est possible en C mais une grande rigueur s’impose.
▪ EFFICACE : On réfléchit (devant une feuille de papier) et on écrit (peu).
II. Etapes de développement d’un programme
Le processus de construction d’un programme C (builder) comporte plusieurs étapes et utilise
différents «outils» tels que: un prétraitement, un compilateur, un assembleur et un éditeur de liens. À la
fin, il devrait y avoir un seul fichier exécutable. Ci-dessous les étapes qui se déroulent dans l'ordre quel
que soit le système d'exploitation ou le compilateur.
➢ L’édition du fichier source programme.C avec un éditeur de texte (simple sans mise en forme
du texte).
➢ Le prétraitement est la première étape. Il traite les fichiers d'inclusion, les instructions de
compilation conditionnelle et les macros.
➢ La compilation est la deuxième passe. Il prend la sortie du prétraitement et le code source et
génère le code source de l'assembleur.
➢ L'assemblage est la troisième étape. Il prend le code source de l'assembleur produit par le
compilateur et produit une liste d'assembleur avec offsets. La sortie de l'assembleur est stockée
dans un fichier objet.
➢ L’édition de liens permet d’intégrer des fonctions prédéfinies. Le programme auxiliaire
Éditeur de liens (linker ou binder) génère à partir du fichier *.ASM un fichier exécutable
*.HEX compatible avec le PIC
Le programme doit également contenir la définition des différentes fonctions créées par le
programmeur. Le langage C comporte des bibliothèques de fonctions prédéfinies sous forme de fichiers
comportant l’extension *.h. Ces fonctions seront ajoutées au programme exécutable lors de l’édition de
liens. Pour incorporer dans un programme un fichier *.h, on utilise la commande #include <fichier.h>
placée habituellement en début de fichier.
V. Les opérateurs
1- Opérateurs de base
Opérateur Fonction
+ Addition
- Soustraction
* Multiplication
/ Division entière
% Reste de la division entière
2- Opérateurs d’affectation
Opérateur Fonction
&& ET logique
|| OU logique
! NON logique
4- Opérateurs logique sur les Bits
Opérateur Fonction Exemples
& ET x=a&b
| OU x=a|b
^ OU exclusif x=a^b
~ NON x=~a
>> Décalage à droite des bits x=a>>3
<< Décalage à gauche des bits x=a<< 2
5- Opérateurs de comparaison
Remarque : En C, FAUX est la valeur 0, VRAI est tout ce qui est ≠ 0.
Opérateur Fonction Exemple
== Egale à x = a==3 ; x sera VRAI si a est égal à 3, FAUX sinon
!= Différent de x = a!=3 ; x sera VRAI si a est différent de 3, FAUX sinon
> Supérieur à x = a>3 ; x sera VRAI si a est supérieur à 3, FAUX sinon
< Inférieur à x = a<3 ; x sera VRAI si a est inférieur à 3, FAUX sinon
>= Supérieur ou égal à x = a>=3 ; x sera VRAI si a est supérieur ou égal à 3,.
FAUX sinon
<= Inférieur ou égal x = a<=3 ; x sera VRAI si a est inférieur ou égal à 3, FAUX
sinon
if (condition) if (condition) {
Action1; Action1;
[else Actions;
Action;] ...
}
[else {
Action
Action2; ...
}]
...
}
4- Boucles: faire... Tant que .....
do {
action;
}
while (condition)
Exemple
do {
x-=y;
Portb=x;
}
while (x!=0);
5- Boucles: pour .....
for ([expression_1] ; [expression_2] ; [expression_3])
action ;
Exemple
for(x=20 ; x> 0 ; x--)
portb=x;
Indice 0 1 2 3 4 5
valeurs 12 34 -16 77 103 -87
Par exemple :
short table[4] ={ -1,77 ,10,44};
➢ Si le nombre de données dans la liste d’initialisation est inférieur à la dimension du tableau, seuls
les premiers éléments seront initialisés. Les autres éléments seront mis à zéro.
➢ Lors d’une initialisation, il est également possible de ne pas spécifier le nombre d’éléments du
tableau. Par défaut, il correspondra au nombre de constantes de la liste d’initialisation.
Tableau multi-dimensions
type nom-du-tableau[dim1][dim2]
Exemple float m[50][20]; /* tableau à 2 dimensions 50x20 */
void interrupt() {
counter++;
TMR0 = 96;
INTCON = 0x20; //baisser le flag
}
Exemple
Dans cet exemple, la fonction principale fait clignoter les bits du port D 4 par 4 et la fonction de
l’interruption fait clignoter les bits du port C 4 par 4. La durée d’allumage et d’extinction est 500ms.
void interrupt()
{
//faire clignoter les leds du portc 5 fois
int i;
for(i=0; i<5; i++) {
portc=0x0F;
delay_ms(500);
portc=0xF0;
delay_ms(500);
}
INTCON.intf = 0; //baisser le flag
}
//_______________________________________________
void main() {
trisc=0x00;
trisd=0x00;
intcon.gie=1; //bit de valdation de toutes les interruptions
intcon.inte= 1; //bit de valdation de l'interruption INT
while(1){
portd=0xF0;
delay_ms(500);
portd=0x0F;
delay_ms(500);
}
}
Le programme correspondant
trisc=0xFF;
trisd=0xFF;
while(1){
a=portc;
b=portd;
x=a+b;
portb= bcdTo7seg(x);
RB7_bit=0;
}
}
Schéma
Le programme
void main() {
short unsigned c,a,b;
trisb=0x00;
trisd=0xFF;
while(1){
c=portd;
a=c&0x0F; //extraire les 4 bist de la droite
b=c>>4; //extraire les 4 bist de la gauche
portb=a+b;
}
}
4. Afficher7segment à 4 digits
Schéma
Programme :
.................................
.................................
.................................
.................................
delay_ms(50);
.................................
.................................
.................................
.................................
delay_ms(50);
.................................
.................................
.................................
.................................
delay_ms(50);
.................................
.................................
.................................
.................................
delay_ms(50);
} }
________________________________________________________
sbit LCD_RS at RB6_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_RS_Direction at TRISB6_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
void main() {
short unsigned a,b;
unsigned int x ;
char ta[4],tb[4];
char tx[6];
char *tt;
trisc=0x00;
trisd=0xFF;
Lcd_Init(); //initilisation du LCD
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
while(1){
a=portd&0x0F;
b=portd>>4;
x=a*b;
bytetostr(a,ta); // transformer le contenu de a en chaine de caractères
bytetostr(b,tb); // transformer le contenu de b en chaine de caractères
wordtostr(x,tx); // transformer le contenu de c en chaine de caractères
tt=Ltrim(ta);
Lcd_Out(1,6,"Calcul"); // à la ligne 1 conne 6 , on affiche "calcul"
Lcd_Out(2,1,Ltrim(ta));
Lcd_Out_Cp("x");
Lcd_Out_Cp(Ltrim(tb));
Lcd_Out_Cp("=");
Lcd_Out_Cp(Ltrim(tx));
}
}
Programme réception
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
void main() {
char a;
char ta[4];
UART1_Init(4800);
Lcd_Init(); //initilisation du LCD
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
Lcd_Out(1,2,"Donnee recue");
while(1){
UART1_Write(ta);
if (UART1_Data_Ready() == 1) {
a = UART1_Read();
bytetostr(a,ta);
Lcd_Out(2,5,ta);
}
} }
programme d’émission
sbit LCD_RS at RB6_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;
void main() {
char a;
char ta[4];
trisd=0xFF;
UART1_Init(4800);
Lcd_Init(); //initilisation du LCD
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
Delay_ms(500);
Lcd_Out(1,2,"Donnee emise");
while(1){
a=portd;
bytetostr(a,ta); // transformer le contenu de a en chaine de caractères
UART1_Write(a);
Lcd_Out(2,5,ta);
}
}