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

📄 setting.c

📁 基于stm32的MP3播放器
💻 C
字号:
#include "COMM.h"
//设置功能部分代码
const u8 *Smenu_F1[5]={"时间设置","图片浏览设置","音效管理","屏幕校准","音乐彩灯"};//设置模式下,第一级父目录
const u8 *Smenu_F2[2]={"浏览模式","浏览间隔"};//图片浏览设置
const u8 *Smenu_S1[3]={"手动浏览","顺序浏览","随机浏览"};//图片浏览模式
const u8 *Smenu_S2[6]={"1秒钟","2秒钟","5秒钟","10秒钟","30秒钟","1分钟"};//间隔时间
const u8 *Smenu_S3[3]={"禁止","渐变模式","跳变模式"};//音乐彩灯使能标志

const u8 *Smenu_F3[4]={"音源选择","音效调用","音效保存","VS1003设置"};//音效设置
const u8 *Smenu_S4[3]={"收音机音源","外部音源","MP3音源"};//音源选择
const u8 *Smenu_S5[5]={"音效1","音效2","音效3","音效4","音效5"};//音效列表
					  
const u8 PIC_Time_Table[6]={1,2,5,10,30,60};//延时列表		  
//这两个变量保存在EEPROM的地址为:486 487
u8 PIC_View_Status=0;//图片播放状态 bit6 7:模式;bit0~2 :播放间隔时间 列表 486
u8 MUS_RGB_Status=0; //音乐彩灯使能标志										 487

//音乐彩灯设置
void Set_MUS_RGB(void)
{
	u8 selx=0;	
	MUS_RGB_Status=FM24C16_ReadOneByte(487);//读取彩灯标志		  
	selx=MUS_RGB_Status;
	if(selx>2)selx=0;   	  
	while(1)
	{
		selx=Load_Fun_Sel(Smenu_S3,"音乐彩灯","确定",3,selx);
		if(selx==8)return;//返回
		else 
		{
			MUS_RGB_Status=selx;
			FM24C16_WriteOneByte(487,MUS_RGB_Status);//保存PIC_View_Status到地址486
			return;//设置完之后返回
		}
	}
}	

//图片浏览的相关参数设置
void Set_Pic_View(void)
{
	u8 selx=0;	  
	u8 temp=0;
	PIC_View_Status=FM24C16_ReadOneByte(486);//读取图片模式标志		  			   	  
	while(1)
	{
		selx=Load_Fun_Sel(Smenu_F2,"图片浏览设置","设置",2,temp);
		if(selx==8)return;//返回
		else 
		{	  	 	
			if(selx==0)//模式设置
			{
				temp=PIC_View_Status>>6;//得到浏览模式
				selx=Load_Fun_Sel(Smenu_S1,"浏览模式","确定",3,temp);
				if(selx<3)//得到有效按键
				{
					PIC_View_Status&=0x3f;//高两位复位
					PIC_View_Status|=selx<<6;//得到新值
					FM24C16_WriteOneByte(486,PIC_View_Status);//保存PIC_View_Status到地址486
				}
				temp=0;
			}else//间隔时间设置
			{
				temp=PIC_View_Status&0x07;//得到浏览模式
				selx=Load_Fun_Sel(Smenu_S2,"浏览间隔","确定",6,temp);
				if(selx<6)//得到有效按键
				{
					PIC_View_Status&=0xF8;//后3位复位	  
					PIC_View_Status|=selx;
					FM24C16_WriteOneByte(486,PIC_View_Status);//保存PIC_View_Status到地址486
				}
				temp=1;
			}	    
		}   
	}
}		 
//设置时间.
void Set_Time(void)
{
	u16 tyear;
	u8 key;
	u8 tempdate;//月份日期暂存器
	u8  tmon,tdate,tmin,tsec,thour;
	rtc_get();//更新时间	 
	tyear=timer.w_year;
	tmon=timer.w_month;
	tdate=timer.w_date;
	tmin=timer.min;
	thour=timer.hour;
	tsec=timer.sec;
	//显示GUI界面

	Load_Gui_Bro("确定");
	TFT_Fill(0,42,239,297,WHITE);//填充白色,清空上次的显示
	POINT_COLOR=RED;
	Show_Str(88,2,"时间设定",0x01);//叠加模式,非自动换行
	TFT_Fill(0,42,239,297,WHITE);  //填充白色,清空上次的显示 
	BACK_COLOR=WHITE;//白色背景
	Show_Str(36,120,"时",0x01);  //叠加模式,非自动换行  
	Show_Str(120,120,"分",0x01); //叠加模式,非自动换行
	Show_Str(196,120,"秒",0x01); //叠加模式,非自动换行
	Show_Str(36,184,"年",0x01);  //叠加模式,非自动换行
	Show_Str(120,184,"月",0x01); //叠加模式,非自动换行
	Show_Str(196,184,"日",0x01); //叠加模式,非自动换行
	POINT_COLOR=BROWN;
	TFT_ShowButton(4,142,1);//<
	TFT_ShowButton(4,206,1);//< 
	for(key=0;key<6;key++)
	{
		if(key<3)TFT_ShowButton(60+key*76,142,0);//>
		else TFT_ShowButton(60+(key-3)*76,206,0);//>		
	}
	for(key=0;key<4;key++)
	{
		if(key<2)TFT_ShowButton(96+key*76,142,1);//<
		else TFT_ShowButton(96+(key-2)*76,206,1);//<		
	}
	POINT_COLOR=BLUE;//蓝色字体	
	//更新显示
	TFT_ShowNum(28,210,tyear/100,16,0); //显示年 
	TFT_ShowNum(44,210,tyear%100,16,0);  
	TFT_ShowNum(120,210,tmon,16,0);      //显示月
	TFT_ShowNum(196,210,tdate,16,0);    //显示日
	//显示时分秒					
	TFT_ShowNum(36,146,thour,16,0); 
	TFT_ShowNum(120,146,tmin,16,0);  
	TFT_ShowNum(196,146,tsec,16,0);
	key=0;	
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	while(1)
	{
		if(Pen_Point.Key_Sta==Key_Down||NPEN)key=Touch_To_Num(2);//得到了按键值
		if(key)//有按键按下
		{
			//修正月份天数
			if(Is_Leap_Year(tyear)&&tmon==2)tempdate=mon_table[1]+1;
			else tempdate=mon_table[tmon-1];
			switch(key)
			{
				//设置时间
				case 1:	  
					if(thour)thour--;
					else thour=23;
					break;
				case 2:
					if(thour<23)thour++;
					else thour=0;
					break;
				case 3:
					if(tmin)tmin--;
					else tmin=59;
					break;
				case 4:
					if(tmin<59)tmin++;
					else tmin=0;
					break;
				case 5:	  
					if(tsec)tsec--;
					else tsec=59;
					break;
				case 6:
					if(tsec<59)tsec++;
					else tsec=0;
					break;
				//设置日期
				case 7:
					if(tyear>2000)tyear--;
					else tyear=2050;
					break;
				case 8:
					if(tyear<2050)tyear++;
					else tyear=2000;
					break;			  
				case 9:
					if(tmon>1)tmon--;
					else tmon=12;
					break;	
				case 10:
					if(tmon<12)tmon++;
					else tmon=1;
					break;
				case 11:
					if(tdate>1)tdate--;
					else tdate=tempdate;  
					break;	
				case 12:						   
					if(tdate<tempdate)tdate++;
					else tdate=1;  
					break;	 
				case 13://"确定"按钮按下了
					TFT_CLEAR(BLACK);//清屏,黑色背景
					POINT_COLOR=GRED;//黄色字体	 
					rtc_set(tyear,tmon,tdate,thour,tmin,tsec);
					Show_Str(68,60,"时间修改成功!",0x01);//叠加模式,非自动换行
					delay_ms(1000);//延时
					return;         		 			    
				case 14:return;//"返回"按钮按下了 
			}
			//修正月份.
			if(Is_Leap_Year(tyear)&&tmon==2)tempdate=mon_table[1]-1;
			else tempdate=mon_table[tmon-1];
			//更新显示
			TFT_ShowNum(28,210,tyear/100,16,0); //显示年 
			TFT_ShowNum(44,210,tyear%100,16,0);  
			TFT_ShowNum(120,210,tmon,16,0);      //显示月
			TFT_ShowNum(196,210,tdate,16,0);    //显示日
			//显示时分秒					
			TFT_ShowNum(36,146,thour,16,0); 
			TFT_ShowNum(120,146,tmin,16,0);  
			TFT_ShowNum(196,146,tsec,16,0);
			key=0;//把按键值取消掉
			delay_ms(50);//不让反应速度太快.				  
			Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发  
		}
		delay_ms(1);   
	}	 
}	  

		  
//处理键值
//selx:选中的条目编号 0~5	   
//kind:0,VS1003;1,PT2314
void Pro_Key_EQ(u8 selx,u8 kind)
{	 
	if(Is_In_Area(100,46+32*selx,124,70+32*selx))//减
	{
		if(voltemp[selx]&&(kind==1))voltemp[selx]--;
		else if(vs1003ram[selx]&&(kind==0))vs1003ram[selx]--;
	}else if(Is_In_Area(172,46+32*selx,196,70+32*selx))//加
	{
		if(kind)voltemp[selx]++;  
		else 
		{
			if(vs1003ram[selx]<255)vs1003ram[selx]++;
			if(selx<4&&vs1003ram[selx]>15)vs1003ram[selx]=15; //范围限定
		}
	}	  
}  
//音效下面设置
//sel:选中与否
//num:项目号 0~5
//kind:0,VS1003,1:PT2314
void EQ_Item_Sel(u8 num,u8 sel,u8 kind)
{			   		 						    
	if((num%2)==0)BACK_COLOR=WHITE;//假定没有选中,原背景
	else BACK_COLOR=LGRAY;
		  
	if(sel)BACK_COLOR=BROWN;//棕色背景,选中了			 
	POINT_COLOR=BLACK;      //笔是黑色的	  
	if(kind)//PT2314设置
	{
		if(num==5)
		{
			if(voltemp[num]==0)Show_Str(132,210,"开启",0);
			else Show_Str(132,210,"关闭",0);	 
		}else TFT_ShowNum(140,50+32*num,voltemp[num],16,0x00); 
	}else  //VS1003设置
	{
		if(num<4)TFT_ShowNum(140,50+32*num,vs1003ram[num],16,0x00); 
		else TFT_Show3Num(136,50+32*num,vs1003ram[num],16,0x00);  
	} 
} 
 
