Chronometre en C sur Microcontroleur PIC

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 171 fois - Téléchargée 14 fois

Contenu du snippet

#define    Start     PORTA.F0
#define    Arret     PORTA.F1
#define    Reset     PORTA.F2
#define    Write     PORTA.F3
#define    Read      PORTA.F6

sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_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 TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_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;

char Message1[] = "Chronometre";
char Message2[] = ":";
char Message3[] = ".";
char  *Heure   = "00";
char  *Minute  = "00";
char  *Seconde = "00";
char  *Cent    = "00";
char  Buffer[10];
char H = 0;
char M = 0;
char S = 0;
int Centi = 0;
char counter0 = 0;
char flag0 = 0;
unsigned int counter = 0;
char flag1 = 0;
char N_Centi;
char N_Seconde;
char N_Minute;
char N_Heure;


void InitTimer1();
void Init_PIC();
void Affiche_Txt_LCD();
void Chronometre();
void Calcul_Chrono();
void Affichage_Chrono();
void Write_EEPROM();
void Read_EEPROM();


void main()
{

    Init_PIC();
    Affiche_Txt_LCD();
    InitTimer1();
    N_Centi = EEPROM_Read(0x00);
    N_Seconde = EEPROM_Read(0x01);
    N_Minute = EEPROM_Read(0x02);
    N_Heure = EEPROM_Read(0x03);

    while(1)
    {
        Chronometre();
        Write_EEPROM();
        Read_EEPROM();
    }
}



void Init_PIC()
{

    TRISA = 0xFF;
    TRISB = 0x00;

    PORTA = 0x00;
    PORTB = 0x00;

    Lcd_Init();
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_CURSOR_OFF);

}


void InitTimer1()
{
    T1CON         = 0x01;
    TMR1IF_bit         = 0;
    TMR1H         = 0xD8;
    TMR1L         = 0xF0;
    TMR1IE_bit         = 1;
    INTCON         = 0xC0;
}


void Affiche_Txt_LCD()
{

    Lcd_Out(1,3,Message1);
    Lcd_Out(2,4,heure);
    Lcd_Out(2,6,Message2);
    Lcd_Out(2,7,Minute);
    Lcd_Out(2,9,Message2);
    Lcd_Out(2,10,Seconde);
    Lcd_Out(2,12,Message3);
    Lcd_Out(2,13,Cent);

}


void Interrupt()
{

    if (TMR1IF_bit)
    {

        TMR1IF_bit = 0;
        TMR1H         = 0xD8;
        TMR1L         = 0xF0;
        counter0++;
        counter++;

        if (counter0 == 1)
        {
            flag0 = 1;
            counter0 = 0;
        }

        if ( counter == 100)
        {
            flag1 = 1;
            counter = 0;
        }
    }
}



void Chronometre()
{

    // Start
    if (Start)
    {
    delay_ms(300);
        do
        {

            if (flag0 == 1)
            {

                centi++;
                Cent[0] = (Centi / 10 )% 10 + 48 ;
                Cent[1] = Centi % 10 + 48 ;
                Lcd_out(2, 13, Cent);
                if (centi >= 99) centi = 0;
                flag0 = 0;

            }

            if (flag1 == 1)
            {
                S++;
                Seconde[0] = (S / 10 )% 10 + 48 ;
                Seconde[1] = S % 10 + 48 ;
                Lcd_out(2, 10, Seconde);

                if (S > 59)
                {
                    S = 0;
                    M++;
                    Minute[0] = (M / 10 )% 10 + 48 ;
                    Minute[1] = M % 10 + 48 ;
                    Lcd_out(2, 7, Minute);

                    if (M > 59 )
                    {
                        M = 0;
                        H++;
                        Heure[0] = (H / 10 )% 10 + 48 ;
                        Heure[1] = H % 10 + 48 ;
                        Lcd_out(2, 4, Heure);
                    }
                }
                flag1 = 0;
            }
        }
        while(!Reset && !Arret);


        if (Arret)
        {

            Calcul_Chrono();
            Affichage_Chrono();

        }



        // Reset
        if (Reset)
        {

            S = 0;
            M = 0;
            H = 0;
            Centi = 0;
            Calcul_Chrono();
            Affichage_Chrono();

        }

    }

}


