This program is for a pic16F84, it's for decoding the bits from mt8870.The program is suppose to count like 30 seconds RB7 comes to a high level for off-hooking the line.
#include <pic1684.h>
void interrupt raccroche (void);
void main (void) {
unsigned char lecture=0x00;
unsigned int delai=0;
TRISA=0xFF; // PORTA en entree, RA0 a RA3 sont utilises pour le DTMF
// RA4 est utilise‚ comme bit qui provient de la broche STD
// du decodeur DTMF. Ceci va permettre de decoder seulement
// lorsque le decodeur DTMF aura decoder des tones
TRISB=0x10; // PORTB: entierement en sortie, sauf RB5
// RB0 a RB3 utilisees pour les commandes DTMF
// RB4 est lentree de lindicateur de decrochage
// RB5 est un indicateur de decrochage
// RB6 indicateur de tones decode
// RB7 est un bit qui est envoyer au compteur 74lS393
// afin de faire raccrocher la ligne.
T0CS=0; //Timer0 avec clock interne
PS0=1; //Prescaler ajuste a 256
PS1=1;
PS2=1;
PSA=0; //Prescaler assigne au module Timer0
T0SE=1;
T0IE=1; //flag dinterruption en marche
RB7=0; // compteur de sonneries a zero
RB6=0; // indicateur de decrochage a zero
do
{
if (RB4==1) //le decrochage est effectue
{
TMR0=0;
GIE=1;
RB5=1; //on allume la led dincation de decrochage
}
else
RB5=0;
GIE=0;
if (RA4==1) //decodage de tones DTMF valide
{
RB6=1; //la led dindication de decodage de bits valide
//est allumee
lecture=(PORTA&0x0F); //masque de lecture du PORTA
switch (lecture) //Fonction de demultiplexage de la lecture
{
case 0b0001:
RB0=1; //mise en marche des dispositifs 1 a 4 avec touches
break; //1 a 4
case 0b0010:
RB1=1;
break;
case 0b0011:
RB2=1;
break;
case 0b0100:
RB3=1;
break;
case 0b0101:
RB0=0; //arret des dispositifs 1 a 4 avec touches 5 a 8
break;
case 0b0110:
RB1=0;
break;
case 0b0111:
RB2=0;
break;
case 0b1000:
RB3=0;
break;
case 0b1010:
RB7=1; //la ligne se raccroche
for (delai=0; delai<1000; delai++) //delai pour laisser du temps pour
{ //faire clipper le relais
} //fin de la boucle de compte
RB7=0; //le compteur se remet a 0
break;
} //Fin du switch
} //Fin du IF
} while (1); //Boucle de repetition du programme
} //Fin du programme
/********************routine dinterruption*********************/
void interrupt raccroche (void) {
unsigned int deborde=0;
unsigned int compte=0;
deborde=deborde+1;
if(deborde>=1000) /****the counter***
{
RB7=1;
for(compte=0; compte<4000; compte++)
{
}
RB7=0;
deborde=0;
}
#include <pic1684.h>
void interrupt raccroche (void);
void main (void) {
unsigned char lecture=0x00;
unsigned int delai=0;
TRISA=0xFF; // PORTA en entree, RA0 a RA3 sont utilises pour le DTMF
// RA4 est utilise‚ comme bit qui provient de la broche STD
// du decodeur DTMF. Ceci va permettre de decoder seulement
// lorsque le decodeur DTMF aura decoder des tones
TRISB=0x10; // PORTB: entierement en sortie, sauf RB5
// RB0 a RB3 utilisees pour les commandes DTMF
// RB4 est lentree de lindicateur de decrochage
// RB5 est un indicateur de decrochage
// RB6 indicateur de tones decode
// RB7 est un bit qui est envoyer au compteur 74lS393
// afin de faire raccrocher la ligne.
T0CS=0; //Timer0 avec clock interne
PS0=1; //Prescaler ajuste a 256
PS1=1;
PS2=1;
PSA=0; //Prescaler assigne au module Timer0
T0SE=1;
T0IE=1; //flag dinterruption en marche
RB7=0; // compteur de sonneries a zero
RB6=0; // indicateur de decrochage a zero
do
{
if (RB4==1) //le decrochage est effectue
{
TMR0=0;
GIE=1;
RB5=1; //on allume la led dincation de decrochage
}
else
RB5=0;
GIE=0;
if (RA4==1) //decodage de tones DTMF valide
{
RB6=1; //la led dindication de decodage de bits valide
//est allumee
lecture=(PORTA&0x0F); //masque de lecture du PORTA
switch (lecture) //Fonction de demultiplexage de la lecture
{
case 0b0001:
RB0=1; //mise en marche des dispositifs 1 a 4 avec touches
break; //1 a 4
case 0b0010:
RB1=1;
break;
case 0b0011:
RB2=1;
break;
case 0b0100:
RB3=1;
break;
case 0b0101:
RB0=0; //arret des dispositifs 1 a 4 avec touches 5 a 8
break;
case 0b0110:
RB1=0;
break;
case 0b0111:
RB2=0;
break;
case 0b1000:
RB3=0;
break;
case 0b1010:
RB7=1; //la ligne se raccroche
for (delai=0; delai<1000; delai++) //delai pour laisser du temps pour
{ //faire clipper le relais
} //fin de la boucle de compte
RB7=0; //le compteur se remet a 0
break;
} //Fin du switch
} //Fin du IF
} while (1); //Boucle de repetition du programme
} //Fin du programme
/********************routine dinterruption*********************/
void interrupt raccroche (void) {
unsigned int deborde=0;
unsigned int compte=0;
deborde=deborde+1;
if(deborde>=1000) /****the counter***
{
RB7=1;
for(compte=0; compte<4000; compte++)
{
}
RB7=0;
deborde=0;
}