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

📄 rgbledplay.c

📁 基于stm32的MP3播放器
💻 C
字号:
#include "COMM.h"
#define RGB_STATUS_ADDR	484
#define RGB_BKEN_ADDR	485
//#define MAX_Red 100//红色的最大值

const u8 *RGBLEDmenu_F1[5]={"模式选择","间隔时间设置","后台执行","色彩调用","色彩保存"};//第1级父目录目录
const u8 *RGBLEDmenu_S1[3]={"普通模式","渐变模式","跳变模式"};//第1级子目录
const u8 *RGBLEDmenu_S2[8]={"10毫秒","20毫秒","50毫秒","100毫秒","200毫秒","500毫秒","1000毫秒","2500毫秒"};
const u8 *RGBLEDmenu_S3[2]={"禁止","允许"};
const u8 *RGBLEDmenu_S4[8]={"色彩1","色彩2","色彩3","色彩4","色彩5","色彩6","色彩7","色彩8"};	  

const u8 time_table[8]={1,2,5,10,20,50,70,250};

u8 LED_SET_STATUS=0x00;//bit0~2:色彩;bit3~5:延时;bit6,7:模式
u8 BACK_PLAY=0;        //后台执行使能标志
					 	  
u8 LED_STATUS=0x81;//灯的状态 bit0:关闭/开启  bit1:暂停,执行	 默认开启 bit7:是否第一次进入这个函数

//RGB当前颜色寄存器
u8 Cur_RGB_Val[3]={255,125,36};	 
void Smooth_Show(void);//渐变模式

//本程序占用EEPROM地址 460~483 共24个字节
//后面还要占用两个 484存放LED_SET_STATUS 485 存放 BACK_PLAY 
//num:0~7 代表色彩1~8 
void Save_RGB_Info(u8 num)
{				  
	FM24C16_WriteOneByte(460+num*3,Cur_RGB_Val[0]);//保存R
	FM24C16_WriteOneByte(461+num*3,Cur_RGB_Val[1]);//保存G
	FM24C16_WriteOneByte(462+num*3,Cur_RGB_Val[2]);//保存B		 
}
//num:0~7 代表色彩1~8 
void Read_RGB_Info(u8 num)
{		 
	Cur_RGB_Val[0]=FM24C16_ReadOneByte(460+num*3);//读取R
	Cur_RGB_Val[1]=FM24C16_ReadOneByte(461+num*3);//读取G
	Cur_RGB_Val[2]=FM24C16_ReadOneByte(462+num*3);//读取B		 
}
//预览图标,在LCD上的
void Draw_Prev(void)
{
	float ftemp;
	u16 temp,previewcolor;
	ftemp=(float)255/MAX_Red; 
	temp=ftemp*Cur_RGB_Val[0];//得到红色分量  	 
	temp>>=3;
	temp<<=11;	  
	previewcolor=temp;
	temp=Cur_RGB_Val[1];//得到绿色分量	 
	temp>>=2;
	temp<<=5;
	previewcolor+=temp;
	temp=Cur_RGB_Val[2];//得到蓝色分量	  
	previewcolor+=temp>>3;	  
	TFT_Fill(108,44,132,68,previewcolor);//填充预览部分	    
	LED_R=Cur_RGB_Val[0];
	LED_G=Cur_RGB_Val[1];
	LED_B=Cur_RGB_Val[2]; 
}
//rgb值转换到按键值,并更新到显示上
void RGB_TO_KEY(void)
{
	float temp=0;
	u8 t;
	temp=(float)170/MAX_Red;  
	t=temp*Cur_RGB_Val[0];					 
	RGB_Bottom(0,t);  
	temp=(float)170/255;
	t=temp*Cur_RGB_Val[1];
	RGB_Bottom(1,t);  
	t=temp*Cur_RGB_Val[2];
	RGB_Bottom(2,t);  
}
//按键值转换为RGB值,保存在Cur_RGB_Val里面
void KEY_TO_RGB(u8 rgb,u8 keyval)
{
	float temp;	    
	temp=(float)255/170;
	if(!rgb)temp=(float)MAX_Red/170;//红色	 	 
	Cur_RGB_Val[rgb]=temp*keyval;	   
}	 
//把键值兑换成数字	 
u8 RGBLED_Key_To_Num(void)
{					 
	if(Is_In_Area(19,47,53,65))return 1;//暂停按钮被按下     
	else if(Is_In_Area(187,47,221,65))return 2;//开始按钮被按下 			   
	else if(Is_In_Area(0,300,40,319))return 3;//选项按钮被按下
	else if(Is_In_Area(200,300,239,319))return 4;//返回按钮被按下	    
	return 0;//按键无效	   
}
//滑动键值获取
u8 Glide_Key_Val(u8 *area)
{
	if(Is_In_Area(25,93,55,293))*area=0;//红色区域   
	else if(Is_In_Area(105,93,135,293))*area=1;//绿色区域	    												   
	else if(Is_In_Area(185,93,215,293))*area=2; //蓝色区域
	else return 0xff;//按键不在这个区域内
	Pen_Point.Key_LSta=1;//使能下次按键进入

	if(Pen_Point.Y>278)return 0;
	else if(Pen_Point.Y<108)return 170;
	return 278-Pen_Point.Y;//返回0~170的值
}	 
//LED相关参数的设置
void RGBLED_Set(void)
{
	u8 selx=0;	 
	u8 temp=0;
	while(1)
	{
		selx=Load_Fun_Sel(RGBLEDmenu_F1,"彩灯设置","确定",5,temp);
		temp=selx;
		if(selx==8)return;//返回
		else
		{
			switch(selx)
			{
				case 0://模式设置
					selx=Load_Fun_Sel(RGBLEDmenu_S1,RGBLEDmenu_F1[0],"确定",3,(LED_SET_STATUS>>6)&0X03);
					if(selx<3)
					{
						LED_SET_STATUS&=0X3F;//清空上次数值
						LED_SET_STATUS|=selx<<6; 
						FM24C16_WriteOneByte(RGB_STATUS_ADDR,LED_SET_STATUS);//保存模式
						return;
					}
					break;
				case 1://间隔时间设置
					selx=(LED_SET_STATUS>>3)&0x07;	  	   									 
					selx=Load_Fun_Sel(RGBLEDmenu_S2,RGBLEDmenu_F1[1],"确定",8,selx);
					if(selx<8)
					{
						LED_SET_STATUS&=0xC7;//清空上次数值
						LED_SET_STATUS|=selx<<3;//0~5,搜索级别
						FM24C16_WriteOneByte(RGB_STATUS_ADDR,LED_SET_STATUS);//保存时间间隔	 
						return;
					}
					break;
				case 2://后台播放设置		    
					selx=Load_Fun_Sel(RGBLEDmenu_S3,RGBLEDmenu_F1[2],"确定",2,BACK_PLAY);	 
					if(selx<2)
					{			    
						BACK_PLAY=selx;
						FM24C16_WriteOneByte(RGB_BKEN_ADDR,BACK_PLAY);//保存背景播放	 
						return;
					}
					break;
				case 3://效果调用	  
					selx=LED_SET_STATUS&0x07;	  	   									 
					selx=Load_Fun_Sel(RGBLEDmenu_S4,RGBLEDmenu_F1[3],"确定",8,selx); 
					if(selx<8)
					{
						LED_SET_STATUS&=0xF8;//清空上次数值
						LED_SET_STATUS|=selx; 
						Read_RGB_Info(selx); //从EEPROM读取信息	   
						return;
					}
					break;
				case 4://效果保存	  
					selx=LED_SET_STATUS&0x07;	  	   									 
					selx=Load_Fun_Sel(RGBLEDmenu_S4,RGBLEDmenu_F1[4],"确定",8,selx); 
					if(selx<8)
					{
						LED_SET_STATUS&=0xF8;//清空上次数值
						LED_SET_STATUS|=selx; 
						FM24C16_WriteOneByte(RGB_STATUS_ADDR,LED_SET_STATUS);//保存效果	
						Save_RGB_Info(selx);//保存信息到EEPROM 
						return;
					}
					break;
			} 
		}
	}	   
}
//暂停,开启,按钮显示
//包括使能输出的控制
void On_Off_Show(void)
{
	u8 temp=(LED_SET_STATUS>>6)&0X03;
	POINT_COLOR=BLUE;
	BACK_COLOR=WHITE;
	if(temp==0)Show_Str_Mid(0,22,"普通模式",0x00,240); //叠加模式,非自动换
	else if(temp==1)Show_Str_Mid(0,22,"渐变模式",0x00,240); //叠加模式,非自动换
	else Show_Str_Mid(0,22,"跳变模式",0x00,240); //叠加模式,非自动换

	POINT_COLOR=BLACK;
	BACK_COLOR=GRAY;
    if(LED_STATUS&0x02)Show_Str(20,48,"运行",0x00);//叠加模式,非自动换行   
	else Show_Str(20,48,"暂停",0x00);  
    if(LED_STATUS&0x01)Show_Str(188,48,"关闭",0x00);  
 	else Show_Str(188,48,"开启",0x00); 
	ENRGB(LED_STATUS&0x01);	 
} 

//返回得到的按键值
//返回0,则代表按下了退出按键
//返回1,代表按下了其他按键
u8 LED_Key_Pro(void)
{
	u8 key;	 
	u8 RGBKEY; 

	key=0; 
	if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)key=Touch_Key_Pro(1);//得到按键值	  
	if(PEN)//按键松开了,状态改变(状态机)
	{
		Pen_Point.Key_LSta=1;	 
		Pen_Point.Key_Sta=Key_Up;
	}   
	if(key&CLICK_POINT) //有单点按键按下
	{  	 
		Pen_Point.Key_LSta=0;	
		key=RGBLED_Key_To_Num();   
		switch(key)
		{
			case 1://暂停
				if(((LED_SET_STATUS>>6)&0x03)==0x00)break;//对普通模式,不存在暂停
				if(LED_STATUS&0x02)LED_STATUS&=0xFD;//取反
				else LED_STATUS|=0x02; 
				On_Off_Show();			 
				break;
			case 2://启动按钮
				if(LED_STATUS&0x01)LED_STATUS&=0xFE;//取反
				else LED_STATUS|=0x01; 
				On_Off_Show();	
				break;							   
			case 3://选项
				RGBLED_Set();
				Load_Gui_RGBLED();	

				RGB_TO_KEY();//把RGB值转换为按键值显示
				On_Off_Show();
				Draw_Prev();//更新预览	  								  	   	  
				break;
			case 4://返回按钮按下了	
				if(!BACK_PLAY)ENRGB(0);//不准后台运行		   			 
				return 0;//退出		  	 
		}
		if(!key)//对无效按键要检查是不是按在滑动区域里面
		{
			key=Glide_Key_Val(&RGBKEY);//得到0~170的键值
			if(key!=0xff)
			{
				RGB_Bottom(RGBKEY,key);  
				KEY_TO_RGB(RGBKEY,key);//把RGB值更新到RGB寄存器里面
				Draw_Prev();//更新预览								   
			}
		}		  	 
	}
	return 1;
}
//在渐变模式下使用  
//延时控制,包括键值处理.
//返回0,退出
//返回1,继续    
u8 delay_time(u8 rgb)
{  	  				 
    u8 t=0;  
	u8 dtime; 
	float ftemp;
	if(rgb<3)//正常的
	{	 
		if(rgb)ftemp=(float)170/255;  //变换把0~255变换到0~170 
		else ftemp=(float)170/MAX_Red;//变换把0~MAX_Red变换到0~170  
	
		ftemp*=Cur_RGB_Val[rgb]; 
		RGB_Bottom(rgb,(u8)ftemp);//更新到按键 
	}			    
	dtime=(LED_SET_STATUS>>3)&0x07;  			 
    for(t=0;t<time_table[dtime];)//延时控制
    {	    
  		if(!LED_Key_Pro())return 0;	
        if((LED_STATUS&0x02)==0)t++;//没有暂停 	  
		delay_ms(10);
    }  				 
	Draw_Prev();
    return 1;//成功操作,继续
}

//跳变显示
void Jump_Show(void)
{
	u8 t=0;
	while(1)
	{
		Read_RGB_Info(t);
		t++;
		if(t>7)t=0;//循环显示八个色彩	    
	  	if(!delay_time(3))return;//延时处理	  
		if(((LED_SET_STATUS>>6)&0x03)!=2)return;//选择了其他模式    
		RGB_TO_KEY();//更新到按键上
	}	
}

