语音芯片isd4004的驱动程序
///////////////////////主函数功能描述////////////////////// /*
函数名称:isd4004
函数功能:语音录入/播放函数
入口参数:空
出口参数:空
异常
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
:无
*/
///////////////////////////////////////////////////////////
#include
#define uchar unsigned char
#define uint unsigned int
sbit SS = P3^0; //片选
sbit SCLK = P3^3; //ISD4003 时钟
sbit MOSI = P3^1; //数据输入
sbit MISO = P3^2; //数据输出
sbit ISD_INT= P3^4; //中断
sbit RAC=P3^5;
uchar PR=1; //PR=1 录音 PR=0 放音
//////////////////函数申明区//////////////////////// void delay4004(unsigned int time); void spi_send(uchar data4004); //isd4004spi发送数据函数
void isd_stop(void); //发送停止指令 void isd_pu(void); //上电指令
void isd_pd(void); //下电指令
void isd_play(void); //播放指令
void isd_rec(void); //录音指令
void isd_setplay(uchar adl,uchar adh); //设置播放模式指令
void isd_setrec(unsigned char adl,unsigned char adh);
//设置录音模式指令
//unsigned char chk_isdovf(void) //检查是否溢出函数 //////////////////////////////////////////////////
void init12864(uchar c_command,uchar c_time); void print12864(uchar c_12864add,uchar c_12864hdate,uchar
c_12864ldate,uchar c_12864time); uchar keyboard(uchar c_break);
void delay4004(unsigned int time) //延迟n 微秒
{
while(time--)
{
;
}
}
//************************************
//ISD4004 spi 串行发送子程序,8 位数据
//************************************
void spi_send(uchar data4004) {
unsigned char isx_counter; SS=0; //ss=0,打开spi 通信端
SCLK=0;
for(isx_counter=0;isx_counter<8;isx_counter++) //先发低位再发高位,依次发送。
{
if ((data4004&0x01)==1)
MOSI=1;
else
MOSI=0;
SCLK=0; //下降沿发送数据
delay4004(2);
SCLK=1;
data4004=data4004>>1;
}
}
//******************************* //发送stop 指令
//******************************* void isd_stop(void)
{
delay4004(10);
SS=0;
spi_send(0x30);
SS=1;
// delay4004ms(50);
}
//******************************* //发送上电指令,并延迟50ms
//******************************* void isd_pu(void)
{
delay4004(10);
SS=0;
spi_send(0x20);
SS=1;
// delay4004ms(50);
}
//*******************************
//发送掉电指令,并延迟50ms
//******************************* void isd_pd(void)
{
delay4004(10);
SS=0;
spi_send(0x10);
SS=1;
// delay4004ms(50);
}
//******************************* //发送play 指令
//******************************* void isd_play(void)
{
spi_send(0xf0);
SS=1;
}
//******************************* //发送rec 指令
//******************************* void isd_rec(void)
{
spi_send(0xb0);
SS=1;
}
//******************************* //发送setplay 指令
//******************************* void isd_setplay(uchar adl,uchar adh) {
delay4004(1);
spi_send(adl); //发送放音起始地址低位
delay4004(2);
spi_send(adh); //发送放音起始地址高位
delay4004(2);
spi_send(0xe0); //发送setplay 指令字节
SS=1;
}
//*******************************
//发送setrec 指令
//*******************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
delay4004(1);
spi_send(adl); //发送放音起始地址低位
delay4004(2);
spi_send(adh); //发送放音起始地址高位
delay4004(2);
spi_send(0xa0); //发送setrec 指令字节
SS=1;
}
//************************************
//检查芯片是否溢出(读OVF,并返回OVF 值) //************************************
/*unsigned char chk_isdovf(void)
{
SS=0;
delay4004(2);
SCLK=0;
delay4004(2);
SCLK=1;
SCLK=0;
delay4004(2);
if (MISO==1)
{
SCLK=0;
SS =1; //关闭spi 通信端
isd_stop(); //发送stop 指令
return 1; //OVF 为1,返回1
}
else
{
SCLK=0;
SS =1; //关闭spi 通信端
isd_stop(); //发送stop 指令
return 0; //OVF 为0,返回0
}
} */
void isd4004(uchar c_select) {
uint isd4004add=0;
SS=MOSI=MISO=SCLK=ISD_INT=RAC=1; init12864(0x01,0);
print12864(0x80,'o','k',0); if(c_select=='A')
{
print12864(0x80,'A','!',0);
isd_pu();
delay4004(5118);
delay4004(5118);
isd_pu();
delay4004(5118);
delay4004(5118);
delay4004(5118);
delay4004(5118);
isd_setrec(0x00,0x00);
delay4004(2);
isd_rec();
while(1)
{
if(ISD_INT==0) {print12864(0x90,'e','d',0);break;}
if(RAC==0)
{
delay4004(20000); isd4004add++;
print12864(0x90,isd4004add/1000+0x30,isd4004add%1000/100+0x30,0);
print12864(0x92,isd4004add%100/10+0x30,isd4004add%10+0x30,0);
if(keyboard(0))break;
}
}
isd_stop();
isd_pd();
}
if(c_select=='B')
{
isd4004add=0;
print12864(0x98,'B','!',0);
isd_pu();
delay4004(5118);
isd_setplay(0x00,0x00);
isd_play();
while(1)
{
if(ISD_INT==0) print12864(0x90,'e','d',0);
if(RAC==0)
{
delay4004(20000); isd4004add++;
print12864(0x90,isd4004add/1000+0x30,isd4004add%1000/100+0x30,0);
print12864(0x92,isd4004add%100/10+0x30,isd4004add%10+0x30,0);
if(keyboard(0))break;
}
if(keyboard(0)){print12864(0x82,'f','a',0); break;}
}
isd_stop();
isd_pd();
}
if(c_select=='C')
{
isd4004add=0;
print12864(0x98,'B','!',0);
isd_pu();
delay4004(5118);
isd_setplay(0x05,0x00);
isd_play();
while(1)
{
if(ISD_INT==0) print12864(0x90,'e','d',0);
if(RAC==0)
{
delay4004(2000); isd4004add++;
print12864(0x90,isd4004add/1000+0x30,isd4004add%1000/100+0x30,0);
print12864(0x92,isd4004add%100/10+0x30,isd4004add%10+0x30,0);
if(keyboard(0))break;
}
if(keyboard(0)){print12864(0x82,'f','a',0); break;}
}
isd_stop();
isd_pd();
}
if(c_select=='D')
{
print12864(0x80,'A','!',0);
isd_pu();
delay4004(5118);
isd_pu();
delay4004(5118);
delay4004(5118);
isd_setrec(0x10,0x00);
delay4004(2);
isd_rec();
while(1)
{
print12864(0x90,'e','d',0);
if(RAC==0)
{
delay4004(2000); isd4004add++;
print12864(0x90,isd4004add/1000+0x30,isd4004add%1000/100+0x30,0
);
print12864(0x92,isd4004add%100/10+0x30,isd4004add%10+0x30,0);
if(keyboard(0))break;
}
}
isd_stop();
}
}