|
发表于 2018-6-21 11:14:44
|
显示全部楼层
本帖最后由 zjk 于 2018-6-21 11:19 编辑
下载了,不知道为什么无法添加附件,
我直接复制代码贴出来吧,你的这个下载链接里只有ML22420.c和ML22420.h这两个文件,另外问下如何阿莫上怎么上传附件。
ML22420.c的
#include<PIC18F87K90.h>
#include<PIC18.h>
#include<stdio.h>
#include "../inc/type.h"
#include "../inc/common.h"
#include "../inc/ML22420.h"
#include "../inc/soft_timer.h"
void MUSIC_CH0(void);
void MUSIC_CH1(void);
void MUSIC_CH2(void);
void MUSIC_CH3(void);
void (const *MUSIC_DONE[8])(void) =
{
MUSIC_CH0,
MUSIC_CH1,
MUSIC_CH2,
MUSIC_CH3
};
UINT8 ML22420_TransferByte(UINT8 data)
{
UINT8 i,temp = 0;
ML22420_CSB = 0; //打开片选
while(ML22420_BUSY == 0); //判忙
for(i = 0;i < 8;i++)
{
ML22420_SCK = 0;
NOP();NOP();
if((data & 0x80) > 0)
ML22420_MOSI = 1;
else
ML22420_MOSI = 0;
NOP();NOP();
data = data<<1;
ML22420_SCK = 1;
NOP();NOP();
temp = temp << 1;
temp = temp + ML22420_MISO;
}
ML22420_CSB = 1; //关闭片选
return temp;
}
/*
* 上电
*/
void ML22420_PUP(void)
{
ML22420_TransferByte(0x00);
}
/*
* 断电
*/
void ML22420_PDWN(void)
{
ML22420_TransferByte(0x20);
}
/*
* 读取状态
*/
UINT8 ML22420_RDSTAT(UINT8 BitChnum)
{
UINT8 temp;
ML22420_TransferByte(0xB0);
temp = ML22420_TransferByte(0xFF);
return (temp & BitChnum);
}
/*
*
*/
void ML22420_AMODE(void)
{
ML22420_TransferByte(0x04);
ML22420_TransferByte(0xC7);
}
/*
* PLAY命令用来指定播放的语音段号并开始播放
*/
void ML22420_PLAY(UINT8 chnum,UINT16 segnum)
{
UINT8 i=100,temp;
while(i--)
{
temp = ML22420_RDSTAT(1 << chnum);
if(temp > 0)
break;
if(i == 0)
return;
}
temp = (segnum & 0x0c00)>>8;
chnum |= 0x40;
chnum |= temp;
ML22420_TransferByte(chnum); //send first byte
ML22420_TransferByte(segnum); //send second byte
}
/*
* STOP命令用于停止播放
*/
void ML22420_STOP(UINT8 chnum)
{
chnum = 1 << chnum;
chnum |= 0x60;
ML22420_TransferByte(chnum);
}
/*
* SLOOP命令用于设定循环播放的模式。可指定每个通道
*/
void ML22420_SLOOP(UINT8 chnum)
{
UINT8 i = 100,temp;
chnum = 1 << chnum;
while(i--)
{
temp = ML22420_RDSTAT(chnum);
if(temp > 0)
break;
if(i == 0)
return;
}
chnum |= 0x80;
ML22420_TransferByte(chnum);
}
/*
* CLOOP命令用于解除循环播放模式
*/
void ML22420_CLOOP(UINT8 chnum)
{
chnum = 1 << chnum;
chnum |= 0x90;
ML22420_TransferByte(chnum);
}
/*
* CVOL是2字节的命令,用于设定各通道的播放音量
*/
void ML22420_CVOL(UINT8 chnum,UINT16 cvolnum)
{
chnum = 1 << chnum;
if((cvolnum > 0x1f)||(chnum > 0x0F))
return;
chnum = 0xA0 | (chnum & 0x0f);
cvolnum = cvolnum & 0x1f;
ML22420_TransferByte(chnum); //send first byte
ML22420_TransferByte(cvolnum); //send second byte
}
/*
* AVOL是2字节的命令,用于设定内置放大器的音量
*/
void ML22420_AVOL(UINT16 avolnum)
{
if(avolnum > 0x3f)
return;
avolnum = avolnum & 0x3f;
ML22420_TransferByte(0x08); //send first byte
ML22420_TransferByte(avolnum); //send second byte
}
/*
* APP--停止所有通道
*/
void ML22420_STOP_ALL_PLAY(void)
{
UINT8 i;
for(i=0;i<4;i++)
ML22420_STOP(i);
}
/*
* APP--设备初始化,
* 注意:当三个通道以上同时循环播放,解除循环播放命令就失效
*/
void ML22420_APP_INIT(void)
{
ML22420_PUP();
ML22420_STOP_ALL_PLAY();
ML22420_AMODE();
ML22420_CVOL(0,0x01);
ML22420_CVOL(1,0x01);
ML22420_CVOL(2,0x01);
ML22420_CVOL(3,0x01);
ML22420_AVOL(0x30);
}
void MUSIC_CH0(void)
{
switch(MUSIC_CMD.CMD)
{
case MUSIC_PLAY_CMD:
if(MUSIC_CMD.SEG == 0)
ML22420_PLAY(0,MUSIC_BACK_SEG);
else if(MUSIC_CMD.SEG == 1)
ML22420_PLAY(0,MUSIC_ERR_SEG);
break;
case MUSIC_SLOOP_CMD:
ML22420_SLOOP(0);
break;
case MUSIC_STOP_CMD:
ML22420_STOP(0);
break;
case MUSIC_CVOL_CMD:
ML22420_CVOL(0,0x05);
break;
default:break;
}
}
void MUSIC_CH1(void)
{
switch(MUSIC_CMD.CMD)
{
case MUSIC_PLAY_CMD:
if(MUSIC_CMD.SEG == 0)
ML22420_PLAY(1,MUSIC_SMALL_WHEEL_SEG);
else if(MUSIC_CMD.SEG == 1)
ML22420_PLAY(1,MUSIC_BIG_WHEEL_SEG);
else if(MUSIC_CMD.SEG == 2)
ML22420_PLAY(1,MUSIC_WIN_SEG);
else
{
ML22420_PLAY(1,MUSIC_START_SEG);
StartTimerOfList(&MUSIC_RUN_A,500);
}
break;
case MUSIC_SLOOP_CMD:
ML22420_SLOOP(1);
break;
case MUSIC_STOP_CMD:
ML22420_STOP(1);
break;
case MUSIC_CVOL_CMD:
ML22420_CVOL(1,0x05);
break;
default:break;
}
}
void MUSIC_CH2(void)
{
switch(MUSIC_CMD.CMD)
{
case MUSIC_PLAY_CMD:
if(MUSIC_CMD.SEG == 0)
ML22420_PLAY(2,MUSIC_SMALL_WHEEL_SEG);
else if(MUSIC_CMD.SEG == 1)
ML22420_PLAY(2,MUSIC_BIG_WHEEL_SEG);
else if(MUSIC_CMD.SEG == 2)
ML22420_PLAY(2,MUSIC_WIN_SEG);
else
{
ML22420_PLAY(2,MUSIC_START_SEG);
StartTimerOfList(&MUSIC_RUN_B,500);
}
break;
case MUSIC_SLOOP_CMD:
ML22420_SLOOP(2);
break;
case MUSIC_STOP_CMD:
ML22420_STOP(2);
break;
case MUSIC_CVOL_CMD:
ML22420_CVOL(2,0x05);
break;
default:break;
}
}
void MUSIC_CH3(void)
{
switch(MUSIC_CMD.CMD)
{
case MUSIC_PLAY_CMD:
if(MUSIC_CMD.SEG == 0)
{
ML22420_STOP(3);
ML22420_PLAY(3,MUSIC_HIT_SEG);
}
else if(MUSIC_CMD.SEG == 1)
ML22420_PLAY(3,MUSIC_INCOIN_SEG);
break;
case MUSIC_SLOOP_CMD:
ML22420_SLOOP(3);
break;
case MUSIC_STOP_CMD:
ML22420_STOP(3);
break;
case MUSIC_CVOL_CMD:
ML22420_CVOL(3,0x05);
break;
default:break;
}
}
ML22420.h的
#ifndef __ML22420_H__
#define __ML22420_H__
#define ML22420_CSB LATCbits.LATC5
#define ML22420_BUSY PORTAbits.RA4
#define ML22420_SCK LATCbits.LATC0
#define ML22420_MOSI LATCbits.LATC2
#define ML22420_MISO PORTCbits.RC1
extern void ML22420_APP_INIT(void);
extern void ML22420_STOP_ALL_PLAY(void);
extern void ML22420_SLOOP_PLAY(UINT8 chnum,UINT16 segnum);
extern void ML22420_CLOOP(UINT8 chnum);
extern UINT8 ML22420_RDSTAT(UINT8 BitChnum);
extern void ML22420_PLAY(UINT8 chnum,UINT16 segnum);
extern void ML22420_STOP(UINT8 chnum);
extern void ML22420_FADR(UINT8 chnum,UINT16 segnum);
extern void ML22420_START(UINT8 chnum);
extern void (const *MUSIC_DONE[8])(void);
#endif |
|