//设置VS1003的音效
void Set_Vs1003_EQ(void)
{
	u8 key;
	u8 sel;
	Load_Gui_Set_EQ(0);//装载VS1003界面
	Read_VS_Set();//读取数据
	for(key=0;key<5;key++)
	{
		if(key==sel)EQ_Item_Sel(key,1,0);//更新数据
		else EQ_Item_Sel(key,0,0);//更新数据
	}
	key=0;			 
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	while(1)//等待按键
	{
		if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)key=Touch_To_Num(4);//得到按键值	  
		if(PEN)//按键松开了,状态改变(状态机)
		{
			Pen_Point.Key_LSta=1;	 
			Pen_Point.Key_Sta=Key_Up;
		}   
		if(key)//有按键按下
		{  			   
			Pen_Point.Key_LSta=0;
			switch(key)
			{
				case 1:
				case 2:
				case 3:	
				case 4:   
				case 5:	   			 
					key-=1;					 	  
					if(sel!=key&&key<8)//选中一个
					{								  													 
						EQ_Item_Sel(sel,0,0);
			        	sel=key;//选择这次选择的
						EQ_Item_Sel(sel,1,0); 
					}else if(sel==key)//选择按钮,或者双击
					{
						Pro_Key_EQ(sel,0);//操作数值
						EQ_Item_Sel(sel,1,0);//更新数据 
					}  
					break;  
				case 9://确定按钮按下了		 
					Save_VS_Set();//保存  			 		  	  
				case 10:
					return;//选择了"返回"按钮,返回一个不可能值	  
			}  
			key=0;//取消按键值											    
		}   
		delay_ms(1);	
	} 
}

//音效设置
//返回值:0,退出 1,继续
u8 Option_EQ(void)
{
	u8 selx=0;
	u8 temp=0; 	 
	while(1)
	{
		selx=Load_Fun_Sel(Smenu_F3,"音效管理","选择",4,temp);//进入第一级目录
		if(selx==8)return 1;//返回
		else
		{
			temp=selx;
			switch(selx)
			{
				case 0://音源选择
					selx=Audio_Ch;
					selx=Load_Fun_Sel(Smenu_S4,"音源选择","确定",3,selx-1);//进入第一级目录
					if(selx<3)
					{
						Audio_Ch=selx+1; 
						init_pt2314(Audio_Ch);//设置生效   
						return 0;
					}
					break;  
				case 1://音效调用
				   	selx=INITDSP;
					selx=Load_Fun_Sel(Smenu_S5,"调用音效","确定",5,selx);//进入第一级目录
					if(selx<5)
					{
						INITDSP=selx;
						read_dsp();//读取音效
						init_pt2314(Audio_Ch);//设置生效   
						return 0;	  
					}
					break;		    
				case 2://音效保存	
				   	selx=INITDSP;
					selx=Load_Fun_Sel(Smenu_S5,"保存到音效","确定",5,selx);//进入第一级目录
					if(selx<5)
					{
						INITDSP=selx;
						save_dsp();//保存音效													    
						return 0;	  
					}		    									   	 
					break;
				case 3://VS1003设置	  
					Set_Vs1003_EQ(); 
					break;	 	  
			} 
		}
	}	 	
}	  
//音效设置
void Set_EQ(void)
{	   
	u8 key,sel=0;	  	  
EQRST:	
	read_dsp();//读取音效 	 	 
	Load_Gui_Set_EQ(1);//装载PT2314界面
	for(key=0;key<6;key++)
	{
		if(key==sel)EQ_Item_Sel(key,1,1);//更新数据
		else EQ_Item_Sel(key,0,1);//更新数据
	}
	key=0;			 
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	while(1)//等待按键
	{
		if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)key=Touch_To_Num(4);//得到按键值	  
		if(PEN)//按键松开了,状态改变(状态机)
		{
			Pen_Point.Key_LSta=1;	 
			Pen_Point.Key_Sta=Key_Up;
		}   
		if(key)//有按键按下
		{  			   
			Pen_Point.Key_LSta=0;
			switch(key)
			{
				case 1:
				case 2:
				case 3:	
				case 4:   
				case 5:
				case 6:	  			 
					key-=1;					 	  
					if(sel!=key&&key<8)//选中一个
					{								  													 
						EQ_Item_Sel(sel,0,1);
			        	sel=key;//选择这次选择的
						EQ_Item_Sel(sel,1,1); 
					}else if(sel==key)//选择按钮,或者双击
					{
						Pro_Key_EQ(sel,1);//操作数值
						VOL_Data_Check(sel,&voltemp[sel]);//检查PT2314设置的数据合法性
						EQ_Item_Sel(sel,1,1);//更新数据
						init_pt2314(Audio_Ch);//设置生效
					}  
					break;  
				case 9://选项按钮按下了	 
					Option_EQ();
					goto EQRST; 	 						 		  	  
				case 10:
					FM24C16_WriteOneByte(30,INITDSP);//保存此次DSP值,就是下次开机调用的DSP值
					return;//选择了"返回"按钮,返回一个不可能值	  
			}  
			key=0;//取消按键值											    
		}   
		delay_ms(1);	
	} 
}
//设置模式
void Set_Viewer(void)	  
{					    
	u8 selx=0;	 	 
	while(1)
	{
		selx=Load_Fun_Sel(Smenu_F1,"系统设置","选择",5,selx);
		if(selx==8)return;//返回
		else
		{
			switch(selx)
			{
				case 0://时间设置
					Set_Time();
					break;  
				case 1://图片浏览设置
					Set_Pic_View();
					break;		    
				case 2://音效设置	
					Set_EQ();		    									   	 
					break;
				case 3://屏幕校准
					touch_adjust();
					break;
				case 4://音乐彩灯
					Set_MUS_RGB();
					break;		  
			} 
		}
	}	   
}
























⌨️ 快捷键说明

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