?? voice1.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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -