#include "Isd.h"
/***********************************************************************************/
/*
函数名 :void IsdInit(void)
函数功能:ISD初始化
入口参数:无
出口参数:无
调用函数:void SpiInit(void);//SPI初始化
其 他:无
作 者:旺仔
*/
/***********************************************************************************/
void IsdInit(void)
{
ISD_ENABLE;
//RD5=0;RD6=1;RD7=1;
SpiInit(); //通信接口使能
}
/***********************************************************************************/
/*
函数名 :void IsdPowerUp(void)
函数功能:ISD芯心上电使能
入口参数:无
出口参数:无
调用函数:void IsdInit(void);
其 他:无
作 者:旺仔 朱永磊
*/
/***********************************************************************************/
void IsdPowerUp(void)
{
IsdInit(); //由于同时使用了iic 所以每次都要重新初始化
//发POWERUP 0010 0*** ******** ********
//拉低 开始发送
RA5SS_L;
DelayUs(200);
// SSPBUF=0X20;DELAY_US(80000);//高8位指令码 0010 0***
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
//高8位指令码 0010 0*** --> 0000 0100
SSPBUF=0X04;
DelayUs(65000);
DelayUs(65000);
RA5SS_H;
DelayUs(600);
}
/***********************************************************************************/
/*
函数名 :void IsdStopWrnd(void)
函数功能:停止当前操作并掉电,省电
入口参数:无
出口参数:无
调用函数:void IsdInit(void);
其 他:无
作 者:旺仔 朱永磊
*/
/***********************************************************************************/
void IsdStopWrnd(void)
{
IsdInit(); //由于同时使用了iic 所以每次都要重新初始化
//拉低 开始发送
RA5SS_L;
DelayUs(130);
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
//高8位指令码 00*01 0000 --> 0000 10*00
SSPBUF=0X08;
DelayUs(65000);
DelayUs(65000);
//拉高 开始执行
RA5SS_H;
DelayUs(600);
}
/***********************************************************************************/
/*
函数名 :void IspPlay(U8 ADDRESS_L,U8 ADDRESS_H)
函数功能:语音放音函数,只需将语音段地址写入形参即可
入口参数:地址低8位ADDRESS_L,地址高8位ADDRESS_H
出口参数:无
调用函数:void IsdInit(void);
void IsdStopWrnd(void);
void IsdPowerUp(void);
其 他:无
作 者:旺仔 朱永磊
*/
/***********************************************************************************/
void IsdPlay(U8 ADDRESS_L,U8 ADDRESS_H)
{
//为确保下次说话时,当前的说话要停止,所以先发关机指令,再发开机指令。
IsdInit();
IsdStopWrnd();
IsdPowerUp();
//发SET PLAY 最后发PLAY
//发SET PLAY 1110 0*** 0000 0000 0000 0000 发地址
//拉低 开始发送
RA5SS_L;
DelayUs(200);
SSPBUF=ADDRESS_L;
DelayUs(1000);//低8位地址
SSPBUF=ADDRESS_H;
DelayUs(800);//高8位地址
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
SSPBUF=0X07;//高8位指令码 1110 0*** --->0000 0111
DelayUs(13000);
//拉高 开始执行
RA5SS_H;
//最后发PLAY 1111 0*** ************
DelayUs(600);
//拉低 开始发送
RA5SS_L;
DelayUs(130);
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
SSPBUF=0X0f;//高8位指令码 1111 0*** --->0000 1111
DelayUs(800);
//拉高 开始执行
RA5SS_H;
DelayUs(600);
}
/***********************************************************************************/
/*
函数名 :void IspRecord(U8 ADDRESS_L,U8 ADDRESS_H)
函数功能:语音录音函数,只需将语音段地址写入形参即可
入口参数:地址低8位ADDRESS_L,地址高8位ADDRESS_H
出口参数:无
调用函数:void IsdInit(void);
void IsdStopWrnd(void);
void IsdPowerUp(void);
其 他:无
作 者:旺仔
*/
/***********************************************************************************/
void IsdRecord(U8 ADDRESS_L,U8 ADDRESS_H)
{
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
//为确保下次说话时,当前的说话要停止,所以先发关机指令,再发开机指令。
IsdInit(); //由于同时使用了iic 所以每次都要重新初始化
IsdStopWrnd();//关机
IsdPowerUp();//开机
//发SET PLAY 最后发PLAY
//发SET PLAY 1110 0*** 0000 0000 0000 0000 发地址
//拉低 开始发送
RA5SS_L;
DelayUs(200);
SSPBUF=ADDRESS_L;
DelayUs(1000);//低8位地址
SSPBUF=ADDRESS_H;
DelayUs(800);//高8位地址
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
SSPBUF=0X05;//高8位指令码 1010 0*** --->0000 0101
DelayUs(13000);
//拉高 开始执行
RA5SS_H;
// 最后发PLAY 1111 0*** ************
DelayUs(600);
//拉低 开始发送
RA5SS_L;
DelayUs(130);
//注意:PIC 是高位先发送,而在ISD的接收是低位先接收。所以,发送时要倒序发送!
SSPBUF=0X0d;//高8位指令码 1011 0*** --->0000 1101
DelayUs(800);
//拉高 开始执行
RA5SS_H;
DelayUs(600);
}
/***********************************************************************************/
/*
函数名 :void SoundStop()
函数功能:声音停止函数
入口参数:无
出口参数:无
调用函数:
void IsdStopWrnd(void);
其 他:无
作 者:旺仔 朱永磊
*/
/***********************************************************************************/
void SoundStop()
{
IsdStopWrnd();
}
/***********************************************************************************/
/*
函数名 :void SoundPlay(U8 id)
函数功能:声音播放函数
入口参数:语音段id
出口参数:无
调用函数:
void IsdPlay(U8 ADDRESS_L,U8 ADDRESS_H)
其 他:无
作 者:旺仔 朱永磊
*/
/***********************************************************************************/
void SoundPlay(U8 play_id)
{
U16 addr=0;
U8 addr_l=0;
U8 addr_h=0;
addr=play_id*SECOND_OFFSET;
addr_l=(U8)(addr & 0x00ff);
addr_h=(U8)((addr>>8) & 0x00ff);
addr_l=DaoXu(addr_l);
addr_h=DaoXu(addr_h);
IsdPlay(addr_l,addr_h);
}
/************************************************************************************************/
/*
函数名 :void SoundPlay(U8 id)
函数功能:声音播放函数
入口参数:语音段id
出口参数:无
调用函数:
void IsdPlay(U8 ADDRESS_L,U8 ADDRESS_H)
其 他:无
作 者:旺仔 朱永磊
*/
void SoundRecord(U8 record_id)
{
U16 addr=0;
U8 addr_l=0;
U8 addr_h=0;
addr=record_id*SECOND_OFFSET;
addr_l=(U8)(addr & 0x00ff);
addr_h=(U8)((addr>>8) & 0x00ff);
addr_l=DaoXu(addr_l);
addr_h=DaoXu(addr_h);
IsdRecord(addr_l,addr_h);
}
/************************************************************************************************/
/*
函数名 :U8 DaoXu(U8 num)
函数功能:倒序
入口参数:U8 num
出口参数:无
调用函数:
void IsdPlay(U8 ADDRESS_L,U8 ADDRESS_H)
其 他:无
作 者:朱永磊 旺仔
*/
U8 DaoXu(U8 num)
{
U8 mo = 0,reverse_num = 0,shang=0,i=0;
shang=num;
for(i=0;i<8;i++)
{
mo = shang%2;//得到二进制的某一位。涉及算术运算符的,16进制数自动按十进制数进行运算
shang = shang /2;
reverse_num=reverse_num<<1;
if(mo) reverse_num|=0x01;
}
return reverse_num;
}