void Calcul_Chrono()
{

    Cent[0] = (Centi / 10 )% 10 + 48 ;
    Cent[1] = Centi % 10 + 48 ;
    Seconde[0] = (S / 10 )% 10 + 48 ;
    Seconde[1] = S % 10 + 48 ;
    Minute[0] = (M / 10 )% 10 + 48 ;
    Minute[1] = M % 10 + 48 ;
    Heure[0] = (H / 10 )% 10 + 48 ;
    Heure[1] = H % 10 + 48 ;

}


void Affichage_Chrono()
{

    Lcd_out(2, 13, Cent);
    Lcd_out(2, 10, Seconde);
    Lcd_out(2, 7, Minute);
    Lcd_out(2, 4, Heure);

}

void Write_EEPROM()
{

    if (!Start && !Arret && Write)
    {

        EEPROM_Write(0x00, Centi);
        delay_ms(10);
        EEPROM_Write(0x01, S);
        delay_ms(10);
        EEPROM_Write(0x02, M);
        delay_ms(10);
        EEPROM_Write(0x03, H);
        delay_ms(10);

    }

}


void Read_EEPROM(){

       
        if (!Start && !Arret && !Arret && Read){
       
        delay_ms(300);

        Lcd_Cmd(_LCD_CLEAR);
        Lcd_Cmd(_LCD_CURSOR_OFF);
        Lcd_out(1, 1, "Meilleur score");
        Lcd_Out(2,6,Message2);
        Lcd_Out(2,9,Message2);
        Lcd_Out(2,12,Message3);

        N_Centi = EEPROM_Read(0x00);
        N_Seconde = EEPROM_Read(0x01);
        N_Minute = EEPROM_Read(0x02);
        N_Heure = EEPROM_Read(0x03);

        Cent[0] = (N_Centi / 10 )% 10 + 48 ;
        Cent[1] = N_Centi % 10 + 48 ;

        Seconde[0] = (N_Seconde / 10 )% 10 + 48 ;
        Seconde[1] = N_Seconde % 10 + 48 ;

        Minute[0] = ( N_Minute / 10 )% 10 + 48 ;
        Minute[1] =  N_Minute % 10 + 48 ;

        Heure[0] = (N_Heure / 10 )% 10 + 48 ;
        Heure[1] = N_Heure % 10 + 48 ;

        Affichage_Chrono();

        delay_ms(3000);
        }

A voir également

Ajouter un commentaire

Commentaires

dragonfly56360
Messages postés
1
Date d'inscription
lundi 14 avril 2014
Statut
Membre
Dernière intervention
14 avril 2014
-
Salut, je n'arrive pas à compiler ton code. Pourtant j'utilise le compilateur CC5X dans MPLAB. Quel compilo utilisais tu?

Des que je compile, j'obtiens :

sbit LCD_RS at RB0_bit;
^------
Error[1] C:\Users\laurent\Desktop\16f628a\LCD.c 7 : Syntax error (or limitation)
(CC5X is unable to compile the expression due to syntax error or
limited C support. Code correction is required. Check also for
unbalanced block delimiters '{ .. }' in previous statements)


Si vous avez une solution, je suis preneur.

Désolé de deterrer ce post.
gekony
Messages postés
6
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
12 juillet 2014
> dragonfly56360
Messages postés
1
Date d'inscription
lundi 14 avril 2014
Statut
Membre
Dernière intervention
14 avril 2014
-
Salut,

Normal que ca ne fonctionne, le code a été écrit sous le compilateur Mikroc. Il faudrait penser à faire quelques changements au niveau de la syntaxe de votre compilo mais le mieux serait de le compiler directement sous Mikroc disponible gratuitement avec une limitation de la mémoire programme de 2 Ko ce qui laisse largement de la place
BunoCS
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
90 -
Hello,
Cela manque cruellement de commentaires...Genre sur les "magic numbers"...
Peux-tu y remédier s'il te plaît?
gekony
Messages postés
6
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
12 juillet 2014
> BunoCS
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
-
salut, j'essaierai de mettre des commentaires ce soir sur le code.
gekony
Messages postés
6
Date d'inscription
vendredi 15 novembre 2013
Statut
Membre
Dernière intervention
12 juillet 2014
-
Un petit chronometre très simple a réaliser codé en C sur un PIC16F628.

Possibilité d'arrêter la minuterie
Remettre à 0
Sauvegarder dans l'EEPROM
Lire

Précis à la microseconde telle un vrai chronomètre

Affichage sur afficheur LCD Alphanumérique 2*16.

Possibilité d'améliorer la précision (bien que très précise déja) par l'ajout de routine en assembleur

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.