📄 测试._c
字号:
#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 + -