📄 rgbledplay.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 + -