📄 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 + -