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

📄 isd4004.c

📁 语音芯片ISD4004的驱动程序。。。希望对大家有用
💻 C
字号:
#include <main.H> 

/*ISD命令定义*/
#define  powerup 0x20//上电,等待TPUD后器件可以工作
#define  setplay 0xe0//从指定位置放音,后面必有跟PLAY指令
#define  play    0xf0//从当前地址放音,直到EOM或OVF
#define  setrec  0xa0//从指定位置录音,后面必有跟REC指令
#define  rec     0xb0//从当前地址放音,直到停止或OVF
#define  setmc   0xe8//快进,未用
#define  mc      0xf8//快进,未用
#define  stop    0x30//停止当前操作
#define  stoppw  0x10//停止当前操作并掉电
#define  RINT    0x30//读状态:OVF和EOM

sbit SCLK=P2^0; //写时钟
sbit SS=P2^1; //片选
sbit MOSI=P2^2; //串行数据输入端
sbit MISO=P2^3; //串行数据输出端

sbit INT=P3^2; //INT0(P3.2),录满整个芯片信号
sbit RAC=P3^4; //从T0(P3.4)输入,用来计算行地址

void delay(unsigned int a)
{
 while(a--);
}
void Write_ISDaddress(unsigned int a)//写入16位的地址, 从低位,到高位
{
 unsigned char i;
 SCLK=0;
 for(i=0;i<16;i++)
 {
  if(a&0x0001)
     MOSI=1;
  else
     MOSI=0;
  delay(4);  //数据setup time200nS最少
  SCLK=1;    //上升沿写入数据
  delay(8);  //SCLK高电平最少400ns
  SCLK=0;  	 
  delay(8);	 //SCLK低电平最少保持400ns
  a=a>>1;
 }
}
void Write_ISDcommand(unsigned char a)//写8位的命令码,从低位,到高位
{
 unsigned char i;
 SCLK=0;
 for(i=0;i<8;i++)
 {
  if(a&0x01)
     MOSI=1;
  else
     MOSI=0;
  delay(4);  //数据setup time200nS最少
  SCLK=1;    //上升沿写入数据
  delay(8);  //SCLK高电平最少400ns
  SCLK=0;  	 
  delay(8);	 //SCLK低电平最少保持400ns
  a=a>>1;
 }
}
void ISD_PowerUp(void)//上电命令
{
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(0x0000);
 Write_ISDcommand(powerup);//0x20
 SS=1;	  //数据传输结束于SS上升沿
 delay(15000);//SS高电平最少1uS
}
void play4004(unsigned int address)//
{
 ISD_PowerUp();
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(address);
 Write_ISDcommand(0xe0); //setplay==0xe0;
 SS=1;	  //两指令之间为高
 delay(15000);//SS高电平最少1uS
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(address);
 Write_ISDcommand(0xf0);      //play==0xf0;
 SS=1;	  //数据传输结束于SS上升沿
 delay(15000);//SS高电平最少1uS
}
void record4004(unsigned int address)
{
 ISD_PowerUp();
 ISD_PowerUp();
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(address);
 Write_ISDcommand(0xa0); //setrec==0xa0;
 SS=1;	  //两指令之间为高
 delay(15000);//SS高电平最少1uS
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(address);
 Write_ISDcommand(0xb0);   //rec==0xb0;
 SS=1;	  //数据传输结束于SS上升沿
 delay(15000);//SS高电平最少1uS
}
void stopISD(void)
{
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(0x0000);
 Write_ISDcommand(0x30);   //stop==0x30;
 SS=1;	  //数据传输结束于SS上升沿
 delay(15000);//SS高电平最少1uS
} 
void PowrnDownISD(void)
{
 SS=0;	   //写数据开始于SS的下降沿
 delay(10);//SS先拉低,500nS最少
 Write_ISDaddress(0x0000);
 Write_ISDcommand(stoppw);   //0x10;
 SS=1;	  //数据传输结束于SS上升沿
 delay(15000);//SS高电平最少1uS
}

⌨️ 快捷键说明

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