/********************************************************** Projet : tpxx.prj Fichier(s) : TP_xx.c Objet : Introduction au C sur microcontroleur Gestion des entrees / sorties Auteurs : Hensinger Benoît / Cuenot Gaël Binome : 3 Groupe : RLI 1 Date création : **********************************************************/ // Fichiers à inclure : #include // Commandes du moniteur de mise au point #include // déclaration des registres interne au µC 80C535(SFR) #include // Commandes de l'afficheur LCD #include // Equivalences : #define OFF 0 #define ON 1 // Fonctions externes : // Fonctions locales (Prototypes) : void tempo(unsigned int); // Fonction temporisation (delai) void it_P10_MARCHE(void) interrupt 10 using 1; void it_P10_ARRET(void) interrupt 11 using 1; void it_T2(void)interrupt 5 using 1; // Definitions particulières (zone SFR ou RAM externe) : sfr16 at 0xCA CRCHL; // definition de [CRCH,CRCL] a l'adresse 0xCB comme un registre de 16 bits sfr16 at 0xCC THL2; at 0x94 sbit out_aff1; // out_aff1 est le nom donne a la ligne P1.4 (commande afficheur 1) at 0x95 sbit out_aff2; // out_aff2 est le nom donne a la ligne P1.5 (commande afficheur 2) at 0x96 sbit out_aff3; // out_aff3 est le nom donne a la ligne P1.6 (commande afficheur 3) at 0x97 sbit out_aff4; // Variables Globales //unsigned int tab_aff[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned int tab_aff[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x08,0x04}; bit etat; unsigned int val_ddp,val; char num_aff; // ================ ZONE PROGRAMME ============================== /******************************************************** Nom : main() Objet : gestion de la led on/off P5.4 par le bouton mode P1.0 Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void main() { clrscr(); printf("TP42 VOLTMETRE \n"); printf("\n\n---> ARRET <---"); ADM=0; //Can en mode monocoup IADC=0; //Reset flag CAN //Choix du canal P6.3 MX2=0; MX1=1; MX0=1; EADC=0; //Inhibition des Interruptions du CAN I3FR=0; //Front montant sur P1.0 (marche) IEX3=0; //Reset drapeau EX3=1; //Autorisation IRQ sur P1.0 IEX4=0; //Reset drapeau EX4=0; //Inhibition IRQ P1.1 //Parametre du timer: CRCHL=-2000; //periode T2=2ms T2PS=0; //Timer a FQ/12 THL2=CRCHL; //chargement T2R0=0; T2R1=1; //auto-reload T2I0=1; T2I1=0; //mode timer TF2=0; ET2=1; //reset flag autorisation IRQ //Def des priorites IP0=(IP0&0xD7)|0x18; //priorite maximum sur arret puis sur timer IP1=(IP1&0xD7)|0x10; EAL=1; //Autorisation globale val_ddp=0; etat=0; num_aff=0; while(1); } // end main /******************************************************** Nom : can Objet : analyse resultat conversion Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_CAN(void)interrupt 8 using 1 { IADC=0; //reset flag val_ddp=ADDAT; //recuperation valeur conversion CAN val_ddp=val_ddp*196/100+1; //Affichage en dizaine de mV } //Retour /******************************************************** Nom : ip_P10_MARCHE Objet : Mise en marche Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_P10_MARCHE(void) interrupt 10 using 1 { etat=1; //mise etat marche printf("\n\n MARCHE "); //affichage IADC=0; //reset flag CAN EADC=1; //autorise IRQ CAN DAPR=0x00; // demarrage conversion EX4=1; //Autorisation P1.1 pour arret } /******************************************************** Nom : ip_P10_ARRET Objet : Arret Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_P10_ARRET(void) interrupt 11 using 1 { etat=0; //mise etat marche printf(" ARRET \n\n"); //affichage IEX4=0; //reset du flag EADC=0; //autorise IRQ CAN } /******************************************************** Nom : it_T2 Objet : Affichage multiplexé Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_T2(void)interrupt 5 using 3 { TF2=0; //rest flag num_aff=num_aff+1; //ecrit sur afficheur suivant switch(num_aff) { case 1: //gestion du + P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[10]; //affiche + out_aff1=1; //active afficheur 1 break; case 2: //gestion des centaines val=val_ddp/100; //isole chiffre centaines P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[val]|0x80; //mets centaine sur afficheur out_aff2=1; //active afficheur 2 break; case 3: //gestion des dizaines val=(val_ddp-(val_ddp/100*100))/10; //isole chiffre dizaines P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[val]; //mets dizaine sur afficheur out_aff3=1; //active afficheur 3 break; case 4: //gestion des unites val=(val_ddp-(val_ddp/10*10)); //isole chiffre unites P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[val]; //mets unite sur afficheur out_aff4=1; //active afficheur 4 if(etat==1) //test si etat marche DAPR=0x00; //relance conversion break; }//end switch if(num_aff>4) //test si tout les afficheurs ont ete allumes num_aff=0; //revient premier afficheur } /******************************************************** Nom : tempo Objet : base de temps logicielle de 1 ms Paramètres : - d'appel : durée de la tempo en ms - de retour : aucun *********************************************************/ void tempo(unsigned int t) { int ttempo; while (t != 0) { for (ttempo = 1;ttempo < 493;ttempo++); t--; // décrémentation de la variable de contrôle } } // end tempo