Télécommande seize touche 8 canaux TOUT EN C pour 80C51 #include //include //déclaration des variables at 0x90 sbit P1_0; at 0x91 sbit P1_1; at 0x92 sbit P1_2; at 0x93 sbit P1_3; at 0x94 sbit P1_4; at 0x95 sbit P1_5; at 0x96 sbit P1_6; at 0x97 sbit P1_7; at 0xB5 sbit P3_5; // commande de l'emetteur 224 MHz de la carte TTU Eval. data char tableau[8]; char num_colonne; char num_auto; char automat; char cde; char appui; char i; //déclaration des sous programmes void test_touches (void); void detect_touche (void); void cde_auto (void); void trame_pile (void); void checksum(void); void tempo_courte (int); void message (void); //***************************************************************************************** // DEBUT DU PROGRAMME PRINCIPAL //***************************************************************************************** void main (void) { // monitorinit(); //**********************INITIALISATION**************************************************** tableau[0]=0; //initialisation de l'entete et du bit vol tableau[1]=4; //initialisation des unites du groupe tableau[2]=5; //initialisation des dizaines du groupe tableau[3]=6; //initialisation des centaines du groupe tableau[4]=1; //initialisation des unites du canal tableau[5]=4; //initialisation des dizaines du canal et du bit alarmes tableau[6]=0; //initialisation des capteurs while(1) { tes_touches(); detec_touches(); cde_auto(); trame_pile(); } } //****************************************************************************************** // SOUS PROGRAMME D'ATTENTE D'APPUI SUR UNE TOUCHE // On sort du sous programme lors d'un appui sur l'une des 16 touches //****************************************************************************************** void test_touches (void) { P1_0=0; P1_1=0; P1_2=0; P1_3=0; appui=0xf0; // patte en l'air -> 1 ; appui -> 0 while(appui==0xf0) // attente tant qu'aucune touche est appuyée { appui=P1&0xf0 } } //****************************************************************************************** // SOUS PROGRAMME D'IDENTIFICATION DE LA TOUCHE APPUYEE // On affecte le numéro d'automatisme ainsi que la commande correcpondante (cde M ou A) // // P1.0 // ! P1.1 // ! ! P1.2 // ! ! ! P1.3 // // ! ! ! ! // 1M 3M 5M 7M --> P1.4 // 1A 3A 5A 7A --> P1.5 // 2M 4M 6M 8M --> P1.6 // 2A 4A 6A 8A --> P1.7 // //******************************************************************************************* void detec-touches (void) { num_auto=1; for(num_colonne=1;num_colonne<=4;num_colonne++) { // test sur les 4 colonne l'une après l'autre P1_0=1; // on positionne à 1 la colonne testée P1_1=1; P1_2=1; P1_3=1; if(num_colonne==1) { P1_0=0; } if(num_colonne==2) { P1_1=0; } if(num_colonne==3) { P1_2=0; } if(num_colonne==4) { P1_3=0; } appui=P1&0wf0; if(apui!=0xf0) // si c'est sur cette colonne { // test sur premier automatisme de la colonne if (appui==0xe0) // 1110 { cde='M'; automat=num_auto; } if (appui==0xed) // 1101 { cde='A'; automat=num_auto; } num_auto=num_auto+1; // test sur second automatisme de la colonne if (appui==0xb0) // 1011 { cde='M'; automat=num_auto; } if (appui==0x70) // 0111 { cde='A'; automat=num_auto; } } else { num_auto=num_auto+2; } } } //****************************************************************************************** // SOUS PROGRAMME DE MISE A JOUR DU TABLEAU // on place le numéro de l'automatisme et l'ordre à envoyer //****************************************************************************************** void cde_auto (void) { tableau[4]=automat; //numéro d'automatisme dans unités if (cde=='A') { //mise a 1 de D24 et 0 de D25 tableau[6]=(tableau[6] & 0xfd) | 0x01; } if (cde=='M') { //mise a 1 de D25 et 0 de D24 tableau[6]=(tableau[6] & 0xfe) | 0x02; } tableau[5]=tableau[5] | 0x08; //mise a 1 du bit alarme } //****************************************************************************************** // SOUS PROGRAMME D'ENVOI DU MESSAGE ET DE GESTION DE L'ETAT DE LA PILE // Utilise le sous programme d'envoi du message à la centrale //****************************************************************************************** void trame_pile (void) //test de la pile et envoie de la trame { checksum(); message(); } //****************************************************************************************** // SOUS PROGRAMME FAISANT LE CHEKSUM POUR LE DERNIER QUARTET //****************************************************************************************** void chesksum (void) { tableau[7]=0; for (i=0;i<=6;i++) { tableau[7]=tableau[7]=tableau[i]; } tableau[7]=tableau[7] & 0x0f; } //****************************************************************************************** // SOUS PROGRAMME DE TEMPORISATION PARAMETRABLE PAR UN ENTIER // Pour le 80C51 avec un quartz a 12MHz (ou 80552 de WR kit) // 11 => 220 us // 20 => 360 us // 29 => 500 us // 50 => 840 us // 6098 => 80 ms //****************************************************************************************** void tempo_courte (int valeur) { int i; for (i=0;i>1; } // fin du for (num_bit=0 ...) } // fin du for (num_quartet=0 ...) /* bit de stop en fin de trame */ P3_5 = 1; tempo_courte (50; P3_5 = 0; /* tempo inter-trames de 80 ms*/ tempo_courte (6098); trames--; } // fin du while (trames) } // fin de l'envoi du message