📄 main.c
字号:
#include <iom8v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include "init.h"
#include "SD.h"
#include "FAT.h"
void send_string(uchar *word,uchar enter)
{
while(*word!=0)
{
while(!(UCSRA&0x20));
UDR=*word;
word++;
}
if(enter)
{
while(!(UCSRA&0x20));
UDR=0x0d;
while(!(UCSRA&0x20));
UDR=0x0a;
}
}
void send_char(uchar dat,uchar enter)
{
while(!(UCSRA&0x20));
UDR=dat;
if(enter)
{
while(!(UCSRA&0x20));
UDR=0x0d;
while(!(UCSRA&0x20));
UDR=0x0a;
}
}
void main(void)
{
uchar i,sd_buff[512],sub[2],adv[3];
uint w;
wait(60000);
init();
i=sd_init();
if(i==0)
{
i=GetFATInfo(sd_buff);
if(i==0)
{
w=TotalSectors*512/1024/1024;
send_string("System of FAT16",1);
send_string("The Size is ",0);
i=w/1000;
if(i)send_char(i+0x30,0);
send_char((w%1000)/100+0x30,0);
send_char((w%100)/10+0x30,0);
send_char((w%10)+0x30,0);
send_char('M',1);
}
else if(i==1)
{
send_string("It is not FAT16!",1);
}
}
else
{
while(!(UCSRA&0x20));
UDR=i;
}
while(1)
{
if(RS232>1)
{
RStime=0;
RS232=0;
if(RsNum==buff232[0])
{
if(buff232[1]==0)
{
i=sd_read_block(buff232[2],sd_buff);
if(!i)
{
for(w=0;w<512;w++)
{
while(!(UCSRA&0x20));
UDR=sd_buff[w];
}
}
else
{
while(!(UCSRA&0x20));
UDR=i;
}
}
else if(buff232[1]==1)
{ /* seek file */
i=SeekFile(sd_buff);
if(i==0)
{
i=PlayMP3(sd_buff);
}
else
{
send_string("Can't find MP3 files!",1);
}
}
/* seek advert */
/*
else if(buff232[1]==2)
{
sub[0]=buff232[2];
sub[1]=buff232[3];
adv[0]=buff232[4];
adv[1]=buff232[5];
adv[2]=buff232[6];
i=SeekAdvert(sd_buff,sub,adv);
if(i==0)
{
i=PlayMP3(sd_buff);
}
else
{
send_string("Can't find advert files!",1);
}
}
*/
}
}
}
}
void init(void)
{
DDRD |= (BIT(sta)|BIT(TXD));
DDRD &= ~BIT(RXD);
PORTD |= (BIT(TXD)|BIT(RXD));
//
TCCR1B=2; /* TMR1:8分频 */
TIMSK=4;
UBRRH=0;
UBRRL=51; /* 9600bit/s */
UCSRC=0x8e;
UCSRB=0x98; /* 允许发送和接收,其中接收启动中断 */
SREG=0x80;
}
/*----------------------------------------------------------*/
/* Timer1中断(10ms) */
void Timer1(void)
{
TCNT1H=0xec;
TCNT1L=0x78;
/* */
sec++;
if(sec>50)
{
sec=0;
PORTD ^= BIT(sta);
}
/**/
if(RStime)
{ /* 处理232干扰 */
RStime++;
if(RStime>2)
{
RStime=0;
RS232=0;
}
}
/**/
TIFR=4;
}
/*----------------------------------------------------------*/
/* 串口子程序 */
void Rece_232(void)
{
uchar d;
d=UDR;
if(d==0x7e)
{
if(RS232<2)
{
RS232++;
if(RS232==1)
{ /* 启动接收 */
RsNum=0;
Runsave=0;
}
}
}
else
{
if(RS232==1)
{ /* 接收数据 */
if(d==0x1b)
{
Runsave=1;
}
else
{
if(Runsave)
{
Runsave=0;
d=d^0x1b;
}
buff232[RsNum]=d;
RsNum++;
if(RsNum>59)RsNum=0;
}
}
}
RStime=1;
}
/*----------------------------------------------------------*/
void wait(uint t)
{
while(--t);
}
/*----------------------------------------------------------*/
/* 播放MP3 */
/* 播放正常完成返回0,否则返回其它数 */
uchar PlayMP3(uchar *data)
{ /* 播放MP3文件 */
uchar i,v,d,*p,over;
uint w;
over=0;
while(!over)
{
for(i=0;i<SecPerClus;i++)
{
d=sd_read_block(DATASectors+((ulong)StartClus-2)*SecPerClus+i,data);
if(d!=0)return(d);
w=0;
p=data;
while(w<512)
{ /* 512Byte分为16次给VS1001K */
for(v=0;v<32;v++)
{
d=*p;
p++;
send_char(d,0);
FileLength--;
if(FileLength==0)
{ /* 歌曲结束 */
over=1;
break;
}
}
w+=32;
}
if(over)break;
}
if(!over)
{ /* 取下一簇 */
d=sd_read_block(FATSectors+StartClus/256,data);
if(d!=0)return(d);
p=data;
p=p+(StartClus%256)*2;
StartClus=*p++;
StartClus+=((uint)*p)<<8;
if(StartClus==0xffff)over=1;
}
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -