/********************************************************** Projet : tp5s_esclave.prj Fichier(s) : TP_5s_esclave.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_T2(void)interrupt 5 using 1; void it_uart(void) interrupt 4 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; at 0x8000 xdata unsigned char low_BG; at 0x9000 xdata unsigned char high_BG; // Variables Globales : unsigned int tab_aff[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x08,0x04}; bit etat,ok_trans; char num_aff; unsigned int val,i; // ================ 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(" TP_5S ESCLAVE \n"); printf("\n\n---> ARRET <---"); //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 //Parametre de l'UART SM0=0; //Mode 1,8 bits de données,bdrate variable SM1=1; SM2=1; BD=1; //Generateur de bdrate interne PCON=PCON|0x80; //Reglage SMOD : vitesse 9600 bauds (fq=12Mhz) REN=1; //Autorisation IRQ en reception RI=0; //Reset flag reception TI=0; //Reset flag emission ES=1; //Autorisation IRQ individuelle UART ok_trans=1; //UART prete a emettre //Def des priorites IP0=0; IP1=0; EAL=1; //Autorisation globale etat=0; num_aff=0; low_BG=0; high_BG=0; while(1); } // end main /******************************************************** Nom : it_uart Objet : gestion de l'interruption de l'uart Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_uart(void) interrupt 4 using 1 { //ET2=0; char mesure; if(RI==1) { RI=0; mesure=SBUF; if('0'<=mesure && mesure<='9') { val=mesure-0x30; } } else { TI=0; ok_trans=1; } //ET2=1; } /******************************************************** Nom : it_T2 Objet : Affichage multiplexé Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_T2(void)interrupt 5 using 3 { TF2=0; num_aff=num_aff+1; //ecrit sur afficheur suivant // val=val*100; printf("\n\nchoix: %d ",val); 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 i=val/100; //isole chiffre centaines P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[i]|0x80; //mets centaine sur afficheur out_aff2=1; //active afficheur 2 break; case 3: //gestion des dizaines i=(val-(val/100*100))/10; //isole chiffre dizaines P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[i]; //mets dizaine sur afficheur out_aff3=1; //active afficheur 3 break; case 4: //gestion des unites i=(val-(val/10*10)); //isole chiffre unites P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[i]; //mets unite sur afficheur out_aff4=1; //active afficheur 4 if(etat==1) //test si etat marche DAPR=0x00; //relance conversion break; } if(num_aff>4) //test si tout les afficheurs ont ete allumes num_aff=0; //revient premier afficheur } // End it_T2