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

📄 playmgr.c

📁 Procyon方案(手工制作的MP3播放器电路及资料)
💻 C
字号:

//*****************************************************************
//
// File Name	: 'playmgr.c'
// Title			: buffered mp3 play manager
// Author		: Pascal Stang
// Date			: 11/22/2000
// Version		: 0.1
// Target MCU	: ATmega103
// Editor Tabs	: 3
//
//*****************************************************************

#ifndef WIN32
	#include <io.h>
	#include <signal.h>
	#include <interrupt.h>
#endif
#include "global.h"
#include "systimer.h"
#include "spi.h"
#include "sta013.h"

#include "playmgr.h"

// global variables
//cBuffer PlayBuffer;
//volatile u08 PlayMode;

//#define PLAYMGR_MODE_STOP	0x00;
//#define PLAYMGR_MODE_PLAY	0x01;


SIGNAL(SIG_SPI)
{
	// if we're in play mode
//	if(PlayMode == PLAYMGR_MODE_PLAY)
//	if(PlayMode && (PlayBuffer.datalength!=0))

	// if the mp3 decoder wants data
//	if(sta013Demand())
	if(bit_is_set(STA013_DEMAND_PORTIN,STA013_DEMAND_PIN))
	{
		// send next byte over SPI
		outp(PlayBuffer.dataptr[PlayBuffer.dataindex++], SPDR);
		// decrement the data length
		PlayBuffer.datalength--;
		// do buffer looping at size
		//PlayBuffer.dataindex &= (PlayBuffer.size-1);
		if(PlayBuffer.dataindex == PlayBuffer.size)
			PlayBuffer.dataindex = 0;
	}

}

// make sure this interrupt is set up for edge triggerring
SIGNAL(STA013_DEMAND_INTR)
{
	// the mp3 decoder wants data!
	// are we in play mode
//	if(PlayMode && (PlayBuffer.datalength!=0))
	if(PlayMode)
	{
		// send next byte over SPI
		outp(PlayBuffer.dataptr[PlayBuffer.dataindex++], SPDR);
		// decrement the data length
		PlayBuffer.datalength--;
		// do buffer looping at size
		//PlayBuffer.dataindex &= (PlayBuffer.size-1);
		if(PlayBuffer.dataindex == PlayBuffer.size)
			PlayBuffer.dataindex = 0;

	}
}

void playmgrInit(void)
{
	// set up data buffers
	playmgrBuffer(MP3PLAY_BUFFER_ADDR, MP3PLAY_BUFFER_SIZE);

	// set up demand interrupt for edge triggering
	// for ISCX1,ISCX0
	// 0,0	- int on low level
	// 0,1	- reserved
	// 1,0	- int on falling edge
	// 1,1	- int on rising edge

	sbi(EICR, ISC41);
	sbi(EICR, ISC40);

	// enable demand interrupt
	sbi(EIMSK, INT4);

	// enable SPI interrupt
	sbi(SPCR, SPIE);

}

void playmgrBuffer(u16 Buffer, u16 bufferSize)
{
	// set data pointer
	PlayBuffer.dataptr = (unsigned char*)Buffer;
	// set buffer size
	PlayBuffer.size = bufferSize;
	// set play buffer datalength to zero
	PlayBuffer.datalength = 0;
	// set play buffer index to zero
	PlayBuffer.dataindex = 0;

}

void playmgrStart(void)
{
	// set play mode
	PlayMode = PLAYMGR_MODE_PLAY;
	// initiate interrupt-driven sending
	// by sending first byte
	outp(PlayBuffer.dataptr[PlayBuffer.dataindex++], SPDR);
	// decrement the data length
	PlayBuffer.datalength--;
}

void playmgrStop(void)
{
	// set play mode
	PlayMode = PLAYMGR_MODE_STOP;
}

⌨️ 快捷键说明

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