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

📄 main.c

📁 mp3.rar
💻 C
字号:
#include "a2000.h"


#define	P_IOA_Data				(volatile unsigned int *)0x7000
#define	P_IOA_Buffer			(volatile unsigned int *)0x7001
#define P_IOA_Dir				(volatile unsigned int *)0x7002
#define P_IOA_Attrib			(volatile unsigned int *)0x7003
#define P_IOA_Latch				(volatile unsigned int *)0x7004
#define P_IOB_Data				(volatile unsigned int *)0x7005
#define P_IOB_Buffer			(volatile unsigned int *)0x7006
#define P_IOB_Dir				(volatile unsigned int *)0x7007
#define P_IOB_Attrib			(volatile unsigned int *)0x7008

#define P_INT_Ctrl				(volatile unsigned int *)0x7010
#define P_INT_Clear				(volatile unsigned int *)0x7011
#define P_Watchdog_Clear		(volatile unsigned int *)0x7012
#define P_SystemClock			(volatile unsigned int *)0x7013

#define C_IRQ3_KEY				(volatile unsigned int *)0x0080
#define C_IRQ3_EXT1				(volatile unsigned int *)0x0100
#define C_IRQ3_EXT2				(volatile unsigned int *)0x0200

#define P_Watchdog_Clear		(volatile unsigned int *)0x7012

void PlaySnd_Auto(int uiSndIndex);

unsigned int Volume_Index=7,uiSndIndex=0,volume=0xf000;
unsigned int i,j,m=4,n=0,k=0x003f,l=0,h=0,a1=0,a2=0,sum=0;
unsigned int a[10]={0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f};	//a为代码数据数组
unsigned int b[8]={0xffe7,0xffeb,0xffed,0xffee,0xffd7,0xffdb,0xffdd,0xffde};				//b为地址数组
unsigned int c[4]={0x0006,0x005b,0x004f,0x0066};											//c为显示缓冲区数组
unsigned int d[4]={0};											                            //d为数据缓冲区数组
unsigned int e[10]={0,1,2,3,4,5,6,7,8,9};                                                   //e为真实数据数组
//========================================================
//  程序名称:简易mp3播放器的设计
//	端口占用资源:pa口的低八位接led的abcdefg dip
//	              pa口的高八位接数码灯d0d1d2d3d4d5d6d7  	
//	              pb0-pb3接x4-x1
//                pb4,pb5接y1,y2
//========================================================

int main(void)
{
	Init();												//调用初始化端口子程序

	for(uiSndIndex=0;uiSndIndex<4;uiSndIndex++)
	{
		
		PlaySnd_Auto(uiSndIndex);				//调用播放程序,播放第0段语音,采用DAC1播放
												//播放序号的列表在Resource.asm文件的最后的表中定义
		*P_Watchdog_Clear=0x0001;
	}
}

//========================================================
//	语法格式:	void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int 
//
//
//	实现功能:	通过自动方式播放语音资源
//	参数:		1.uiSndIndex:语音资源序号 2.uiDAC_Channel:语音播放通道
//	返回值:	无
//========================================================
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Init(void)
{
	*P_IOA_Dir=0xffff;			//设置IOA口为同相低电平输出
	*P_IOA_Attrib=0xffff;
	*P_IOA_Data=0x0000;
	/////////////////////////////
	*P_IOB_Dir=0xff0f;			//设置IOB口4,5位为带上拉电阻的输入;0-3位为同相高电平输出
	*P_IOB_Attrib=0xff0f;
	*P_IOB_Data=0x00f0;
}


//////////////////////////////////////////////////////////////////////////////////////////////////////

