四极管: SPI之语音芯片ISD4004驱动

主函数:

四极管:主函数(main.c)

#include<avr/io.h>
#include<ISD4004.c>
#include<KEY.c>


#define uchar  unsigned char
#define uint   unsigned int

void main(void)
{
	uchar i,l;
    DDRB=0XFF;
	DDRD=0XFF;
     while(1)
    {
	   i=key_press();    //检测按钮是否按下
       if(i)
	     {
	      l=key_scan();    //取出按下所得值赋给l
		   switch(l)
	     {
	     case   1:  TYPE(0x01,0X00);break;
		 case   2:   VOCA(0x00,0x90);	break; 
	     case   3:   STOP();break;
         }
	 
       }
	} 
  
}
ISD4004
四极管:ISD4004驱动(ISD4004.C)
/***********************************
 函数功能:ISD4004录放子程序
 函数说明:四线方式,数据输出线:DATA_PORT
          
 使用环境:    硬件: MCU: ATmega32L 
                      F_CPU = 16000000
                      外部:16000000 
 接线方法:3跟数据线:PC6-SS   PC5-MOSI  PC7-SCK			  
 编译环境:WinAVR-20080610	
 
 调用文件:#include<delay_ms.h>
          #include<friend.h>
 使用说明:录好音后直接调用VOCA()即可
 作者:   杨琦
 修改者: 			   	(日期:  )
****************************************************************/
#define SS_SET()  Pc6_1;//拉高SS 
#define SS_CRL()  Pc6_0;//变低SS 
#define MOSI_SET() Pc5_1;
#define MOSI_CRL() Pc5_0;
#define SCK_4002_SET() Pc7_1;
#define SCK_4002_CRL() Pc7_0;

//------------------------------------------


void WRITE(uchar command) //写命令
{
    uchar i;
	SCK_4002_CRL();
	for(i=0;i<8;i++)
	{	 
		if(command & 0x01)  { MOSI_SET();} 
		else{	MOSI_CRL();}
		SCK_4002_SET(); //上升沿数据被锁存在 4002里面
 		command= command >> 1;
		SCK_4002_CRL();	  //下降沿数据被移除
	}
}


void POWRUP(void)  //上电
{
	SS_CRL();
	WRITE(0X20);
	SS_SET();
}

void STOP(void)//停止当前操作
{
	SS_CRL();
	WRITE(0xC0);
	SS_SET();
}

void SETPLAY(uint addrH,uint adrrL)	 //从当前地址开始放音 0
{
	 SS_CRL();
	 WRITE(adrrL);
	 WRITE(addrH);
	 WRITE(0xE0);
	 SS_SET();	
}

void PLAY(void)
{
	 SS_CRL();
	 WRITE(0xF0);
	 SS_SET();
}  

void SETREC(uint addrH,uint adrrL)
{
	 SS_CRL();
	 WRITE(adrrL);
	 WRITE(addrH);
	 WRITE(0XA0);
	 SS_SET();

}

void REC(void) //从当前地址开始录音
{
	SS_CRL();
	WRITE(0xB0);
    SS_SET();
}

void  TYPE(uint addr2,uint adrr1)   //  录音
{
	POWRUP();
	delay_ms(25);
	POWRUP();
	delay_ms(25);
	delay_ms(25);

	SETREC(addr2,adrr1);
	REC();
}

void VOCA(uint addr2,uint adrr1)	//放音
{
	POWRUP();
	delay_ms(25);
	SETPLAY(addr2,adrr1);
	PLAY();
}
 
按键
四极管:按键驱动(KEY.c)
#define uchar unsigned char
#define uint  unsigned int


//******************检验按键按下函数**************

//*************************************************
  uchar  key_press(void)   
{ 
      uchar  j;
       DDRB|=0x0F;
       PORTB|=0x0F;
       
	   DDRB&=0xF0;
   
       j=PINB;
       j=j&0x0F;
       if(j==0x0F)
       {
	   return 0;
	   }
       else
	   {
	   return  1;
	   }
}	 
//**************** 扫描函数******************
   uchar key_scan(void)    
 {
   uchar key;
     //delay_ms(10);  //消抖
    
	if(key_press())
	 {
	   key = PINB;
	   key&=0x0F;
	   switch(key)
	   {
	    case  0x0E:  key = 1; break;
        case  0X0D:  key = 2; break;
		case  0x0B:  key = 3; break;
		case  0x07:  key = 4; break;
		default:
        key = 4;
		
	   }
	 while(key_press());  //等待按键松开的程序  
	 }
	else
	{
	key=4;
	}
 return key;
	   
	 
 }	
 
 
....

转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值