功能:1700芯片SPI工作模式下放音,录音,擦除等功能的编程示例*/
/******头文件*************/ #include /**************宏定义***************/ #define uchar unsigned char #define uint unsigned int /*******ISD1700状态寄存器及各个标志位定义****/ unsigned char bdata SR0_L;//SR0寄存器 unsigned char bdata SR0_H; unsigned char bdata SR1;//SR1寄存器 unsigned char APCL=0,APCH=0; unsigned char PlayAddL=0,PlayAddH=0; unsigned char RecAddL=0,RecAddH=0; sbit CMD=SR0_L^0; sbit FULL=SR0_L^1; sbit PU=SR0_L^2; sbit EOM=SR0_L^3; sbit INTT=SR0_L^4; sbit RDY=SR1^0; sbit ERASE=SR1^1; sbit PLAY=SR1^2; sbit REC=SR1^3; /***************ISD1700指令函数声明**********/ unsigned char ISD_SendData(unsigned char dat); unsigned char ISD_Devid (void); void ISD_PU(void); void ISD_STOP(void); void ISD_Reset(void); void ISD_Clr_Int(void); void ISD_Rd_Status(void); void ISD_Rd_Playptr(void); void ISD_PD(void); void ISD_Rd_Recptr(void); void ISD_Play(void); void ISD_Rec(void); void ISD_Erase(void); void ISD_G_Erase(void); void ISD_Rd_APC(void); void ISD_WR_APC2(unsigned char apcdatl,apcdath); void ISD_WR_NVCFG(unsigned char apcdatl,apcdath); void ISD_LD_NVCFG(void); void ISD_FWD(void); void ISD_CHK_MEN(void); void ISD_EXTCLK(void); void ISD_SET_PLAY(unsigned char Saddl,saddh,Eaddl,Eaddh); void ISD_SET_Rec(unsigned char Saddl,saddh,Eaddl,Eaddh); void ISD_SET_Erase(unsigned char Saddl,saddh,Eaddl,Eaddh); //***********************端口定义*****************************/// sbit SS=P1^0; sbit SCK=P1^1; sbit MOSI=P1^2; sbit MISO=P1^3; sbit LED=P0^7; sbit Key_AN=P3^2; sbit Key_STOP=P3^3; sbit Switch_PR=P1^4; ////*标志位定义*******************//// uchar bdata flag; sbit PR_flag=flag^1; sbit Erase_flag=flag^4; sbit Stop_flag=flag^7; ////////*其它函数声明************// void Cpu_Init(void); void ISD_Init(void); void ISDWORK(void); void delay(unsigned int t); /***************主函数*********************/ void main(void) { uchar i; Cpu_Init(); delay(1); ISD_Init(); while(1) { if(Key_AN==0) { delay(10); if(Key_AN==0) { } } } } if(Switch_PR==1) PR_flag=1; else PR_flag=0; ISDWORK(); if(Key_STOP==0) { } delay(20); if(Key_STOP==0) { } for(i=100;i>0;i--) { if(Key_STOP==1) { } flag=0x80; ISDWORK(); ISD_Init(); break; delay(30); } if(flag==0x80) { flag=00; continue; } Erase_flag=1; ISDWORK(); /************************函数原型:void IniCpuIO() 功能:CPU及系统变量初始化***********/// void Cpu_Init(void) { P0=P1=P2=P3=0xff; TMOD=0x01; EA=0; flag=0; LED=1; } /****************函数原型:void ISD_Init(void); 功能:系统初始化。************/ void ISD_Init(void) { uchar i=2; SS=1; SCK=1; MOSI=0; do { ISD_PU(); delay(50); ISD_Rd_Status(); }while(CMD||(!PU)); ISD_WR_APC2(0x40,0x04); do { } ISD_Rd_Status(); while(RDY==0); do { LED=0; delay(300); LED=1; delay(300); i--; } while(i>0); } /**************函数原型:void ISDWORK(void) 功能:对ISD1700进行的相关操作*******/ void ISDWORK(void) { uchar i; switch(flag) { case 0x00: do { ISD_Rd_Status(); } while(RDY==0); delay(10); ISD_Play(); delay(2); LED=0; do { ISD_Rd_Status(); if(Key_STOP==0) { delay(20); if(Key_STOP==0) { } ISD_Clr_Int(); ISD_STOP(); return; } } while(PLAY==1); LED=1; ISD_Clr_Int(); do { ISD_Rd_Status(); } while(RDY==0); delay(10); ISD_FWD(); do { ISD_Rd_Status(); } while(RDY==0); break; case 0x02: ISD_Clr_Int(); do { ISD_Rd_Status(); } while(RDY==0); LED=0; ISD_Rec(); do { ISD_Rd_Status(); if(FULL==1) { for(i=3;i>0;i--) { } } LED=0; delay(300); LED=1; delay(200); }while(Key_AN==0); ISD_Clr_Int(); ISD_STOP(); LED=1; break; case 0x10: do { ISD_Rd_Status(); }while(RDY==0); delay(2); ISD_G_Erase(); do { ISD_Rd_Status(); }while(RDY==0); for(i=3;i>0;i--) { } LED=0; delay(300); LED=1; delay(200); break; case 0x80: ISD_Clr_Int(); ISD_STOP(); ISD_Reset(); ISD_PD(); break; } } /**************函数原型:unsigned char ISD_SendData(unsigned char dat); 功能:向CPU发送&读回数据******/ unsigned char ISD_SendData(unsigned char dat) { unsigned char i,j,BUF_ISD=dat; SCK=1; SS=0; for(j=4;j>0;j--) {;} for(i=0;i<8;i++) { } SCK=0; for(j=2;j>0;j--) {;} if(BUF_ISD&0x01) MOSI=1; else MOSI=0; BUF_ISD>>=1; if(MISO) BUF_ISD|=0x80; SCK=1; for(j=6;j>0;j--) {;} MOSI=0; return(BUF_ISD); } /************函数原型:void ISD_STOP(void); 功能:停止当前操作**********/ void ISD_STOP(void) { ISD_SendData(0x02); ISD_SendData(0x00); SS=1; } /***********函数原型:void ISD_Reset(void);发送指令后需要延迟50ms 功能:ISD1700复位****************/ void ISD_Reset(void) { } /*****************函数原型:void ISD_Clr_Int(void); 功能:清除中断标志**************/ ISD_SendData(0x03); ISD_SendData(0x00); SS=1; void ISD_Clr_Int(void) { } /******************函数原型:void ISD_Rd_Status(void) 功能:读取状态寄存器内容********/ void ISD_Rd_Status(void) { unsigned char i; ISD_SendData(0x05); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;} SR0_L=ISD_SendData(0x05); SR1=ISD_SendData(0x00); ISD_SendData(0x04); ISD_SendData(0x00); SS=1; SR0_H=ISD_SendData(0x00); SS=1; } /**************** *函数原型:void ISD_Rd_PlayPtr(void) 功能:读取放音指针**************/ void ISD_Rd_Playptr(void) { unsigned char i; ISD_SendData(0x06); ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;} SR0_L=ISD_SendData(0x06); SR0_H=ISD_SendData(0x00); PlayAddL=ISD_SendData(0x00); PlayAddH=ISD_SendData(0x00); SS=1; } /******************函数原型:void iSD_PD(void);发送指令后需要延时50ms 功能:下电************************/ void ISD_PD(void) { ISD_SendData(0x07); ISD_SendData(0x00); } /**************函数原型:void ISD_Rd_RecPtr(void); 功能:读取录音指针*****************/ void ISD_Rd_Recptr(void) { unsigned char i; ISD_SendData(0x08); ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;} SR0_L=ISD_SendData(0x08); SR0_H=ISD_SendData(0x08); RecAddL=ISD_SendData(0x00); RecAddH=ISD_SendData(0x00); SS=1; SS=1; } /****************函数原型:unsigned char ISD_Devid(void); 功能:读取APC寄存器内容***********/ unsigned char ISD_Devid(void) { unsigned char DeviceNO,i; ISD_SendData(0x09); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;} ISD_SendData(0x09); ISD_SendData(0x00); DeviceNO=ISD_SendData(0x00); SS=1; return DeviceNO; } /*****************函数原型:void ISD_Rec(void); 功能:录音******************/ void ISD_Rec(void) { ISD_SendData(0x41); } /******************函数原型:void ISD_ISD_Erase(void); 功能:擦除****************/ void ISD_Erase(void) { ISD_SendData(0x42); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; SS=1; } /*******************函数原型:void ISD_G_Erase(void); 功能:全体擦除************/ void ISD_G_Erase(void) { ISD_SendData(0x43); ISD_SendData(0x00); SS=1; } /**************函数原型:void ISD_RD_APC(void) 功能:读取APC寄存器内容***************/ void ISD_Rd_APC(void) { unsigned char i; ISD_SendData(0x44); ISD_SendData(0x00); ISD_SendData(0x00); ISD_SendData(0x00); SS=1; for(i=2;i>0;i--) {;} SR0_L=ISD_SendData(0x44); SR0_H=ISD_SendData(0x00); APCL=ISD_SendData(0x00); APCH=ISD_SendData(0x00); SS=1; } /***************函数原型:void ISD_WR_APC2(unsigned char apcdatl,apcdath); 功能:设置APC2***********************/ void ISD_WR_APC2(unsigned char apcdatl,apcdath) { } ISD_SendData(0x65); ISD_SendData(apcdatl); ISD_SendData(apcdath); SS=1; /**********函数原型:void ISD_WR_NVCFG(unsigned char apcdatl,apcdath); 功能:将APC数据写入NVCFG寄存器中***********/ void ISD_WR_NVCFG(unsigned char apcdatl,apcdath) { ISD_SendData(0x46); ISD_SendData(apcdatl); ISD_SendData(apcdath); SS=1; } /***********函数原型:void ISD_LD_NVCFG(void) 功能:将NVCFG数据载入APC寄存器中********/ void ISD_LD_NVCFG(void) { ISD_SendData(0x47); ISD_SendData(0x00); SS=1; } /***********函数原型:void ISD_FWD(void) 功能:放音指针下跳一段,指向下一段语音的起始地址********/ void ISD_FWD(void) { } ISD_SendData(0x48); ISD_SendData(0x00); SS=1; /***********函数原型:void ISD_CHK_MEN(void) 功能:空间检查******/ void ISD_CHK_MEM(void) { ISD_SendData(0x49); ISD_SendData(0x00); SS=1; } /***********函数原型:void ISD_EXTCLK(void) 功能:启用/关闭 外部时钟模式******/ void ISD_EXTCLK(void) { ISD_SendData(0x4a); ISD_SendData(0x00); SS=1; } /***********函数原型:void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eakkh); 功能:定点播放******/ void ISD_SET_PLAY(unsigned char Saddl,Saddh,Eaddl,Eaddh) { ISD_SendData(0x80); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1; } /***********函数原型:void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eakkh); 功能:定点录音******/ { void ISD_SET_Rec(unsigned char Saddl,Saddh,Eaddl,Eaddh) ISD_SendData(0x81); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1; } /***********函数原型:void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eakkh); 功能:定点录音******/ { void ISD_SET_Erase(unsigned char Saddl,Saddh,Eaddl,Eaddh) } ISD_SendData(0x82); ISD_SendData(0x00); ISD_SendData(Saddl); ISD_SendData(Saddh); ISD_SendData(Eaddl); ISD_SendData(Eaddh); ISD_SendData(0x00); SS=1; /***********函数原型:void delay(unsigned int t) 功能:ms级延时******/ void delay(unsigned int t) { for(;t>0;t--) { TH0=0xfc; TL0=0x18; TR0=1; while(TR0!=1) {;} TF0=0; TR0=0; } }
因篇幅问题不能全部显示,请点此查看更多更全内容