- /********************************************************
- 功能:433M無線遙控臺燈,觸摸,無級調光
- 作者:白菜
- 軟件環境:IAR FOR STM8 1.40.1
- 注意:IAR for stm8s中 中斷號需要在官方文檔中加2 2013-7-6
- 注意:當亮度等級為255時候,PWM_Buf[255]中 應該是PWM_Buf[0]-PWM_Buf[254]
- 注意 Opton Byte 中的ARF0要激活
- 本開源項目針對新手,老鳥勿噴。
- *********************************************************/
- #include <iostm8s003f3.h>
- #include"sys.h"
- #include"uart.h"
- #include"intrinsics.h"
- #include"timer1_pwm.h"
- #include"timer2.h"
- #include"2262decode.h"
- #include"key.h"
- #include"stm8s_eeprom.h"
- #include"stm8s_beep.h"
- #include"iwdg.h"
- //#define DEBUG_MODE
- #define LED 4 //the LED on the PD4
- #define LED_OFF() PD_ODR |= (1<<(LED))
- #define LED_ON() PD_ODR &= ~ (1<<(LED))
- #define MAX_LIGHT_LEVEL 254
- #define MIN_LIGHT_LEVEL 10 //調節的時候故意限制到10,亮度等級從0-254
- #define POWER_ON 1 //
- #define POWER_OFF 0 //
- #define BOTH_WARM_COLD 0//暖光冷光一起調節
- #define COLD_ONLY 1//冷光
- #define WARM_ONLY 2//暖光
- #define MATCHING_CODE 1// 對碼中
- #define NOT_MATCHING_CODE 0// 不是對碼
- #define MAX_MODE_VAL 10
- #define PLUS_MINUS_STEP 20 //+ - 鍵 單步 增加減少的量
- uchar PowerMode = POWER_OFF ; //
- uchar ModeVal = 0 ; // 模式的值,斷電上電默認為0 共10種模式
- uchar ModeVal_Light_Warm[MAX_MODE_VAL] = {254,254,254,254,254,228,178,127,76,36} ; // 由暖變冷,然后保持 亮度降低 每個模式的暖光 亮度等級 0-254
- uchar ModeVal_Lignt_Cold[MAX_MODE_VAL] = {0 ,76,127,178,228,228,178,127,76,36} ; // 每個模式的冷光 亮度等級 0-254
- uchar ColdLightLevel=178 ; //冷光 亮度等級 大概70%的功率
- uchar WarmLightLevel=178 ; //暖光 亮度等級
- uchar ModeFlag = 0 ; //0-->沒有用模式按鍵點燈 1-->有
- uchar KeyModeContinuousNum = 0 ; //其他按鍵按下后,模式按鍵連續單擊次數,,用來判斷是否 用其他按鍵微調過該模式,是的話 長按MODE 按鍵可以修改該模式
- uchar KeyModeLongCnt = 0 ; //mode按鍵 長按后計數
- uchar LastColdLightLevel = 178 ; //上次的亮度等級值
- uchar LastWarmLightLevel = 178 ;
- uint8 SelWarmColdVal = BOTH_WARM_COLD ; //兩者同時調整
- uint8 MathCodeFlag = NOT_MATCHING_CODE ; //不在對碼中
- uint8 MatchTimes = 0 ; // 按下匹配次數
- uint16 RF_AddrValH1 = 0 ; //第一次按鍵接收的地址
- uint16 RF_AddrValL1 = 0 ; //第一次按鍵接收的地址
- uint8 KeyC_Press = 0 ; //遙控C鍵按下后 做標志用 用來一直增加亮度
- uint8 KeyD_Press = 0 ; //遙控D鍵按下后 做標志用 用來一直減小亮度
- int main( void )
- {
- uint8 StrTemp[6] = {0} ;
- //uint8 i ;
- uint8 key_val ;
- // asm("sim"); // 禁止中斷
- ClockInit();
- IWDG_Init() ; //獨立看門狗初始化
- GPIO_Init();
- //PD2做輸入 機械按鍵
- PD_DDR_DDR2 = 0 ; // PD0輸入
- PD_CR1_C12 = 1 ; // 輸入帶上拉
- PD_CR2_C22 = 0 ; // 禁止中斷
-
- Timer1_PWM_Init() ;
- Timer2_Init(); //125us中斷,遙控解碼用
- Uart1_Init();
-
- UartSendByte(0X51);
- // asm("rim"); //開中斷
- __enable_interrupt(); //開中斷
- PowerOff();//關LED
- //剛上電等電源穩定在操作EEPROM
- // Delay_Ms(2) ;
- /* Write_eeprom_Byte(EEPROM_ADDR,str1,6) ;*/
- Read_eeprom_Byte(EEPROM_ADDR, StrTemp,6) ;
- MyRF_AddrH = (uint16)StrTemp[0]*256 + StrTemp[1] ;
- MyRF_AddrL = (uint16)StrTemp[2]*256 + StrTemp[3] ;
- ColdLightLevel = StrTemp[4] ;
- WarmLightLevel = StrTemp[5] ;
- if( (ColdLightLevel<MIN_LIGHT_LEVEL) || (ColdLightLevel>MAX_LIGHT_LEVEL) )
- {
- ColdLightLevel = MAX_LIGHT_LEVEL ;
- }
- if((WarmLightLevel<MIN_LIGHT_LEVEL) || (WarmLightLevel>MAX_LIGHT_LEVEL) )
- {
- WarmLightLevel = MAX_LIGHT_LEVEL ;
- }
- #ifdef DEBUG_MODE
- for(i=0;i<6;i++)
- {
- UartSendByte(StrTemp[i]);
- }
- #endif
-
- InitBeep() ;//初始化蜂鳴器
- #ifdef DEBUG_MODE
- BeepFlag = 1 ; //叫一下
- #endif
-
- while(1)
- {
- ReadKey() ; //讀機械按鍵
- ReadKeyTouch() ;//讀觸摸按鍵值
- if(KeyOnOffShortPress)
- {
- KeyOnOffShortPress = 0 ;
- PowerMode = !PowerMode ; //
- if(POWER_OFF == PowerMode) //關機
- {
- PowerOff();//關LED
- //存儲亮度值到EEPROM
- StrTemp[0] = ColdLightLevel ;
- StrTemp[1] = WarmLightLevel ;
- Write_eeprom_Byte(EEPROM_COLD_ADDR,StrTemp,2) ;
- KeyC_Press = 0 ;//假如正在變化則暫停
- KeyD_Press = 0 ;
- }
- else //開機
- {
- SetLightCold(ColdLightLevel) ; //調節冷光燈光亮度,傳入參數為亮度等級0-255
- SetLightWarm(WarmLightLevel) ; //調節暖光燈光亮度,傳入參數為亮度等級0-255
- SelWarmColdVal = BOTH_WARM_COLD ; //開燈時默認兩者一起調整
- KeyOnOffLongPressUpFlag = 0 ; //清除在關燈下誤觸發的長按按鈕,留下的長按抬起信號
- TouchKeyDirection = TOUCH_PLUS ; //上電默認 觸摸按鍵長按亮度加
- }
- #ifdef DEBUG_MODE
- BeepFlag = 1 ;
- #endif
- }
-
- if(JiXieKeyCodePress)
- {
- JiXieKeyCodePress = 0 ;
- MathCodeFlag = MATCHING_CODE ; // 進入對碼
- BeepFlag = 1 ;//蜂鳴器叫一下
- #ifdef DEBUG_MODE
- UartSendByte(0xaa);
- #endif
- }
-
- if( MATCHING_CODE == MathCodeFlag ) // 在對碼中
- {
- if(rf_ture) //按鍵短按
- {
- rf_ture = 0 ;
- if( 0 == MatchTimes ) //第一個按鍵
- {
- RF_AddrValH1 = rf_addh_old ;
- RF_AddrValL1 = rf_addl_old ;
- MatchTimes ++ ;
- BeepFlag = 1 ;//蜂鳴器叫一下
- #ifdef DEBUG_MODE
- UartSendByte(0X0B);
- #endif
-
- }
- else if( 1 == MatchTimes ) //第二次按下
- {
- if( (RF_AddrValH1 == rf_addh_old) && (RF_AddrValL1 == rf_addl_old) ) //兩次一樣認為可靠
- {
- MyRF_AddrH = RF_AddrValH1 ;
- MyRF_AddrL = RF_AddrValL1 & 0XFFF0 ; //記錄 RF 地址,低四位為按鍵值
- //存儲到EEPROM
- StrTemp[0] = MyRF_AddrH >> 8 ;
- StrTemp[1] = MyRF_AddrH & 0X00FF ;
- StrTemp[2] = MyRF_AddrL >> 8 ;
- StrTemp[3] = MyRF_AddrL & 0X00FF ;
- Write_eeprom_Byte(EEPROM_RF_ADDRH,StrTemp,4) ;
-
- MulBeepFlag = 2 ; // 叫2聲
- MathCodeFlag = NOT_MATCHING_CODE ; //回到正常工作狀態
- }
- MatchTimes = 0 ; // 按下匹配次數
- #ifdef DEBUG_MODE
- UartSendByte(MyRF_AddrH>>8);
- UartSendByte(MyRF_AddrH>>0);
- UartSendByte(MyRF_AddrL>>8);
- UartSendByte(MyRF_AddrL>>0);
- #endif
- }
- }
-
- }
- else //不在對碼中,按鍵可以點燈
- {
- if(POWER_OFF == PowerMode) //關燈狀態下
- {
- if(rf_ture) //按鍵短按
- {
- #ifdef DEBUG_MODE
- UartSendByte(rf_addh_old>>8);
- UartSendByte(rf_addh_old>>0);
- UartSendByte(rf_addl_old>>8);
- UartSendByte(rf_addl_old>>0);
- #endif
- rf_ture=0 ;
- KeyModeLongCnt=0 ; //模式鍵 長按計數
- if( ( rf_addh_old == MyRF_AddrH ) && ( ( rf_addl_old & 0XFFF0 ) == MyRF_AddrL ) ) //遙控地址位(高6位位地址位)與預設地址一致
- {
- key_val = 0 ;
- key_val = rf_addl_old & 0x000F ;
- if( KEYA == key_val ) //開關鍵按下
- {
- #ifdef DEBUG_MODE
- UartSendByte(0x0A);
- BeepFlag = 1 ; //叫一下
- #endif
- PowerMode = POWER_ON ; //開燈狀態
- SetLightCold(ColdLightLevel) ; //調節冷光燈光亮度,傳入參數為亮度等級0-255
- SetLightWarm(WarmLightLevel) ; //調節暖光燈光亮度,傳入參數為亮度等級0-255
- SelWarmColdVal = BOTH_WARM_COLD ; //開燈時默認兩者一起調整
- KeyOnOffLongPressUpFlag = 0 ; //清除在關燈下誤觸發的長按按鈕,留下的長按抬起信號
- TouchKeyDirection = TOUCH_PLUS ; //上電默認 觸摸按鍵長按亮度加
- }
- }
-
- }
- if(KeyOnOffLongPress) //觸摸按鍵長按
- {
- SetLightCold(ColdLightLevel) ; //調節冷光燈光亮度,傳入參數為亮度等級0-255
- SetLightWarm(WarmLightLevel) ; //調節暖光燈光亮度,傳入參數為亮度等級0-255
- }
- if(KeyOnOffLongPressUpFlag) //觸摸按鍵 長按后抬起
- {
- KeyOnOffLongPressUpFlag = 0 ;
- SelWarmColdVal = BOTH_WARM_COLD ; //開燈時默認兩者一起調整
- KeyOnOffLongPressUpFlag = 0 ; //清除在關燈下誤觸發的長按按鈕,留下的長按抬起信號
- TouchKeyDirection = TOUCH_PLUS ; //上電默認 觸摸按鍵長按亮度加
- PowerMode = POWER_ON ; //開燈狀態
- }
-
- }
- else //開燈狀態下
- {
- if(KeyOnOffLongPress) //觸摸按鍵長按
- {
- if(TouchKey4msCnt>5) //20ms一次
- {
- TouchKey4msCnt = 0 ;
- if( TOUCH_PLUS == TouchKeyDirection )
- {
- if(WarmLightLevel < MAX_LIGHT_LEVEL) //還不是最大亮度等級
- {
- WarmLightLevel++; //亮度加1
- }
- SetLightWarm(WarmLightLevel) ; //更新亮度
-
- if(ColdLightLevel < MAX_LIGHT_LEVEL) //還不是最大亮度等級
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
代碼:
433M無線遙控臺燈程序.rar
(1.86 MB, 下載次數: 64)
2021-7-3 16:24 上傳
點擊文件名下載附件
|