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

📄 mp3.c

📁 mega128+VS1003做的mp3的程序 可以用WINAVR编译
💻 C
字号:
#include <iom64v.h>
#include <macros.h>
#include <string.h>
#include <stdio.h>
#include "../Lcd/lcd.h"
#include "../Keyboard/key.h"
#include "../Ds1302/ds1302.h"


#define  uchar unsigned char
#define  uint  unsigned int

extern uchar keybuf;
struct time_now timebuf;
extern unsigned char const diskinfor[];
void Init_system(void)
{
  uchar temp; 
  //开启外部总线
  MCUCR=0x80;
  XMCRA=0x00;
  //初始化部件
  KEYBUF_NULL;     //键盘初值0 
  Usart_init();    //串口初始化
  DelayIni();	   //延时初始化
  ds1302_init();   //时钟初始化
  outpower_init(); //继电器输出初始化
 // Set_time();
  mp3portIni();    //播放器初始化
 // mp3SineTest();   //测试声音播放
  mp3Reset();      //软件复位	 
  lcd_init();      //LCD初始化
  show_clear();
  show_init("init Vs1003...ok",0,0);
  delay_1s();
  key_init(); 	   //键盘初始化
  show_init("init Keyboard...ok",2,0);
  delay_1s();
  temp = Init_usb();
  if(temp==1){	   //USB控制器初始化
  				   show_init("init Disk...ok",4,0);
				   }
    else {Print_str("Disk error\r\n");
		  show_lcd(0, 0, 192, 6, &diskinfor[0],0);
		  while(1);
	     }				   
  delay_1s();
  test_file_system(); //检查磁盘工作目录
  show_init("Start system ...",6,0);
  delay_1s();
  delay_1s();
  show_clear();
  show_welcom();   
  adjust_cheng(0);
}
/*
*设置时间
*/
void set_system_time(void)
{
  uchar ii;
  uchar temp;
  ii = 0;  //最大是2
  while(1){
  		   show_set_tiem(ii);
		   KEYBUF_NULL;
		   while(keybuf == NULL);
		   
		   if(keybuf == K_UP){
		   			 		  switch(ii){
							    case 0:  temp = timebuf.hour;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.hour&0x0f);
										 (++temp == 24) ? (temp = 0) : 0;
										 timebuf.hour = temp/10;
										 timebuf.hour <<= 4;
										 timebuf.hour += temp%10;
								         break;
							    case 1:  temp = timebuf.min;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.min&0x0f);
										 (++temp == 60) ? (temp = 0) : 0;
										 timebuf.min = temp/10;
										 timebuf.min <<= 4;
										 timebuf.min += temp%10;
								         break;		
							    case 2:  temp = timebuf.sec;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.sec&0x0f);
										 (++temp == 60) ? (temp = 0) : 0;
										 timebuf.sec = temp/10;
										 timebuf.sec <<= 4;
										 timebuf.sec += temp%10;
								         break;			 	 
							    }//switch
		                     }
		   if(keybuf == K_DOWN){
		   			 		  switch(ii){
							    case 0:  temp = timebuf.hour;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.hour&0x0f);
										 (--temp == 255) ? (temp = 23) : 0;
										 timebuf.hour = temp/10;
										 timebuf.hour <<= 4;
										 timebuf.hour += temp%10;
								         break;
							    case 1:  temp = timebuf.min;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.min&0x0f);
										 (--temp == 255) ? (temp = 59) : 0;
										 timebuf.min = temp/10;
										 timebuf.min <<= 4;
										 timebuf.min += temp%10;
								         break;		
							    case 2:  temp = timebuf.sec;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.sec&0x0f);
										 (--temp == 255) ? (temp = 59) : 0;
										 timebuf.sec = temp/10;
										 timebuf.sec <<= 4;
										 timebuf.sec += temp%10;
								         break;			 	 
							    }//switch
		                     }
            if(keybuf == K_RIFT) (++ii == 3) ? (ii = 0) : 0;
            if(keybuf == K_LIFT) (--ii == 255) ? (ii = 2) : 0;									 							 
			if(keybuf == K_ESC)  {Read_InfoDs1302buf();break;}
			if(keybuf == K_ENTER) {Write_InfoDs1302buf();break;}
          }
}
/*
*设置日期
*/
void set_system_date(void)
{
  uchar ii;
  uchar temp;
  ii = 0;  //最大是2
  while(1){
  		   show_set_date(ii);
		   KEYBUF_NULL;
		   while(keybuf == NULL);
		   
		   if(keybuf == K_UP){
		   			 		  switch(ii){
							    case 0:  temp = timebuf.year;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.year&0x0f);
										 (++temp == 100) ? (temp = 0) : 0;
										 timebuf.year = temp/10;
										 timebuf.year <<= 4;
										 timebuf.year += temp%10;
								         break;
							    case 1:  temp = timebuf.month;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.month&0x0f);
										 (++temp == 13) ? (temp = 1) : 0;
										 timebuf.month = temp/10;
										 timebuf.month <<= 4;
										 timebuf.month += temp%10;
								         break;		
							    case 2:  temp = timebuf.date;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.date&0x0f);
										 (++temp == 32) ? (temp = 1) : 0;
										 timebuf.date = temp/10;
										 timebuf.date <<= 4;
										 timebuf.date += temp%10;
								         break;			 	 
							    }//switch
		                     }
		   if(keybuf == K_DOWN){
		   			 		  switch(ii){
							    case 0:  temp = timebuf.year;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.year&0x0f);
										 (--temp == 255) ? (temp = 99) : 0;
										 timebuf.year = temp/10;
										 timebuf.year <<= 4;
										 timebuf.year += temp%10;
								         break;
							    case 1:  temp = timebuf.month;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.month&0x0f);
										 (--temp == 0) ? (temp = 12) : 0;
										 timebuf.month = temp/10;
										 timebuf.month <<= 4;
										 timebuf.month += temp%10;
								         break;		
							    case 2:  temp = timebuf.date;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (timebuf.date&0x0f);
										 (--temp == 0) ? (temp = 31) : 0;
										 timebuf.date = temp/10;
										 timebuf.date <<= 4;
										 timebuf.date += temp%10;
								         break;			 	 
							    }//switch
		                     }
            if(keybuf == K_RIFT) (++ii == 3) ? (ii = 0) : 0;
            if(keybuf == K_LIFT) (--ii == 255) ? (ii = 2) : 0;									 							 
			if(keybuf == K_ESC)  {Read_InfoDs1302buf();break;}
			if(keybuf == K_ENTER) {Write_InfoDs1302buf();break;}
          }
}
/*
*设置星期
*/
void set_system_week(void)
{
  while(1){
  		   show_set_week();
		   KEYBUF_NULL;
		   while(keybuf == NULL);
		   
		   if(keybuf == K_UP)  (++timebuf.week == 8) ? (timebuf.week = 1) : 0;
		   if(keybuf == K_DOWN)(--timebuf.week == 0) ? (timebuf.week = 7) : 0;
		   
			if(keybuf == K_ESC)  {Read_InfoDs1302buf();break;}
			if(keybuf == K_ENTER) {Write_InfoDs1302buf();break;}
          }
}
/*
*设置时间
*/
void set_out_time(struct time *ps, uchar page)
{
  uchar ii;
  uchar temp;
  ii = 0;  //最大是2
  while(1){
  		   show_tiem_out(ps, page,ii);
		   KEYBUF_NULL;
		   while(keybuf == NULL);
		   
		   if(keybuf == K_UP){
		   			 		  switch(ii){
							    case 0:  temp = ps->hour;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (ps->hour&0x0f);
										 (++temp == 24) ? (temp = 0) : 0;
										 ps->hour = temp/10;
										 ps->hour <<= 4;
										 ps->hour += temp%10;
								         break;
							    case 1:  temp = ps->min;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (ps->min&0x0f);
										 (++temp == 60) ? (temp = 0) : 0;
										 ps->min = temp/10;
										 ps->min <<= 4;
										 ps->min += temp%10;
								         break;		
							    case 2:  temp = ps->sec;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (ps->sec&0x0f);
										 (++temp == 60) ? (temp = 0) : 0;
										 ps->sec = temp/10;
										 ps->sec <<= 4;
										 ps->sec += temp%10;
								         break;			 	 
							    }//switch
		                     }
		   if(keybuf == K_DOWN){
		   			 		  switch(ii){
							    case 0:  temp = ps->hour;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (ps->hour&0x0f);
										 (--temp == 255) ? (temp = 23) : 0;
										 ps->hour = temp/10;
										 ps->hour <<= 4;
										 ps->hour += temp%10;
								         break;
							    case 1:  temp = ps->min;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (ps->min&0x0f);
										 (--temp == 255) ? (temp = 59) : 0;
										 ps->min = temp/10;
										 ps->min <<= 4;
										 ps->min += temp%10;
								         break;		
							    case 2:  temp = ps->sec;
								         temp >>= 4;
										 temp &= 0x0f;
										 temp *= 10;
										 temp += (ps->sec&0x0f);
										 (--temp == 255) ? (temp = 59) : 0;
										 ps->sec = temp/10;
										 ps->sec <<= 4;
										 ps->sec += temp%10;
								         break;			 	 
							    }//switch
		                     }
            if(keybuf == K_RIFT) (++ii == 3) ? (ii = 0) : 0;
            if(keybuf == K_LIFT) (--ii == 255) ? (ii = 2) : 0;									 							 
			if(keybuf == K_ESC)  break;
			if(keybuf == K_ENTER) {//根据需要进行一个保护数据动作
					  	 		  break;}
          }
}


