///////////////////////////////////////////////////////////////////////
// //
// PICMusic v.1.00 //
// (c) 2010 Gerardo Ariel Ramírez. //
// //
///////////////////////////////////////////////////////////////////////
// //
// uControlador: PIC16F876A Lenguaje: CCS C //
// Xtal: 4MHz //
// //
///////////////////////////////////////////////////////////////////////
#include <16f876a.h>
#use delay(clock=4000000)
#use fast_io(all)
#fuses HS
#FUSES NOPUT
#FUSES NOBROWNOUT
#define Speaker PIN_B0
#define nDO 0 // DO
#define nDO_ 1 // DO#
#define nRE 2 // RE
#define nRE_ 3 // RE#
#define nMI 4 // MI
#define nFA 5 // FA
#define nFA_ 6 // FA#
#define nSOL 7 // SOL
#define nSOL_ 8 // SOL#
#define nLA 9 // LA
#define nLA_ 10 // LA#
#define nSI 11 // SI
int16 FreqNota[12]={ // retardos entre estado alto
// y bajo para generar las notas
15289, // DO
14430, // DO#
13620, // RE
12856, // RE#
12134, // MI
11453, // FA
10810, // FA#
10204, // SOL
9631, // SOL#
9090, // LA
8580, // LA#
8099 // SI
};
void Play(int nota,int octava,int16 duracion);
void PlayCancion(int cancion);
void main(){
set_tris_b(14); // B<3:1>: Pulsadores B0: Speaker
while (true){
if(input(PIN_B1))PlayCancion(1); //Si pulso switch 1 toca
// Pop Corn
if(input(PIN_B2))PlayCancion(2); //Si pulso switch 2 toca
// Ecuador
if(input(PIN_B3))PlayCancion(3); //Si pulso switch 3 toca
// The lion sleep tonight
}
}
void Play(int nota, int octava, int16 duracion){
int16 fn;
int16 mS_Transcurridos=0;
int16 CiclosL=0;
fn=FreqNota[nota]; // Define los retardos para generar
// la frecuencia de cada nota
fn>>=(octava); // Adapta la frecuencia
// a la octava actual
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.
}
void PlayCancion(int cancion){
switch (cancion){
case 1:
//POP CORN
play (nDO ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nSOL ,4,166);
play (nRE_ ,4,166);
play (nSOL ,4,166);
play (nDO ,4,166);
delay_ms (166);
play (nDO ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nSOL ,4,166);
play (nRE_ ,4,166);
play (nSOL ,4,166);
play (nDO ,4,166);
delay_ms (166);
play (nDO ,5,166);
play (nRE ,5,166);
play (nRE_ ,5,166);
play (nRE ,5,166);
play (nRE_ ,5,166);
play (nDO ,5,166);
play (nRE ,5,166);
play (nDO ,5,166);
play (nRE ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nLA_ ,4,166);
play (nDO ,5,166);
play (nSOL_ ,4,166);
play (nDO ,5,166);
break;
case 2:
//ECUADOR
play (nLA ,3,100);
delay_ms (200);
play (nMI ,3,100);
delay_ms (200);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nSOL ,3,100);
delay_ms (100);
play (nLA ,3,100);
delay_ms (200);
play (nMI ,3,100);
delay_ms (200);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nSOL ,3,100);
delay_ms (100);
play (nDO ,4,100);
delay_ms (200);
play (nSOL ,3,100);
delay_ms (200);
play (nMI ,4,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nMI ,4,100);
delay_ms (100);
play (nRE ,4,100);
delay_ms (100);
play (nSOL ,3,100);
delay_ms (100);
play (nDO ,4,100);
delay_ms (200);
play (nLA ,3,100);
delay_ms (200);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nDO ,4,100);
delay_ms (100);
play (nSI ,3,100);
delay_ms (100);
play (nSOL ,3,100);
break;
case 3:
//The lion sleep tonight
play (nDO ,3,125);
delay_ms (250);
play (nRE ,3,125);
delay_ms (125);
play (nMI ,3,125);
delay_ms (250);
play (nRE ,3,125);
delay_ms (250);
play (nMI ,3,125);
play (nFA ,3,125);
delay_ms (250);
play (nMI ,3,125);
delay_ms (125);
play (nRE ,3,125);
delay_ms (250);
play (nDO ,3,125);
delay_ms (250);
play (nRE ,3,125);
play (nMI ,3,125);
delay_ms (250);
play (nRE ,3,125);
delay_ms (125);
play (nDO ,3,125);
delay_ms (250);
delay_ms (125);
play (nMI ,3,125);
delay_ms (125);
play (nRE ,3,500);
break;
}
} |