|
这是我刚学AVR时用了三天时间用示波器加英文Datasheet调出来的,拿来共享一下。不知阿莫会不会给个"酷"字
ISD4004基本程序 ICC的
/********************************************************************
ISD4004 基本程序 AVR meag16
Pafone SPI 端口 1M内部晶振
13th April 2007 It took me about 3 days
********************************************************************/
#i nclude<iom16v.h>
#i nclude<macros.h>
#define uchar unsigned char
#define DDR_SPI DDRB
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 4
//*******************************延时100ms*****************************
void delay100ms()
{
unsigned char i,j;
for(j = 0;j<316;j++)
for(i = 0;i<316;i++);//1MHz的晶振
}
//************************初始化SPI***********************************
void SPI_MasterInit()
{
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//设置MOSI,SCK,SS 为OUTPUT,其它为INPUT
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|BIT(SPR1)|BIT(DORD);//SPI使能,主机方式,设置SCK为fosc/128,上升沿,LSB First
}
//****************************数据传送函数**********************************
void SpiTransmit(unsigned char data)
{
SPDR = (unsigned char)data;
while(!(SPSR&(1<<SPIF)));//Wait for transmission finish
}
//****************cmdSend*********************************
void cmdSend(unsigned int Addr,unsigned char cmd)
{
PORTB = PORTB&(~(1<<DD_SS));//变低SS
NOP();//为保证那个500ns
SpiTransmit(Addr); //传地址低位
SpiTransmit(Addr>>8); //传地址高字节
SpiTransmit(cmd); //传命令
PORTB = PORTB|(1<<DD_SS);//变高SS
NOP();//为保证那个500ns
}
//*************************放音函数**********************
void play(unsigned int addrs)
{
cmdSend(0x0000,0x20);//Power up
delay100ms();//上电延时
cmdSend(addrs,0xe0);//发地址值为addr的Setplay命令
cmdSend(0x0000,0xf0);//发Play命令
}
//************录音函数*******************************
void rec(unsigned int addrs)
{
cmdSend(0x0000,0x20);// 发POWER UP命令;
delay100ms();// 等待TPUD(上电延时);
cmdSend(0x0000,0x20);// 发POWER UP命令
cmdSend(addrs,0xa0);// 发地址值为00的SETREC命令;
cmdSend(0x0000,0xb0);// 发REC命令。
}
//**************停止当前操作函数*****************************
void stop(void)
{
cmdSend(0x0000,0x30);
}
///////////////////////////
void delay(uchar k)
{
unsigned char a,b;
for(a = k;a>0;a--)
for(b = 1;b;b++);
}
////////////////////////
void main()
{unsigned int j = 0;
DDRA = 0xff;
PORTB = PORTB|(1<<DD_SS);//变高SS
// PORTB &= ~BIT(DD_MOSI);//这个没用的?控制不了---在SPI下?
SPI_MasterInit();
delay(255);
rec(0);
PORTA = 0xff;//开始录音,灯亮
for(;j<100;j++)
{
delay(255);
}
stop();
delay(255);
PORTA = 0x00;//停止录音,灯灭
play(0);
} |
|