Sound.c




//=====================================================================//
// Sound Test Program for PIC using T.T.L.S.
// Copyright 2002 Makio Suzuki. All rights reserved.
//
// CPU = PIC16C84
// X'tal = 10MHz
//
// Circuit diagram for port
//
//  RA4----(small)SPEAKER----VDD
//
//=====================================================================//

//This file was generated by the C2G Code Generator 1.1

//If necessary insert your global variables declaration here
#pragma CLOCK_FREQ 10000000
#define ON  1
#define OFF 0

#define C2  3
#define D2  5
#define E2  7
#define F2  8
#define G2 10
#define A3 12 //440[Hz]
#define B3 14
#define C3 15
#define D3 17
#define E3 19
#define F3 20
#define G3 22
#define A4 24 //880[Hz]
#define B4 26
#define C4 27
#define D4 29
#define E4 31
#define F4 32
#define G4 34
#define A5 36 //1760[Hz]
#define B5 38
#define C5 39

#define N0  0
#define N2  1
#define N4  2
#define N8  3
#define N16 4

unsigned char SpeakerOnOff;
unsigned char Ps,Tmr,SoundOnOff;

//TMR0 Overflow handler
void tmrHandler( void )
{
    TMR0 = Tmr;
    set_bit( STATUS, RP0 ); //Select the Register bank 1
    OPTION_REG = ( OPTION_REG&0xf8 )|Ps;
    clear_bit( STATUS, RP0 ); //Select the Register bank 0

    if( SoundOnOff==ON ){
        if( SpeakerOnOff==OFF ){
            SpeakerOnOff = ON;
            output_high_port_a( 4 );
        }else{
            SpeakerOnOff = OFF;
            output_low_port_a( 4 );
        }
    }
}

//This is the interrupt handler
void interruptvoid )
{
    //Insert your code which should run
    //before any interrupt processing here

    //Interrupt processing
    //TMR0 Overflow processing
    if( INTCON & 4 )
    {
        clear_bit( INTCON, 2 );
        tmrHandler();
    }
    //Insert your code which should run
    //after any interrupt processing here
}

void SoundSet( unsigned char SoundNumber,unsigned char Note )
{
    switch( SoundNumber ){
        case C4: Ps = 5; Tmr = 107; SoundOnOff = ON; break;
        case D4: Ps = 5; Tmr = 123; SoundOnOff = ON; break;
        case E4: Ps = 4; Tmr = 19;  SoundOnOff = ON; break;
        case F4: Ps = 4; Tmr = 33;  SoundOnOff = ON; break;
        case G4: Ps = 4; Tmr = 57;  SoundOnOff = ON; break;
        case A3: Ps = 4; Tmr = 79;  SoundOnOff = ON; break;
        case B3: Ps = 4; Tmr = 98;  SoundOnOff = ON; break;
        case C3: Ps = 4; Tmr = 107; SoundOnOff = ON; break;
        case D3: Ps = 4; Tmr = 123; SoundOnOff = ON; break;
        case E3: Ps = 3; Tmr = 19;  SoundOnOff = ON; break;
        case F3: Ps = 3; Tmr = 33;  SoundOnOff = ON; break;
        case G3: Ps = 3; Tmr = 57;  SoundOnOff = ON; break;
        case A4: Ps = 3; Tmr = 79;  SoundOnOff = ON; break;
        case B4: Ps = 3; Tmr = 98;  SoundOnOff = ON; break;
        case C4: Ps = 3; Tmr = 107; SoundOnOff = ON; break;
        case D4: Ps = 3; Tmr = 123; SoundOnOff = ON; break;
        case E4: Ps = 2; Tmr = 19;  SoundOnOff = ON; break;
        case F4: Ps = 2; Tmr = 33;  SoundOnOff = ON; break;
        case G4: Ps = 2; Tmr = 57;  SoundOnOff = ON; break;
        case A5: Ps = 2; Tmr = 79;  SoundOnOff = ON; break;
        case B5: Ps = 2; Tmr = 98;  SoundOnOff = ON; break;
        case C5: Ps = 2; Tmr = 107; SoundOnOff = ON; break;
        default: Ps = 3; Tmr = 100; SoundOnOff = OFF;
    }
    switch( Note ){
        case N0 : delay_ms( 250 );delay_ms( 250 );
        case N2 : delay_ms( 250 );
        case N4 : delay_ms( 250 ); break;
        case N8 : delay_ms( 125 ); break;
        case N16: delay_ms(  63 ); break;
        default : delay_ms( 250 );
    }
    SoundOnOff = OFF;
    switch( Note ){
        case N0 : delay_ms( 250 );delay_ms( 250 );
        case N2 : delay_ms( 250 );
        case N4 : delay_ms( 250 ); break;
        case N8 : delay_ms( 125 ); break;
        case N16: delay_ms(  63 ); break;
        default : delay_ms( 250 );
    }
}

//This is the main function which is called
//after processor power-up or reset
void main( void )
{
    //Hardware Initialization
    output_port_a( 0 );
    output_port_b( 0 );

    set_bit( STATUS, RP0 ); //Select the Register bank 1
    set_tris_a( 0 ); //Configure the Port A
    set_tris_b( 0 ); //Configure the Port B
    OPTION_REG = 0xc0; //[1100 0000]Configure the OPTION register
    clear_bit( STATUS, RP0 ); //Select the Register bank 0

    SoundSet( 0,N0 );
    SpeakerOnOff = OFF;

    INTCON = 0xa0; //[1010 0000]Configure the INTCON register

    //Don't forget to insert your code here!!!
    //(As there is no "return" from the main code
    //an endless loop may be a good idea)
    while( 1 ){
        SoundSet( C3,N4 );SoundSet( C3,N4 );SoundSet( G3,N4 );SoundSet( G3,N4 );
        SoundSet( A4,N4 );SoundSet( A4,N4 );SoundSet( G3,N2 );

        SoundSet( F3,N4 );SoundSet( F3,N4 );SoundSet( E3,N4 );SoundSet( E3,N4 );
        SoundSet( D3,N4 );SoundSet( D3,N4 );SoundSet( C3,N2 );

        SoundSet( G3,N4 );SoundSet( G3,N4 );SoundSet( F3,N4 );SoundSet( F3,N4 );
        SoundSet( E3,N4 );SoundSet( E3,N4 );SoundSet( D3,N2 );

        SoundSet( G3,N4 );SoundSet( G3,N4 );SoundSet( F3,N4 );SoundSet( F3,N4 );
        SoundSet( E3,N4 );SoundSet( E3,N4 );SoundSet( D3,N2 );

        SoundSet( C3,N4 );SoundSet( C3,N4 );SoundSet( G3,N4 );SoundSet( G3,N4 );
        SoundSet( A4,N4 );SoundSet( A4,N4 );SoundSet( G3,N2 );

        SoundSet( F3,N4 );SoundSet( F3,N4 );SoundSet( E3,N4 );SoundSet( E3,N4 );
        SoundSet( D3,N4 );SoundSet( D3,N4 );SoundSet( C3,N2 );

        SoundSet( 0,N0 );
    }
}
//=====================================================================//