⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voice1.c

📁 语音芯片ISD4003在PIC下的驱动。
💻 C
字号:

 #define DEBUG     

/* PREPROCESSOR STUFF */
#case
#include <16F876.H>
/* clk is 4MHz */
#use Delay(Clock=4000000)
/* no watchdog timer, no code protect, yes power up timer */
#fuses XT, NOWDT, NOPROTECT, PUT
/* set port directions manually */
#use fast_io(A)
#use fast_io(B)

#define LED_1        PIN_B6
#define LED_2        PIN_B7
#define VOICE_SS     PIN_B3
#define PUSH_REC     PIN_A1
#define PUSH_PLAY    PIN_A4
#define PUSH_STOP    PIN_A5

#define T_PUD	  25		/* Power Up Delay Time to wait ( miliseconds ) */
#define POWER_UP_CMD  		0b00100000  
#define POWER_DN_CMD		0b00010000
#define STRT_RECORD_CMD	        0b10110000
#define STOP_RECORD_CMD		0b00110000
#define STRT_PLAY_CMD		0b11110000
#define STOP_PLAY_CMD		0b00110000
#define INIT_MSG_CUE_CMD	0b11101000
#define STRT_MSG_CUE_CMD	0b11111000

#define MSG_LENGHT_DIV 4        /* 4 = 6 seg,   5 = 12seg, etc */
#define MSG_LENGHT_MSEC 400   	/* Time available in a sibgle row. Given in miliseconds*/
void power_down_voice() {

   output_low(  VOICE_SS  );
   spi_write(  0x00   );
   spi_write(   POWER_DN_CMD   );
   output_high( VOICE_SS ); 
}

void stop_test() {

/*inv 00001100 */

  output_low( VOICE_SS ); 
#IFNDEF DEBUG  delay_us(25);
#ENDIF
  spi_write( 0x00 );
  spi_write( 0x0C );   
#IFNDEF DEBUG  delay_us(25);
#ENDIF
  output_high( VOICE_SS );
#IFNDEF DEBUG  delay_us(25);
#ENDIF
}


test_LED() {
	output_high(LED_1);
	output_low(LED_1);
#IFNDEF DEBUG delay_ms(200);
#ENDIF
	output_high(LED_1);
#IFNDEF DEBUG	delay_ms(200);
#ENDIF
}


int invert_bits(int addr ) {
int i,addr_out;
addr_out = 0;
       for(i =0; i<8; i++){
		if( bit_test(addr, i)==1 )
			bit_set(addr_out, 7-i);
	}
return ( addr_out );
}

void wait_for_record() {
int i;
  for(i=MSG_LENGHT_DIV; i!=0; i--) {
	#IFNDEF DEBUG 
		delay_ms(200);
		delay_ms( 200 );	/* 400 mSec is the lenght of each row */
	#ENDIF
  	}

}

void record_addr_test(long addr) {
 int new_addr_LSB, new_addr_MSB;

 addr = addr << MSG_LENGHT_DIV;

 new_addr_LSB = addr;
 new_addr_MSB = (addr<<8) | (addr>>8);
 new_addr_LSB = invert_bits(new_addr_LSB);
 new_addr_MSB = invert_bits(new_addr_MSB);

	/*SET RECORD inv :0000 0101  */   
	  output_low( VOICE_SS );
	  spi_write( new_addr_LSB );
	  spi_write( 0x05 | new_addr_MSB );  
	  output_high( VOICE_SS );

	/* send RECORD cmd */
	  output_low( VOICE_SS );
	  spi_write( new_addr_LSB );
	  spi_write( 0x0d | new_addr_MSB);  /*record  inv:0000 1101    norm:1011 0000*/
	  output_high( VOICE_SS );

}


void play_addr_test( long addr) {
 int new_addr_LSB, new_addr_MSB;

 addr = addr << MSG_LENGHT_DIV;
 new_addr_LSB = addr;
 new_addr_MSB = (addr<<8) | (addr>>8);
 new_addr_LSB = invert_bits(new_addr_LSB);
 new_addr_MSB = invert_bits(new_addr_MSB);

	/* SET PLAY inv: 0000 0111 normal: 1110 0000  */
	  output_low( VOICE_SS );
	  spi_write( new_addr_LSB );
	  spi_write( 0x07 | new_addr_MSB );  
	  output_high( VOICE_SS );
#IFNDEF DEBUG	  delay_ms(10);
#ENDIF
	/* send Play cmd */
	  output_low( VOICE_SS );
	  spi_write( new_addr_LSB  );
	  spi_write( 0x0f | new_addr_MSB  );  /* play inv: 00001111   normal: 1111 0000  */
	  output_high( VOICE_SS );

}


void power_up_voice_test() {

/*#define POWER_UP_CMD  		0b0010 0000  
  				         0000 0100     */
   output_low(VOICE_SS); 
#IFNDEF DEBUG   delay_us(25);
#ENDIF
   spi_write( 0x00    );
   spi_write(   0x04 );
#IFNDEF DEBUG   delay_us(25);
#ENDIF
   output_high( VOICE_SS );   
#IFNDEF DEBUG   delay_ms(    T_PUD * 4 );
#ENDIF		/* give some extra time to power up operation */
}


main()
{

  int i,temp_i;
 int runr,runp ;
 signed long  temp;

  /* set direction of ports */
  set_tris_a(0b00110010);
  set_tris_b(0x00);
  set_tris_c(0b00010000);
  
  output_high( VOICE_SS );
  setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 ); 
#IFNDEF DEBUG  delay_ms(400);
#ENDIF

  output_high( VOICE_SS );
#IFNDEF DEBUG  
	delay_ms(400);
#ENDIF
  power_up_voice_test();
#IFNDEF DEBUG  delay_ms(400);
#ENDIF
  runr=37; runp=37;


  test_LED();
  do{

   if( input( PUSH_REC ) == 0 ) {
		output_low(LED_2);
		#IFNDEF DEBUG		
			delay_ms(400);
		#ENDIF
		record_addr_test(runr);  runr--;
	        wait_for_record();
	        stop_test();
		}
   else if ( input( PUSH_PLAY ) == 0 ) {
		output_low( LED_2);
		#IFNDEF DEBUG		
			delay_ms(400);
		#ENDIF
		play_addr_test(runp);  runp--;

		}

    test_LED();
  }while(1);

}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -