- /********************************************************
- 功能: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) //还不是最大亮度等级
- ……………………
- …………限于本文篇幅 余下代码请从下载附件…………
复制代码
STM8_433M无线遥控台灯程序.rar
(1.86 MB, 售价: 1 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|