void set_system(void)
{
  uchar ii;
  ii = 0;
  show_clear();
  while(1){
  		   show_set_system(ii);
		   KEYBUF_NULL;
		   while(keybuf == NULL);
		   if(keybuf == K_UP){
		   			 		  (--ii == 255) ? (ii = 2) : 0;
		                     }
		   if(keybuf == K_DOWN){
		   			 		  (++ii == 3) ? (ii = 0) : 0;
		                     }							 
		   if(keybuf == K_ESC) break;
		   if(keybuf != K_ENTER) continue;
		   switch(ii){
		   			  case 0: //设置时间
					  	     set_system_time();
					  	     break;
				      case 1: //设置日期
					  	     set_system_date();
					  	     break;
					  case 2: //设置星期
					  	     set_system_week();
					  	     break;
		             }
 			show_clear();					 
          } 
}
void main_menu(void) //主菜单
{
  uchar ii;
  uchar time_out;
  uchar path[10];
  ii = 0;	
  time_out = 0;
  show_clear();	  
  while(1){		  
           show_menu(ii);
		   KEYBUF_NULL;
  		   while(keybuf == NULL){delay_ms(200);	
						         if(++time_out >= 50) return;		   						   
						        }
           time_out = 0;																
		   if(keybuf == K_UP){
		                    if((ii%2) == 0) {
									  	     if(ii != 0) ii -= 2;
							                }
		   		   		       else {if(ii != 1) ii -= 2;
							        }
						    continue;
		                   }
			if(keybuf == K_DOWN){
		                    if((ii%2) == 0) {
									  	     if(ii != 4) ii += 2;
											}
		   		   		       else {if(ii != 5) ii += 2;
							        }
				            continue;
		                   }			   
	        if(keybuf == K_RIFT){
		                    if((ii%2) == 0)  ii += 1;
				            continue;
		                   }
		    if(keybuf == K_LIFT){
		                    if((ii%2) != 0)  ii -= 1;
				            continue;
		                   }				   
			if(keybuf == K_ESC) break;
		    if(keybuf != K_ENTER) continue;
            switch(ii){
			case 0: //编辑播放
				 	 Play_edit_data();
				     show_clear();
			 	  	 break;
			 case 1: //系统设置
			         set_system();
				     show_clear();
			 	  	 break;
			 case 2: //直选播放
			 	     get_sys_path(&path[0]);
					 Print_str("选择工作目录=");
					 Print_str(&path[0]);
					 Print_str("\r\n");
					 if(path[0] == 0x00) {show_clear();break;}
					 adjust_cheng(1);  //手动操作打开MP3通道  
					 Play_xuanzhe(&path[0],0);
					 adjust_cheng(0);  //恢复原来通道
					 show_clear();
			 	  	 break;
			 case 3: //录音开始
			 	  	 Play_record();//创建文件
					 show_clear();
			 	  	 break;
			 case 4: //随机播放
			 	     get_sys_path(&path[0]);
					 Print_str("选择工作目录=");
					 Print_str(&path[0]);
					 Print_str("\r\n");
					 if(path[0] == 0x00) {show_clear();break;}
					 adjust_cheng(1);  //手动操作打开MP3通道
					 Play_audio(&path[0]);
					 adjust_cheng(0);  //恢复原来通道
					 show_clear(); 
			 	  	 break;
			 case 5: //音源切换
			 	  	 Line_in();
					 show_clear();
			 	  	 break;	 		 		 		 		 
			}
		}//while(1);			  					  
  }
void main(void)
{
  uchar ii;
  Init_system();
  while(1){
  KEYBUF_NULL;
  show_status();	   //播放起空闲的状态
  while(1){
    	   Read_InfoDs1302buf(); 
           show_tiem();
		   autoplay(&timebuf);  //自动播放测试playedit.c
		   if(keybuf != NULL) {keybuf = NULL;break;} 
		  }
  main_menu();		  
  }		  
}

⌨️ 快捷键说明

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