void PlaySnd_Auto(int uiSndIndex)
{


	SACM_A2000_Initial(1);							//初始化语音播放,自动方式
	SACM_A2000_Play(uiSndIndex,1,3);				//播放语音
	while((SACM_A2000_Status() & 0x0001) != 0)		//判断当前是否在播放?返回最低位为1则表示当前在播放
	{
		
			
		SACM_A2000_ServiceLoop();					//服务程序		
		*P_IOB_Data=0xfff0;
		Scan();										//查找判断
		Disp();
		Get_Volume();
		if(n)
		{
			Write_Fun();
		}
		*P_Watchdog_Clear=0x0001;
	}
	SACM_A2000_Stop();								//停止
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

void Volume_Add(void)								//音量加
{
	Volume_Index++;
	if(Volume_Index>15)	Volume_Index=15;
	SACM_A2000_Volume(Volume_Index);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

void Volume_Sub(void)								//音量减
{
	Volume_Index--;
	if(Volume_Index<=0)	Volume_Index=0;
	SACM_A2000_Volume(Volume_Index);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

void Up(void)										//上曲
{
	uiSndIndex--;
	if(uiSndIndex<0) uiSndIndex=3;
	SACM_A2000_Play(uiSndIndex,1,3);
	*P_Watchdog_Clear=0x0001;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

void Down(void)										//下曲
{
	uiSndIndex++;
	if(uiSndIndex>=4) uiSndIndex=0;
	SACM_A2000_Play(uiSndIndex,1,3);
	*P_Watchdog_Clear=0x0001;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

void Scan(void)			
{
	i=*P_IOB_Data;
	if((i | 0xffef) == 0xffef)										//判断是否为上排按健按下
	{
		for(j=0;j<4;j++)											//如果是,判断是哪一纵行
		{
			*P_IOB_Data=b[j];
			if((*P_IOB_Data) == b[j])
			{
				
				k=a[j];
				l=e[j];
				while((*P_IOB_Data | 0xffef) == 0xffef)				//判断按健是否抬起
					*P_Watchdog_Clear=0x0001;
				n=1;												//保留标志位
				break;
			}
		}
	}	
	else if((i | 0xffdf) == 0xffdf)									//判断是否为下排按键按下
	{
		
		for(j=4;j<8;j++)
		{
			*P_IOB_Data=b[j];
			if((*P_IOB_Data) == b[j])
			{
				k=a[j];
				l=e[j];											//保留以后将要执行操作的标志
				while((*P_IOB_Data | 0xffdf) == 0xffdf)
					*P_Watchdog_Clear=0x0001;
				n=1;
				break;
			}
		}
	}
	else
		n=0;														//如果没有按件按下,清标志位
		
	*P_Watchdog_Clear=0x0001;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

void Write_Fun(void)
{
	switch(l)
	{
		case 7:														//标志为7做“音量加”
			Volume_Add();
			break;
		case 6:														//标志为6做“音量减”
			Volume_Sub();								
			break;
		case 5:														//标志为5做“下曲”						
			Down();
			break;
		case 4:														//标志为4做 “上曲”		
			Up();
			break;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
void Disp(void)														//显示操作
{
	*P_IOA_Data=(0x003e|volume);//0xff00
	*P_IOB_Data=0xfff7;
	Delay();
	*P_IOA_Data=(0x0000|volume);
	*P_IOB_Data=0xfffb;
	Delay();
	*P_IOA_Data=(0x003f|volume);
	*P_IOB_Data=0xfffd;
	Delay();
	
	*P_IOA_Data=(c[uiSndIndex]|volume);
	*P_IOB_Data=0xfffe;
	Delay();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
void Delay(void)													//延迟操作
{
	unsigned int uiCount;
	for(uiCount=0;uiCount < 150; uiCount++)
	{
		*P_Watchdog_Clear=0x0001;//清看门狗操作
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
void Get_Volume(void)												//这个还米搞粗来。。。。。。。。。。。。。。。。。。。。。。。。。……
{
	switch(Volume_Index)
	{
		case 0:
			volume=0xff00;
			break;
		case 1:
			volume=0xfe00;
			break;
		case 2:
		    volume=0xfe00;
			break;
		case 3:
			volume=0xfc00;
			break;
		case 4:
			volume=0xfc00;
			break;
		case 5:
			volume=0xf800;
			break;
		case 6:
			volume=0xf800;
			break;
		case 7:
			volume=0xf000;
			break;
		case 8:
			volume=0xf000;
			break;
		case 9:
			volume=0xe000;
			break;
		case 10:
			volume=0xe000;
			break;		
		case 11:
			volume=0xc000;
			break;	
		case 12:
			volume=0xc000;
			break;
		case 13:
			volume=0x8000;
			break;
		case 14:
		    volume=0x8000;
			break;
		case 15:
			volume=0x0000;
			break;
	}
	Delay();
}

⌨️ 快捷键说明

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