//颜色列表   
const u8 colour[18][3]={
{MAX_Red,0,0},{MAX_Red,190,204},{MAX_Red,70,0},{118,255,241},{114,255,255},{MAX_Red,255,0},
{MAX_Red,98,0},{61,42,42},{90,144,144},{0,0,255},{11,23,112},{63,204,237},
{0,255,255},{0,255,0},{0,200,88},{22,139,88},{77,33,241},{105,163,223},
};	  
//渐变显示									  
void Smooth_Show(void)
{ 
    u8 nextred,nextgreen,nextblue;    
    u8 i;  
    Cur_RGB_Val[0]=Cur_RGB_Val[1]=Cur_RGB_Val[2]=0;//全部清掉 
	while(1)
	{   
		for( i=0;i<18;i++)//遍历十八种颜色
		{
			Cur_RGB_Val[0]=colour[i][0];
			Cur_RGB_Val[1]=colour[i][1];
			Cur_RGB_Val[2]=colour[i][2];  
			if(i==17)
			{
				nextred=colour[0][0];
				nextgreen=colour[0][1];
				nextblue=colour[0][2];  
			}else 
			{  
				nextred=colour[i+1][0];
				nextgreen=colour[i+1][1];
				nextblue=colour[i+1][2];   
			} 
			while(Cur_RGB_Val[0]!=nextred)//红色逼近
			{ 
				if (Cur_RGB_Val[0]<nextred) Cur_RGB_Val[0]++;
				else Cur_RGB_Val[0]--; 		    
				if(!delay_time(0))return;
				if(((LED_SET_STATUS>>6)&0x03)!=1)return;//选择了其他模式    
			}  
			while(Cur_RGB_Val[1]!=nextgreen)//绿色逼近
			{ 
				if (Cur_RGB_Val[1]<nextgreen) Cur_RGB_Val[1]++;
				else Cur_RGB_Val[1]--;	  
				if(!delay_time(1))return;
				if(((LED_SET_STATUS>>6)&0x03)!=1)return;//选择了其他模式
			}
			while(Cur_RGB_Val[2]!=nextblue)//蓝色逼近
			{
				if (Cur_RGB_Val[2]<nextblue) Cur_RGB_Val[2]++;
				else Cur_RGB_Val[2]--;	  
				if(!delay_time(2))return;
				if(((LED_SET_STATUS>>6)&0x03)!=1)return;//选择了其他模式
			}
		} 
	} 
}  
//LED 模式控制
//返回0,则退出;
//返回1,则继续 
u8 Mode_Control(void)
{
	u8 temp;
	temp=(LED_SET_STATUS>>6)&0x03;
	switch(temp)
	{
		case 0://普通模式
			break;
		case 1://渐变模式
			Smooth_Show();
			if(((LED_SET_STATUS>>6)&0x03)==1)return 0;//退出
			break;
		case 2://跳变模式
			Jump_Show();						  
			if(((LED_SET_STATUS>>6)&0x03)==2)return 0;//退出	 
			break;
		case 4:
			break;
	}
	return 1;
}
//彩灯控制主程序
void RGBLED_Play(void)
{  				  	    		  	 	  
	Load_Gui_RGBLED();													  
	LED_SET_STATUS=FM24C16_ReadOneByte(RGB_STATUS_ADDR);//读取状态
	if(LED_SET_STATUS>0XBF)//未初始化
	{	//初始化
		LED_SET_STATUS=0X00;
		BACK_PLAY=0;
		FM24C16_WriteOneByte(RGB_STATUS_ADDR,LED_SET_STATUS);//保存效果	 
		FM24C16_WriteOneByte(RGB_BKEN_ADDR,BACK_PLAY);//保存背景播放	 	 
	}else BACK_PLAY=FM24C16_ReadOneByte(RGB_BKEN_ADDR);//读取背景播放 	
	
	if(LED_STATUS&0x80)//检查是不是开机后第一次进入这个函数
	{
		LED_STATUS&=0x7F;//去掉标志位
		Read_RGB_Info(LED_SET_STATUS&0x07);//读取上次的色彩
	}
	RGB_TO_KEY();//把RGB值转换为按键值显示
	On_Off_Show();	
	Draw_Prev();//更新预览	     												 	   			 
	while(1)
	{   
		if(!Mode_Control())return; 
		else
		{
			On_Off_Show();	
			Draw_Prev();//更新预览	 
		}
		if(!LED_Key_Pro())return; 	      
	}
}


				   







⌨️ 快捷键说明

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