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

📄 测试._c

📁 ISD1720芯片实现录音,定点录音,播放,定点播放等.
💻 _C
📖 第 1 页 / 共 2 页
字号:
#include <iom16v.h>
#include <macros.h>
#include "12864显示.c"
#include"4X4键盘.c"
//#include "延时子程序.c"
#define uchar unsigned char
#define uint unsigned int
/*****************************************************
/             要播放或要录音的开始与结果地址
**********************************************************/
uchar data_zi[]={"录音播放第0123456789段擦除"};
uchar data_ziju[]={"录音第01段"}; 
uint caToneAdd[]={0x0010,0x0013,0x0014,0x0017,0x0018,0x001b,0x001c,0x001f,
                        0x0020,0x0023,0x0024,0x0027,0x0028,0x002b,0x002c,0x002f,
						0x0030,0x0033,0x0034,0x0037,0x0038,0x003b,0x003c,0x003f,
						0x0040,0x0043};     

#define  PU                     0x11   //POWER UP 01
#define  STOP                   0x12  //停止   02
#define  RESET                  0x13  //复位  03
#define  CLI_INT                0x14  //清除中断和EOM位  04 
#define  RD_STATUS              0x15  //读取状态寄存器,当前地址 05
#define  RD_PLAY_PTR            0x16  //读取状态寄存器,当前地址和播放指针 06
#define  PD                     0x17  //POWER DOWN 07
#define  RD_REC_PTR             0x18  //读取状态寄存器,当前地址和录音指针 08
#define  RD_DEVID               0x19  //读取器件ID 09
#define  PLAY                   0x50  //播放
#define  REC                    0x51  //录音
#define  FWD                    0x58  //下一曲
#define  ERASE                  0X52  //擦除当前曲目
#define  G_ERASE                0x53  //擦除全部曲目除了提示音 43
#define  RD_APC                 0x54  //读取状态寄存器,当前地址和APC寄存器 44
#define  WR_APC1                0x55  //将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
#define  WR_APC2                0x75  //将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
#define  WR_NVCFG               0x56  //将APC的内容写到NVCFG中 46
#define  CHK_MEM                0x59   //检查环形存储结构 49
#define  SET_PLAY               0x90  //从<S10:S0>开始播放,直到<E10:E0>或EOM 80
#define  SET_REC                0x91   //从<S10:S0>开始录音,直到<E10:E0> 81
#define  SET_ERASE              0x92  //擦除<S10:S0>到<E10:E0>的内容 82

#define SS_1 PORTB|=(1<<PB4)  //停止SPI

uchar  SR0_L; //SR0的低位 
uchar  SR0_H;  //SR0的高位
uchar  SR1;  //SR1寄存器
uchar ID,APCL=0,APCH=0;//ID和APC寄存器
/**************************************************************************  
*    函数原型: ISD_SendData(unsigned int Data)  
*    功    能: SPI发送数据  
**************************************************************************/  
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 ISD_SendData(unsigned int Data)
{ 
  unsigned char sign;
  PORTB &=~ (1<<PB4);            //强制接收方进入从模式
  SPCR |= (1<<MSTR);             // MSTR有时会被清零,这里强制进入主机模式
  SPDR = Data;              //启动数据传输 
  while(!(SPSR&(1<<SPIF)));      //等待传输结束 
  sign=SPSR;
  sign=SPDR;
  //PORTB |= (1<<PB4);
  return sign;            
}
/**************************************************************************  
*    函数原型: void GetToneAdd(uchar cNum, Uint  ipStartAdd, Uint  ipEndAdd);  
*    功    能: 取出当前语音的首末地址  
**************************************************************************/  
  
void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){  

        *ipStartAdd=caToneAdd[cNum*2];  
        *ipEndAdd=caToneAdd[cNum*2+1];  
}  

/**************************************************************************  
*    函数原型: void ISD_PU(void);  
*    功    能: 上电  
**************************************************************************/  
void  ISD_PU(void){  
        ISD_SendData(PU);  
        ISD_SendData(0x00);  
        SS_1;  
    delay_ms(50);  
}
/**************************************************************************  
*    函数原型: void ISD_CHK_MEM(void);  
*    功    能: 空间检查  
**************************************************************************/  
void ISD_CHK_MEM(void){  
        ISD_SendData(CHK_MEM);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);  
} 

/**************************************************************************  
*    函数原型: void ISD_Play(void);  
*    功    能: 播放 
**************************************************************************/  
void ISD_Play(void){  
        ISD_SendData(PLAY);  
        ISD_SendData(0x00);
		SS_1;    
        delay_ms(10);  
}    
/**************************************************************************  
*    函数原型: void ISD_Stop(void);  
*    功    能: 停止  
**************************************************************************/  
  
void ISD_Stop(void){  
        ISD_SendData(STOP);  
        ISD_SendData(0x00);  
        SS_1;  
    delay_ms(50);  
}  

/**************************************************************************  
*    函数原型: void ISD_FWD(void);  
*    功    能: 下一曲  
**************************************************************************/  
  
void ISD_FWD(void){  
        ISD_SendData(FWD);  
        ISD_SendData(0x00);  
        SS_1;  
    delay_ms(50);  
}  
/**************************************************************************  
*    函数原型: void ISD_Reset(void);  
*    功    能: 复位  
**************************************************************************/  
void ISD_Reset(void){  
        ISD_SendData(RESET);  
        ISD_SendData(0x00);  
        SS_1;  
    delay_ms(50);  
}  

