📄 语音1._c
字号:
/****************************************************************
在发送命令时的第四位是开LED指示位
当C4=1时开启,要指示话要在每个命令中将此位置位
以下的程序都将此位置位了。
/*****************************************************************
#define PU PU(0x11) //POWER UP 01
#define PD PU(0x17) //POWER DOWN 07
#define EXTLCK PU(0x5A) //是否使能外部时钟 4A
#define STOP PU(0x12) //停止 02
#define RESET PU(0x13) //复位 03
#define FWD PU(0x01) //下一曲 48
#define PLAY PU(0x50) //播放当前曲目 40
#define REC PU(0x51) //从当前地址开始录音 41
#define CLR_INT PU(0x14) //清除中断和EOM位 04
#define ERASE PU(0x52) //擦除当前曲目 42
#define G_ERASE PU(0x53) //擦除全部曲目除了提示音 43
#define WR_NVCFG PU(0x56) //将APC的内容写到NVCFG中 46
#define LD_NVCFG PU(0x57) //将NVCFG的内容加载到APC中 47
#define CHK_MEM PU(0x59) //检查环形存储结构 49
#define RD_STATUS status_address(0x15) //读取状态寄存器,当前地址 05
#define DEVID status_address(0x19) //读取器件ID 09
#define RD_PLAY_PTR status_address_pointer(0x16) //读取状态寄存器,当前地址和播放指针 06
#define RD_REC_PTR status_address_pointer(0x18) //读取状态寄存器,当前地址和录音指针 08
#define RD_APC status_address_pointer(0x54) //读取状态寄存器,当前地址和APC寄存器 44
/****************************************************************************
下面的程序是要用
unsigned char command_data(unsigned char command,unsigned int data1,unsigned int data2)
该函数要实现如下功能由不同的命令实现
返回的i值是状态值
***********************************************************************
i=command_data(0x55,data1,data2);//wr_apc1(void);将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
i=command_data(0x75,data1,data2);//wr_apc2(void);将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
i=command_data(0x90,data1,data2); //set_play(void);//从<S10:S0>开始播放,直到<E10:E0>或EOM 80
i=command_data(0x91,data1,data2); //set_rec(void); //从<S10:S0>开始录音,直到<E10:E0> 81
i=command_data(0x92,data1,data2); //set_erase(void);//擦除<S10:S0>到<E10:E0>的内容 82
/***********************************************************
SPI发送程序
*************************************************************/
#include <iom16v.h>
#include <macros.h>
void spi_sent_init(void)
{ PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4); //设置MOSI,SCK和SS为输出
SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
SPSR = 0x00; //预分频为128
}
unsigned char SPI(unsigned int Data)
{
unsigned char sign;
PORTB &=~ (1<<PB4); //强制接收方进入从模式
SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
SPDR = Data; //启动数据传输
while(!(SPSR&(1<<SPIF))); //等待传输结束
PORTB |= (1<<PB4);
sign=SPSR;
sign=SPDR;
return sign;
}
/***********************************************************
命令程序
*************************************************************/
unsigned char pu(unsigned char data)
{
unsigned char i;
do
{
i=SPI(data);//发送命令
}
while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
return i;
}
//*************************************************************
unsigned int status_address(unsigned char data)//读取状态寄存器,当前地址
{
unsigned char i;
unsigned int k;
do
{
i=SPI(data);//发送命令
}
while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
k=SPI(0x00);//读当前地址
k=(8<<k)+i;//低位是状态,高位是地址
return k;
}
//*************************************************************
long status_address_pointer(unsigned char data)//读取状态寄存器,当前地址和播放指针
{
unsigned char i,j;
long k;
do
{
i=SPI(data);//发送命令
}
while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
j=SPI(0x00);//读当前地址
k=SPI(0x00);//读播放指针
k=(8<<k)+j;//低位是状态,高位是地址
k=(8<<k)+i;//低位是状态,中间是地址,高位是播放指针
return k;
}
//*************************************************************
unsigned char command_data(unsigned char command,unsigned int data1,unsigned int data2)
{
unsigned char i,j,k,m,n;
j=data1/256;k=data1%256;
m=data2/256;n=data2%256;
do
{
i=SPI(command);//发送命令
}
while((i=SPI(0x00))&0x01);//检测发送的命令是否接收了上一个命令
k=SPI(k);k=SPI(j);
k=SPI(n);k=SPI(m);
return i;
}
/**********************************************************************
************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -