?? rgbledplay.c
字號:
#include "COMM.h"
//彩燈控制部分代碼
//正點原子@SCUT
//V1.0
#define RGB_STATUS_ADDR 484
#define RGB_BKEN_ADDR 485
//#define MAX_Red 100//紅色的最大值
const u8 *RGBLEDmenu_F1[5]={"模式選擇","間隔時間設(shè)置","后臺執(zhí)行","色彩調(diào)用","色彩保存"};//第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; //后臺執(zhí)行使能標(biāo)志
u8 LED_STATUS=0x81;//燈的狀態(tài) bit0:關(guān)閉/開啟 bit1:暫停,執(zhí)行 默認開啟 bit7:是否第一次進入這個函數(shù)
//RGB當(dāng)前顏色寄存器
u8 Cur_RGB_Val[3]={255,125,36};
void Smooth_Show(void);//漸變模式
//本程序占用EEPROM地址 460~483 共24個字節(jié)
//后面還要占用兩個 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
}
//預(yù)覽圖標(biāo),在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);//填充預(yù)覽部分
LED_R=Cur_RGB_Val[0];
LED_G=Cur_RGB_Val[1];
LED_B=Cur_RGB_Val[2];
}
//rgb值轉(zhuǎn)換到按鍵值,并更新到顯示上
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);
}
//按鍵值轉(zhuǎn)換為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;
}
//把鍵值兌換成數(shù)字
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;//紅色區(qū)域
else if(Is_In_Area(105,93,135,293))*area=1;//綠色區(qū)域
else if(Is_In_Area(185,93,215,293))*area=2; //藍色區(qū)域
else return 0xff;//按鍵不在這個區(qū)域內(nèi)
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相關(guān)參數(shù)的設(shè)置
void RGBLED_Set(void)
{
u8 selx=0;
u8 temp=0;
while(1)
{
selx=Load_Fun_Sel(RGBLEDmenu_F1,"彩燈設(shè)置","確定",5,temp);
temp=selx;
if(selx==8)return;//返回
else
{
switch(selx)
{
case 0://模式設(shè)置
selx=Load_Fun_Sel(RGBLEDmenu_S1,RGBLEDmenu_F1[0],"確定",3,(LED_SET_STATUS>>6)&0X03);
if(selx<3)
{
LED_SET_STATUS&=0X3F;//清空上次數(shù)值
LED_SET_STATUS|=selx<<6;
FM24C16_WriteOneByte(RGB_STATUS_ADDR,LED_SET_STATUS);//保存模式
return;
}
break;
case 1://間隔時間設(shè)置
selx=(LED_SET_STATUS>>3)&0x07;
selx=Load_Fun_Sel(RGBLEDmenu_S2,RGBLEDmenu_F1[1],"確定",8,selx);
if(selx<8)
{
LED_SET_STATUS&=0xC7;//清空上次數(shù)值
LED_SET_STATUS|=selx<<3;//0~5,搜索級別
FM24C16_WriteOneByte(RGB_STATUS_ADDR,LED_SET_STATUS);//保存時間間隔
return;
}
break;
case 2://后臺播放設(shè)置
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://效果調(diào)用
selx=LED_SET_STATUS&0x07;
selx=Load_Fun_Sel(RGBLEDmenu_S4,RGBLEDmenu_F1[3],"確定",8,selx);
if(selx<8)
{
LED_SET_STATUS&=0xF8;//清空上次數(shù)值
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;//清空上次數(shù)值
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,"關(guān)閉",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)//按鍵松開了,狀態(tài)改變(狀態(tài)機)
{
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值轉(zhuǎn)換為按鍵值顯示
On_Off_Show();
Draw_Prev();//更新預(yù)覽
break;
case 4://返回按鈕按下了
if(!BACK_PLAY)ENRGB(0);//不準(zhǔn)后臺運行
return 0;//退出
}
if(!key)//對無效按鍵要檢查是不是按在滑動區(qū)域里面
{
key=Glide_Key_Val(&RGBKEY);//得到0~170的鍵值
if(key!=0xff)
{
RGB_Bottom(RGBKEY,key);
KEY_TO_RGB(RGBKEY,key);//把RGB值更新到RGB寄存器里面
Draw_Prev();//更新預(yù)覽
}
}
}
return 1;
}
//在漸變模式下使用
//延時控制,包括鍵值處理.
//返回0,退出
//返回1,繼續(xù)
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++;//沒有暫停
if(rgb)delay_ms(10);
else delay_ms(25);//對紅燈做延時補償 針對MAX_Red=100的時候
}
Draw_Prev();
return 1;//成功操作,繼續(xù)
}
//跳變顯示
void Jump_Show(void)
{
u8 t=0;
while(1)
{
Read_RGB_Info(t);
t++;
if(t>7)t=0;//循環(huán)顯示八個色彩
if(!delay_time(3))return;//延時處理
if(((LED_SET_STATUS>>6)&0x03)!=2)return;//選擇了其他模式
RGB_TO_KEY();//更新到按鍵上
}
}
//顏色列表 0對應(yīng)滅,255對應(yīng)最亮
const u8 colour[18][3]={
{MAX_Red,0,0},{MAX_Red,190,204},{MAX_Red,69,0},{98*((float)MAX_Red/100),255,241},{94*((float)MAX_Red/100),255,255},{MAX_Red,255,0},
{MAX_Red,97,0},{50*((float)MAX_Red/100),41,41},{74*((float)MAX_Red/100),143,143},{0,0,255},{9*((float)MAX_Red/100),23,111},{52*((float)MAX_Red/100),204,236},
{0,255,255},{0,255,0},{0,199,88},{18*((float)MAX_Red/100),139,88},{63*((float)MAX_Red/100),32,241},{87*((float)MAX_Red/100),162,222}
};
//漸變顯示
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,則繼續(xù)
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);//讀取狀態(tài)
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)//檢查是不是開機后第一次進入這個函數(shù)
{
LED_STATUS&=0x7F;//去掉標(biāo)志位
Read_RGB_Info(LED_SET_STATUS&0x07);//讀取上次的色彩
}
RGB_TO_KEY();//把RGB值轉(zhuǎn)換為按鍵值顯示
On_Off_Show();
Draw_Prev();//更新預(yù)覽
while(1)
{
if(!Mode_Control())return;
else
{
On_Off_Show();
Draw_Prev();//更新預(yù)覽
}
if(!LED_Key_Pro())return;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -