//---------------------------------------------------------------------------------- // Titre : Récuparation par i2c de la température et affichage sur LCD //---------------------------------------------------------------------------------- // Fonction : Projet Radio réveil // Configuration : Aucune //---------------------------------------------------------------------------------- // Processeur : ATmega8/48/88/168 // Fréquence : 3.6864 MHz // Langage : C // Date : 27.10.2008 // Version : 1.0 // Auteur : Devtronic SARL //---------------------------------------------------------------------------------- #include // Registres AVR and définition des constantes #include // Librairie contenant les fonctions d'attente #include // Librairie contenant les fonctions d'interruptions #include "myavr_lcd.h" // Librairie LCD #include "myavr_i2c_master.h" // Librairie I2C #include "heure.h" // Header heure //---------------------------------------------------------------------------------- void initialisation(void); void gestion_changement_heure(void); int gestion_changement_reveil(heure *heure_alarme,int alarme_courante); void afficher_onoff(int etat); int status_buzzer; int status_deux_points; void initialisation(void) { heure heure_initiale; // Initialisation variables globales status_buzzer = 0; status_deux_points = 0; // Configuration des broches 4 et 5 du PORTD en entrées avec activation des pull-up DDRB = 0x00; PORTB = 0x30; // configuration de la broche 0 et 1 du port C en sortie et mise à 0 (LED & Buzzer) DDRC = 0x03; PORTC &= 0xFC; // Initialisation de l'écran LCD MYAVRLCD_initialisation(); // Initialisation de l'I2C (Fréquence = 100 kHz à 3,684 MHz) MYAVRI2CMASTER_initialisation(11,0); // Initalisation heure format 24 heures configuration_heure(0); // Lancement timer 1 pour clignotement deux points TCNT1 = 0; // Initialisation timer TIMSK |= 0x04; // Activation IT overflow timer 1 TCCR1B = 0x03; // Prescaler par 64 // Affichage valeurs sur l'écran LCD MYAVRLCD_ecrireChaine("Il est :",8); // Récupération puis affichage de l'heure heure_initiale = recuperation_heure(); afficher_heure_LCD(heure_initiale,CACHER,status_deux_points,2,1); // Activation interruption sei(); } void gestion_changement_heure(void) { heure heure_modifiee; //* Recuperation de l'heure actuelle et affichage heure_modifiee = recuperation_heure(); afficher_heure_LCD(heure_modifiee,CACHER,1,2,1); //* Affichage du curseur MYAVRLCD_confAffichage(1,1,1); MYAVRLCD_deplacerCurseur(2,2); //* Gestion du changement des heures tant que non appui bouton 1 while(PINB & 0x10) { //** Attente appui sur bouton 2 if (!(PINB & 0x20)) { // Anti-rebond logiciel _delay_ms(50); //** Attente relachement bouton 2 while(!(PINB & 0x20)) ; // Anti-rebond logiciel _delay_ms(50); //** Gestion incrémentation if (heure_modifiee.heures == 23) { heure_modifiee.heures = 0; } else { heure_modifiee.heures++; } afficher_heure_LCD(heure_modifiee,CACHER,1,2,1); //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,2); } } //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,5); // Anti rebond logiciel _delay_ms(50); //* Attente fin appui sur le bouton 1 while(!(PINB & 0x10)) ; // Anti rebond logiciel _delay_ms(50); //* Gestion du changement de minutes tant que non appui bouton 1 while(PINB & 0x10) { //** Attente appui sur bouton 2 if (!(PINB & 0x20)) { // Anti-rebond logiciel _delay_ms(50); //** Attente relachement bouton 2 while(!(PINB & 0x20)) ; // Anti-rebond logiciel _delay_ms(50); //** Gestion incrémentation if (heure_modifiee.minutes == 59) { heure_modifiee.minutes = 0; } else { heure_modifiee.minutes++; } afficher_heure_LCD(heure_modifiee,CACHER,1,2,1); //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,5); } } // Anti rebond logiciel _delay_ms(50); //* Attente fin appui sur le bouton 1 while(!(PINB & 0x10)) ; // Anti rebond logiciel _delay_ms(50); //* Application de la nouvelle heure changement_heure(heure_modifiee); //* Suppression du curseur MYAVRLCD_confAffichage(1,0,0); } int gestion_changement_reveil(heure *heure_alarme,int alarme_courante) { int status_alarme = alarme_courante; //* Affichage du curseur MYAVRLCD_confAffichage(1,1,1); MYAVRLCD_deplacerCurseur(2,2); //* Gestion du changement des heures tant que non appui bouton 1 while(PINB & 0x10) { //** Attente appui sur bouton 2 if (!(PINB & 0x20)) { // Anti rebond logiciel _delay_ms(50); //** Attente relachement bouton 2 while(!(PINB & 0x20)) ; // Anti-rebond logiciel _delay_ms(50); //** Gestion incrémentation if (((heure)*(heure_alarme)).heures == 23) { ((heure)*(heure_alarme)).heures = 0; } else { ((heure)*(heure_alarme)).heures++; } afficher_heure_LCD(((heure)*(heure_alarme)),CACHER,1,2,1); //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,2); } } //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,5); // Anti rebond logiciel _delay_ms(50); //* Attente fin appui sur le bouton 1 while(!(PINB & 0x10)) ; // Anti rebond logiciel _delay_ms(50); //* Gestion du changement de minutes tant que non appui bouton 1 while(PINB & 0x10) { //** Attente appui sur bouton 2 if (!(PINB & 0x20)) { // Anti rebond logiciel _delay_ms(50); //** Attente relachement bouton 2 while(!(PINB & 0x20)) ; // Anti-rebond logiciel _delay_ms(50); //** Gestion incrémentation if (((heure)*(heure_alarme)).minutes == 59) { ((heure)*(heure_alarme)).minutes = 0; } else { ((heure)*(heure_alarme)).minutes++; } afficher_heure_LCD(((heure)*(heure_alarme)),CACHER,1,2,1); //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,5); } } //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,7); // Anti rebond logiciel _delay_ms(50); //* Attente fin appui sur le bouton 1 while(!(PINB & 0x10)) ; // Anti rebond logiciel _delay_ms(50); //* Gestion du changement d'état on/off while(PINB & 0x10) { //** Attente appui sur bouton 2 if (!(PINB & 0x20)) { // Anti rebond logiciel _delay_ms(50); //** Attente relachement bouton 2 while(!(PINB & 0x20)) ; // Anti-rebond logiciel _delay_ms(50); //** Gestion incrémentation status_alarme = !status_alarme; afficher_onoff(status_alarme); //* Déplacement du curseur MYAVRLCD_deplacerCurseur(2,7); } } // Anti rebond logiciel _delay_ms(50); //* Attente fin appui sur le bouton 1 while(!(PINB & 0x10)) ; // Anti rebond logiciel _delay_ms(50); //* Suppression du curseur MYAVRLCD_confAffichage(1,0,0); // Effacement de l'écran MYAVRLCD_effacement(); return status_alarme; } void afficher_onoff(int etat) { MYAVRLCD_deplacerCurseur(2,7); // Affiche ON if (etat) { MYAVRLCD_ecrireChaine("ON ",3); } // Affiche OFF else { MYAVRLCD_ecrireChaine("OFF",3); } } int main(void) { heure heure_courante; int compteur_appui; heure heure_alarme = {0,0,0,0}; int alarme_active = 0; int reveil_declenche = 0; initialisation(); while(1) { // Récupération de l'heure heure_courante = recuperation_heure(); afficher_heure_LCD(heure_courante,CACHER,status_deux_points,2,1); // Vérification si l'heure du réveil est arrivée (si réveil non déjà déclenché) if (alarme_active && !reveil_declenche) { if (heure_courante.heures == heure_alarme.heures && heure_courante.minutes == heure_alarme.minutes) { reveil_declenche = 1; status_buzzer = 1; // Lancement timer 2 TCNT2 = 0x00; // Mise à 0 timer TIMSK |= 0x40; // Activation IT overflow timer 2 TCCR2 = 0x04; // Prescaler par 8 // Affichage du message : Debout feignant MYAVRLCD_deplacerCurseur(1,1); MYAVRLCD_ecrireChaine("Debout feignant!",15); } } // Reveil déclenché ? if (reveil_declenche) { // Si appui sur bouton 1 => Fin réveil if (!(PINB & 0x10)) { // Anti rebond logiciel _delay_ms(50); // Attente relachement bouton while(!(PINB & 0x10)) ; // Extinction du reveil et de l'alarme reveil_declenche = 0; alarme_active = 0; status_buzzer = 0; // Désactivation timer 2 TCCR2 = 0x00; // Ecriture du message d'indication de l'heure MYAVRLCD_effacement(); MYAVRLCD_deplacerCurseur(1,1); MYAVRLCD_ecrireChaine("Il est :",8); } else { // Affichage du message : Debout feignant MYAVRLCD_deplacerCurseur(1,1); if (status_deux_points) { MYAVRLCD_ecrireChaine("Debout feignant!",16); } else { MYAVRLCD_ecrireChaine("Debout feignant ",16); } } } else { // Si appui sur le bouton 1 => Lancement de la fonction de changement heure if (!(PINB & 0x10)) { // Anti rebond logiciel _delay_ms(50); // Remise à 0 du compteur d'appui compteur_appui = 0; // Incrémentation du compteur d'appui toutes les 100 ms while(!(PINB & 0x10)) { compteur_appui++; _delay_ms(100); if (compteur_appui > 20) { // Ecriture du message de changement d'heure MYAVRLCD_deplacerCurseur(1,1); MYAVRLCD_ecrireChaine("Alarme ?",8); afficher_heure_LCD(heure_alarme,CACHER,1,2,1); afficher_onoff(alarme_active); } } // Bouton relaché, si temps supérieur à 2s -> Changement réveil if (compteur_appui > 20) { alarme_active = gestion_changement_reveil(&heure_alarme,alarme_active); } else { // Ecriture du message de changement d'heure MYAVRLCD_deplacerCurseur(1,1); MYAVRLCD_ecrireChaine("Heure ? ",8); gestion_changement_heure(); } // Ecriture du message d'indication de l'heure MYAVRLCD_deplacerCurseur(1,1); MYAVRLCD_ecrireChaine("Il est :",8); } } // Allumage de la LED si alarme active PORTC = alarme_active; // Affection de l'etat du buzzer if (status_buzzer) { PORTC |= 0x02; } else { PORTC &= 0xFD; } } return 0; } // Interruption timer 2 overflow ISR(TIMER2_OVF_vect) { // Basculement état buzzer status_buzzer = !status_buzzer; } // Interruption timer 1 overflow ISR(TIMER1_OVF_vect) { // Basculement état clignotement deux-points status_deux_points = !status_deux_points; } //--------------------------------------------------------------------------