#include <16f877.
h>
#fuses HS,NOPROTECT,
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#org 0x1F00, 0x1FFF void loader16F877(void) {}
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#define Speaker PIN_B0
#define nDO 0 // DO
#define nRE 1 // RE
#define nMI 2 // MI
#define nFA 3 // FA
#define nSOL 4 // SOL
#define nLA 5 // LA
#define nSI 6 // SI
int16 FreqNota[8]={ // retardos entre estado alto
// y bajo para generar las notas
15289, // DO
13620, // RE
12134, // MI
11453, // FA
10204, // SOL
9090, // LA
8099 // SI
};
int grabacion[8]; //declaracion de variables
int i=0;
char var1;
void Reproducir();
void Play(int nota,int octava,int16 duracion);
void main(){
for(i=0;i<8;i++){ //guarda las notas tecleadas
grabacion[i]=-1; //
}
i=0;
while(1){
var1=getchar();
switch (var1){
case '1': //tecla de clasa nota musical
Play(nDO,6,500);
grabacion[i]=0;
i=i+1;
break;
case '2':
Play(nRE,6,500);
grabacion[i]=1;
i=i+1;
break;
case '3':
Play(nMI,6,500);
grabacion[i]=2;
i=i+1;
break;
case '4':
Play(nFA,6,500);
grabacion[i]=3;
i=i+1;
break;
case '5':
Play(nSOL,6,500);
grabacion[i]=4;
i=i+1;
break;
case '6':
Play(nLA,6,500);
grabacion[i]=5;
i=i+1;
break;
case '7':
Play(nSI,6,500);
grabacion[i]=6;
i=i+1;
break;
case '8':
Reproducir();
break;
default:
i=i;
break;
}
}
}
void Reproducir(){ //reproduce la melodia tecleada
for(i=0;i<8;i++){
if(grabacion[i]==-1){
}
else{
Play(grabacion[i],6,500);
delay_ms(50);
}
}
for(i=0;i<8;i++){
grabacion[i]=-1;
}
i=0;
}
void Play(int nota, int octava, int16 duracion){
int16 fn;
int16 mS_Transcurridos=0; // Contadores necesarios
// para controlar la duración
int16 CiclosL=0; // Contandor de uS
fn=FreqNota[nota]; // Define los retardos para generar
// la frecuencia de cada nota
fn>>=(octava); // Adapta la frecuencia a la octava actual
// haciendo una rotación
// a la derecha por octava
do{
output_high(Speaker); // Genera la frecuancia
delay_us(fn); // con los retardos mientras
CiclosL+=(fn); // aumenta el contador de
// ciclos transcurridos
output_low(Speaker); // en dos partes para repartir el
delay_us(fn); // trabajo entre estado alto y bajo.
CiclosL+=(fn); //
CiclosL+=25; // Compensador.
while(CiclosL>999){ // Se queda en el bucle mientras CiclosL
// sea menor a 1000 (1 mS)
CiclosL-=1000; // Le resta 1000 a CiclosL
mS_Transcurridos++; // y le suma 1 a mS_Transcurridos.
CiclosL+=25; // Compensador.
}
}
while (duracion>mS_Transcurridos); // Repite el bucle hasta que haya
// pasado el tiempo indicado.
}