/**************************************************************************  
*    函数原型: void ISD_PD(void);  
*    功    能: 掉电  
**************************************************************************/  
  
void ISD_PD(void){  
        ISD_SendData(PD);  
        ISD_SendData(0x00);  
        SS_1;  
}

/**************************************************************************  
*    函数原型: void ClrInt(void);  
*    功    能: 清除中断  
**************************************************************************/  
void ClrInt(void){  
        ISD_SendData(CLI_INT);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);          //延迟10ms  
}  
/**************************************************************************  
*    函数原型: void ISD_WR_NVCFG(void);  
*    功    能: 永久写入寄存器  
**************************************************************************/  
void ISD_WR_NVCFG(void)
       {  
        ISD_SendData(WR_NVCFG);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);               //延迟10ms  
}

/**************************************************************************  
*    函数原型: ERASE(void);  
*    功    能: 擦除当前曲目
**************************************************************************/  
void ISD_ERASE(void){  
        ISD_SendData(ERASE);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);  
}

/**************************************************************************  
*    函数原型: void Erase_All(void);  
*    功    能: 全部删除  
**************************************************************************/  
void Erase_All(void){  
        ISD_SendData(G_ERASE);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(100);               //延迟10ms  
} 

/**************************************************************************  
*    函数原型: void RdStatus(void);  
*    功    能: 读取状态  
**************************************************************************/  
void RdStatus(void){  
        ISD_SendData(RD_STATUS);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);               //延迟10ms  
        SR0_L =ISD_SendData(RD_STATUS);  //SR0低位
        SR0_H =ISD_SendData(0x00);  //SRO高位
        SR1 =ISD_SendData(0x00);  //SR1
        SS_1; 
        delay_ms(10);  
}  

/**************************************************************************  
*    函数原型: void REC(void);  
*    功    能: 录音 
**************************************************************************/  
void ISD_REC(void){  
        ISD_PU();
		Erase_All();
		  do{  
                RdStatus();
        }while(SR0_L&0x01);//检查CMD_ERR
		ClrInt();//清除中断
		do{  
                RdStatus();
        }while(!(SR1&0x01));//检查RDY
		
		ISD_SendData(REC);  
        ISD_SendData(0x00);
		SS_1;    
        delay_ms(10);  
}
/**************************************************************************  
*    函数原型: void RdStatus(void);  
*    功    能: 读取ID  
**************************************************************************/  
uchar RD_DevID(void){  
        ISD_SendData(RD_DEVID);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);               //延迟10ms  
        SR0_L=ISD_SendData(RD_DEVID);  
        SR0_H=ISD_SendData(0x00);  
        ID=ISD_SendData(0x00);  
        SS_1; 
        delay_ms(10);  
        return(ID);  
}  

/**************************************************************************  
*    函数原型: void RD_APC(void);  
*    功    能: 读取APC  
**************************************************************************/  
void RdAPC(void){  
        ISD_SendData(RD_APC);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        ISD_SendData(0x00);  
        SS_1;  
        delay_ms(10);        //延迟10ms  

        SR0_L=ISD_SendData(RD_APC);  //SR0低位
        SR0_H=ISD_SendData(0x00);  //SR0高位
        APCL=ISD_SendData(0x00);  //APC低位
        APCH=ISD_SendData(0x00);  //APC高位
        SS_1;  
        delay_ms(10);             //延迟10ms  
}  

/**************************************************************************  
*    函数原型: void ISD_WR_APC2(uchar voiceValue);  
*    功    能: 设置APC2  
**************************************************************************/  
void ISD_WR_APC2(uchar voiceValue){  
        ISD_SendData(WR_APC2);  
        ISD_SendData(0x60|voiceValue);      //0xa8声音最大,0xaf声音最小  
        ISD_SendData(0x0d);            //开的是外部扬声器    
//D11=1,在SETPLAY模式下,执行到EOM自动结束。或者在连续两个SET_PLAY命令后,
//执行到第一个EOM自动跳到第二段开始  
        SS_1;  
        delay_ms(10);               //延迟10ms  
        ISD_WR_NVCFG();                        //永久写入寄存器  
}  

/**************************************************************************  
*    函数原型: void SetERASE(uchar cNum);  
*    功    能: 定点删除,容易破坏存储结构(CMA),所以不用  
**************************************************************************/  
  
void SetERASE(uchar cNum){  

        uint Add_ST,Add_ED;
		uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;  
		
		GetToneAdd(cNum, &Add_ST, &Add_ED);
		
        Add_ST_L=(uchar)(Add_ST&0xff);  
        Add_ST_H=(uchar)(Add_ST>>8);  
        Add_ED_L=(uchar)(Add_ED&0xff);  
        Add_ED_H=(uchar)(Add_ED>>8);  

        ISD_SendData(SET_ERASE);  
        ISD_SendData(0x00);  
        ISD_SendData(Add_ST_L);          //S7:S0  开始地址  
        ISD_SendData(Add_ST_H);          //S10:S8  
        ISD_SendData(Add_ED_L);          //E7:E0  结束地址  
        ISD_SendData(Add_ED_H);          //E10:E8  

⌨️ 快捷键说明

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