#include "rf433.h" #include "xc_drv_gpio.h" #include "key.h" #include "led.h" #include "uart_1.h" #include "switch_s.h" #include "timeslice.h" #include "dbg.h" //用bit表示通道 #define CH_GPIO2 0x01 #define CH_GPIO5 0x10 uint32_t receive_temp; uint32_t receive_data; uint8_t high_level_time; uint8_t low_level_time; uint8_t receive_data_cnt; uint8_t adress_H=0; uint8_t adress_L=0; uint8_t key_state=0; uint8_t KEY_STATE_re=0; // 长按 uint8_t long_flag_s=0; static uint8_t power=2; uint8_t res_data=255; //433返回的最后一个控制字节(低八位) static uint16_t long_time=0; //表示长按短按 该值一定要大于8,68是指68ms通过逻辑分析仪测量一帧433的时间 static uint16_t time_300ms=1; //表示:当长按的时候要300ms执行一次 uint8_t adress_ture_flag=0; uint8_t adress_H_array[5]={0,0,0,0,0}; uint8_t adress_L_array[5]={0,0,0,0,0}; uint8_t adress_ch_flag[5]={0,0,0,0,0}; uint8_t adress_index_ture=0xFF; uint8_t adress_index=0; //地址下标 uint8_t flash_ch1_state=0; uint8_t flash_ch2_state=0; union rf433_flag rf_flag = {0}; typedef struct { uint32_t KEY_STATE_Click; // 单击 uint32_t KEY_STATE_LONG_PRESS; // 长按 } _Key_TypeDef; _Key_TypeDef Key_TypeDef={0,0}; void flash_run(void) { set_TaskComps_timer(2,1000); } void rf433_gpio_init(void){ GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体 GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0 GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能) GPIO_InitCfg.Pull = GPIO_PULLUP; // 上拉电阻使能 GPIO_InitCfg.Dir = GPIO_DIR_INPUT; // 输出方向 GPIO_InitCfg.Int = NOT_INT; // 不使能中断 GPIO_InitCfg.Pin = RF433_PIN; // 设置RF引脚 xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO } void chx_gpio_init(void) { GPIO_InitCfg_t GPIO_InitCfg = { 0 }; // 清零初始化配置结构体 GPIO_InitCfg.Mux = GPIO_Mux0; // 选择功能复用器0 GPIO_InitCfg.FunSel = GPIO_Dx; // 选择GPIO功能(非特殊功能) GPIO_InitCfg.Pull = GPIO_NOPULL; //下拉电阻使能 GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; // 输出方向 GPIO_InitCfg.Int = NOT_INT; // 不使能中断 GPIO_InitCfg.Pin = RELAY_CH1_PIN; // 设置通道5引脚 xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; // 输出方向 GPIO_InitCfg.Int = NOT_INT; // 不使能中断 GPIO_InitCfg.Pin = RELAY_CH2_PIN; // 设置通道2引脚 xc_gpio_init(&GPIO_InitCfg); // 初始化GPIO if(flash_ch1_state==1) { xc_gpio_write_pin(GPIO_5,GPIO_PIN_SET); } else { xc_gpio_write_pin(GPIO_5,GPIO_PIN_RESET); } if(flash_ch2_state==1) { xc_gpio_write_pin(GPIO_2,GPIO_PIN_SET); } else { xc_gpio_write_pin(GPIO_2,GPIO_PIN_RESET); } } //该函数选择哪个按键为单击,哪个为长按按键 static void set_click(void) { if(res_data==black_on||res_data==black_off||res_data==white_on_off||res_data==white_w){ Key_TypeDef.KEY_STATE_Click=1; //单击 } else{ Key_TypeDef.KEY_STATE_LONG_PRESS=1; //长按 KEY_STATE_re=1; } } void rf433_receive(void)//rf433接收,查询周期100us { if (RF_DATA == LOW_LEVEL) { low_level_time++;//记录低电平时间 rf_flag.rf_receive_flag.current_level = 0; //当前电平状态 } else if (RF_DATA == HIGH_LEVEL) { high_level_time++;//记录高电平时间 if (!rf_flag.rf_receive_flag.current_level)//每个上升沿检测,0→1,一个完整的周期检测 { if ((high_level_time > 1 && high_level_time < 7) && (low_level_time > 100 && low_level_time < 130)) //判同步码,时间间隔13ms以内 //1-7,115-130 12 15 115-130 100 { //进来这里需要13ms rf_flag.rf_receive_flag.sync_code = 1;//同步码接收成功标志 receive_data_cnt = 0; receive_temp = 0; long_time=frames_time; } else if (rf_flag.rf_receive_flag.sync_code)//开始接收数据包 { if ((high_level_time >= 1 && high_level_time <= 7) && (low_level_time >= 7 && low_level_time <= 16)) //数据低电平 { receive_temp = receive_temp << 1; receive_data_cnt++;//接收24位位数 if (receive_data_cnt == 24)//24位数据接收完成 { //进来这个if需要40ms rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志 rf_flag.rf_receive_flag.sync_code = 0; receive_data = receive_temp;//将接收到的编码复制到解码寄存器中 res_data=receive_temp; //将接收到的编码复制到解码寄存器中 } } else if ((high_level_time >= 7 && high_level_time <= 16) && (low_level_time >= 2 && low_level_time<= 7)) //数据高电平 { receive_temp = receive_temp << 1; receive_temp |= 1; receive_data_cnt++; if (receive_data_cnt == 24) { //进来这个if需要40ms3748f3 rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志 rf_flag.rf_receive_flag.sync_code = 0; receive_data = receive_temp;//将接收到的编码复制到解码寄存器中 res_data=receive_temp; } } else { rf_flag.rf_receive_flag.sync_code = 0;//接收失败 } long_time=frames_time;//该值一定要大与68,68是指68ms通过逻辑分析仪测量一帧的时间 } if(long_time>0) { //一直按着会进入该if //P05=0; //433LED灯 long_time--; long_flag_s=0; if( KEY_STATE_re==1) { if(time_300ms==0) { time_300ms=Short_time; long_flag_s=1; KEY_STATE_re=0; } else if(time_300ms>0) time_300ms--; } } else { //松手 time_300ms=LongPress_time; long_time=0; long_flag_s=0; Key_TypeDef.KEY_STATE_Click=0; KEY_STATE_re=0; } low_level_time = 0;//清零低电平时间 high_level_time = 1;//高电平时间开始计数 } rf_flag.rf_receive_flag.current_level = 1;//当前电平状态 } } void app_key_callback_handler(uint16_t key_value) //按键回调函数 { switch(key_value) { // case REC_KEY_UP_SHORT_UP: //短按 // // key_state=KEY_SHORT; // power=4; // led_state=2; // break; case REC_KEY_UP_LONG_DOWN: //长按 led_state=1; key_state=KEY_LONG; break; case MODE_DOUBLE_CLICK: //双击 key_state=KEY_SHORT; power=3; led_state=2; break; case MODE_QUAD_CLICK: //四击 key_state=KEY_SHORT; power=4; led_state=2; break; default: break; } } void ble_mode_scan(void) { if(receive_mode) { switch(receive_mode) { case 1: receive_mode=0; key_state=KEY_SHORT; power=3; led_state=2; break; case 2: receive_mode=0; key_state=KEY_SHORT; power=4; led_state=2; break; case 4: receive_mode=0; led_state=1; key_state=KEY_LONG; break; default : break; } } } void _433_fun(void) { if(Key_TypeDef.KEY_STATE_Click==1||KEY_STATE_re==1) return; set_click(); //设置单击长按 uint8_t ch_mask = adress_ch_flag[adress_index_ture]; switch(res_data) { case 0x03: //如果是3键遥控或者是正方形白色遥控 if(ch_mask & CH_GPIO2){ xc_gpio_toggle_pin(GPIO_2); flash_ch2_state=xc_gpio_read_pin(GPIO_2); } if(ch_mask & CH_GPIO5){ xc_gpio_toggle_pin(GPIO_5); flash_ch1_state=xc_gpio_read_pin(GPIO_5); } break; case 0x04: //如果是黑色长方形遥控或者椭圆遥控关闭按键 if(ch_mask & CH_GPIO2) { xc_gpio_write_pin(GPIO_2,GPIO_PIN_RESET); flash_ch2_state=xc_gpio_read_pin(GPIO_2); } if(ch_mask & CH_GPIO5) { xc_gpio_write_pin(GPIO_5,GPIO_PIN_RESET); flash_ch1_state=xc_gpio_read_pin(GPIO_5); } break; case 0x02: //如果是黑色长方形遥控或者椭圆遥控打开按键 if(ch_mask & CH_GPIO2) { xc_gpio_write_pin(GPIO_2,GPIO_PIN_SET); flash_ch2_state=xc_gpio_read_pin(GPIO_2); } if(ch_mask & CH_GPIO5) { xc_gpio_write_pin(GPIO_5,GPIO_PIN_SET); flash_ch1_state=xc_gpio_read_pin(GPIO_5); } break; default: break; } } void scan_433(void) { uint8_t i=0; if(rf433_sw_flag==1) { rf433_sw_flag=0; power=3; key_state=KEY_SHORT; led_state=2; } else if(rf433_sw_flag==2) { rf433_sw_flag=0; power=4; key_state=KEY_SHORT; led_state=2; } if(power==3 && rf_flag.rf_receive_flag.receive_finish==1 && key_state==KEY_SHORT ) //双击对码GPIO2 { key_state=0; power=2; led_state=0; uint8_t ch_mask=CH_GPIO2; //对应位掩码 adress_H=((receive_data>>16)&0xff); //读取高八位地址码 adress_L=((receive_data>>8)&0xff); //读取低八位地址码 if(adress_index>4) { adress_index=0; } adress_ture_flag=0; for(i=0;i<5;i++) { if(adress_H_array[i]==adress_H && adress_L_array[i]==adress_L) { adress_ture_flag=1; adress_index_ture=i; //存放找到的地址下标 adress_ch_flag[i] |= ch_mask; break; } } if(adress_ture_flag==0) { uint8_t current_idx = adress_index ; adress_H_array[current_idx] = adress_H; adress_L_array[current_idx] = adress_L; adress_ch_flag[current_idx] = ch_mask; // 初始掩码 adress_index++; } } else if(power==4 && rf_flag.rf_receive_flag.receive_finish==1 && key_state==KEY_SHORT ) //四击对码GPIO5 { key_state=0; power=2; led_state=0; uint8_t ch_mask=CH_GPIO5; //对应位掩码 adress_H=((receive_data>>16)&0xff); //读取高八位地址码 adress_L=((receive_data>>8)&0xff); //读取低八位地址码 if(adress_index>4) { adress_index=0; } adress_ture_flag=0; for(i=0;i<5;i++) { if(adress_H_array[i]==adress_H && adress_L_array[i]==adress_L) { adress_ture_flag=1; adress_index_ture=i; //存放找到的地址下标 adress_ch_flag[i] |= ch_mask; break; } } if(adress_ture_flag==0) { uint8_t current_idx = adress_index ; adress_H_array[current_idx] = adress_H; adress_L_array[current_idx] = adress_L; adress_ch_flag[current_idx] = ch_mask; // 初始掩码 adress_index++; } } if(power==2 && rf_flag.rf_receive_flag.receive_finish==1) { adress_index_ture = 0xFF; // 默认无效 for(i=0; i<5; i++) { if( adress_H_array[i] == ((receive_data>>16)&0xff) && adress_L_array[i] == ((receive_data>>8)&0xff) ) { adress_index_ture = i; // 找到索引 break; } } // 找到有效索引执行 if(adress_index_ture != 0xFF) { // adress_H=((receive_data>>16)&0xff); //读取高八位地址码 // adress_L=((receive_data>>8)&0xff); //读取低八位地址码 //LOGI("%d %x %x\r\n",adress_index_ture,adress_H,adress_L); _433_fun(); flash_run(); } rf_flag.rf_receive_flag.receive_finish=0; } if( key_state==KEY_LONG ) { key_state=0; memset(adress_H_array, 0, sizeof(adress_H_array)); memset(adress_L_array, 0, sizeof(adress_L_array)); memset(adress_ch_flag, 0, sizeof(adress_ch_flag)); adress_index=0; flash_run(); } }