完善一个通道最多对码5个遥控

This commit is contained in:
xushaoxiang
2026-07-11 09:11:02 +08:00
parent 6dc8c1dbd9
commit d9e2a58a66
81 changed files with 1204 additions and 1274 deletions
@@ -8,45 +8,47 @@
#include "timeslice.h"
#include "dbg.h"
#include "rf433_decoder.h"
//用bit表示通道
#define CH_GPIO2 0x01
#define CH_GPIO5 0x10
////用bit表示通道
//#define CH_GPIO2 0x01
//#define CH_GPIO5 0x10
Rf433DecoderFrame_t rf433_frame;
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;
uint8_t receive_finsh_flag=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 adress_H_ch1[5] = {0}; // 通道1GPIO5)高8位地址
uint8_t adress_L_ch1[5] = {0}; // 通道1低8位地址
uint8_t adress_ch1_index = 0; // 通道1地址索引(0-4
uint8_t adress_H_ch2[5] = {0}; // 通道2GPIO2)高8位地址
uint8_t adress_L_ch2[5] = {0}; // 通道2低8位地址
uint8_t adress_ch2_index = 0; // 通道2地址索引(0-4
uint8_t match_ch = 0; // 匹配到的通道(1=GPIO52=GPIO2
#define MATCH_CH1 (1 << 0) // 通道1匹配标记
#define MATCH_CH2 (1 << 1) // 通道2匹配标记
uint8_t flash_ch1_state=0;
uint8_t flash_ch2_state=0;
union rf433_flag rf_flag = {0};
#define rf433_long_time 500
uint16_t long_timer=0;
@@ -136,125 +138,12 @@ static void set_click(void)
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-7115-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;
@@ -318,17 +207,17 @@ 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){
if(match_ch & MATCH_CH2){
xc_gpio_toggle_pin(GPIO_2);
flash_ch2_state=xc_gpio_read_pin(GPIO_2);
}
if(ch_mask & CH_GPIO5){
if(match_ch & MATCH_CH1){
xc_gpio_toggle_pin(GPIO_5);
flash_ch1_state=xc_gpio_read_pin(GPIO_5);
}
@@ -338,13 +227,12 @@ void _433_fun(void)
case 0x04: //如果是黑色长方形遥控或者椭圆遥控关闭按键
if(ch_mask & CH_GPIO2)
if(match_ch & MATCH_CH2)
{
xc_gpio_write_pin(GPIO_2,GPIO_PIN_RESET);
flash_ch2_state=xc_gpio_read_pin(GPIO_2);
}
if(ch_mask & CH_GPIO5)
if(match_ch & MATCH_CH1)
{
xc_gpio_write_pin(GPIO_5,GPIO_PIN_RESET);
flash_ch1_state=xc_gpio_read_pin(GPIO_5);
@@ -354,13 +242,13 @@ void _433_fun(void)
break;
case 0x02: //如果是黑色长方形遥控或者椭圆遥控打开按键
if(ch_mask & CH_GPIO2)
if(match_ch & MATCH_CH2)
{
xc_gpio_write_pin(GPIO_2,GPIO_PIN_SET);
flash_ch2_state=xc_gpio_read_pin(GPIO_2);
}
if(ch_mask & CH_GPIO5)
if(match_ch & MATCH_CH1)
{
xc_gpio_write_pin(GPIO_5,GPIO_PIN_SET);
flash_ch1_state=xc_gpio_read_pin(GPIO_5);
@@ -391,14 +279,14 @@ void scan_433(void)
if(rf433_sw_flag==1)
{
rf433_sw_flag=0;
power=3;
power=4;
key_state=KEY_SHORT;
led_state=2;
}
else if(rf433_sw_flag==2)
{
rf433_sw_flag=0;
power=4;
power=3;
key_state=KEY_SHORT;
led_state=2;
}
@@ -408,9 +296,9 @@ void scan_433(void)
adress_H = rf433_frame.addr_h;
adress_L = rf433_frame.addr_l;
res_data = rf433_frame.key ;
//LOGI("finsh finsh finsh\r\n");
}
//LOGI("rf433_decoder_flag %d adress_H 0x%02x adress_L 0x%02x res_data 0x%02x\r\n",rf433_decoder_flag,adress_H,adress_L,res_data);
if(power==3 && rf433_decoder_flag==true && key_state==KEY_SHORT ) //双击对码GPIO2
{
@@ -420,40 +308,31 @@ void scan_433(void)
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)
if(adress_ch2_index>4)
{
adress_index=0;
adress_ch2_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)
if(adress_H_ch2[i]==adress_H && adress_L_ch2[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++;
adress_H_ch2[adress_ch2_index] = adress_H;
adress_L_ch2[adress_ch2_index] = adress_L;
adress_ch2_index++; // 索引自增
}
}
@@ -466,34 +345,26 @@ void scan_433(void)
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)
if(adress_ch1_index>4)
{
adress_index=0;
adress_ch1_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)
if(adress_H_ch1[i]==adress_H && adress_L_ch1[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++;
adress_H_ch1[adress_ch1_index] = adress_H;
adress_L_ch1[adress_ch1_index] = adress_L;
adress_ch1_index++; // 索引自增
}
}
@@ -511,19 +382,31 @@ void scan_433(void)
{
return;
}
adress_index_ture = 0xFF; // 默认无效
// 初始化匹配状态
match_ch = 0;
for(i=0; i<5; i++)
{
if( adress_H_array[i] == adress_H &&
adress_L_array[i] == adress_L )
{
adress_index_ture = i; // 找到索引
if( adress_H_ch1[i] == adress_H && adress_L_ch1[i] == adress_L )
{
match_ch|= MATCH_CH1;
break;
}
}
// 找到有效索引执行
if(adress_index_ture != 0xFF)
for(i=0; i<5; i++)
{
if(adress_H_ch2[i]==adress_H && adress_L_ch2[i]==adress_L)
{
match_ch|= MATCH_CH2; // 标记匹配到通道2
break;
}
}
if(match_ch != 0)
{
_433_fun();
flash_run();
@@ -536,10 +419,12 @@ void scan_433(void)
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;
memset(adress_H_ch1, 0, sizeof(adress_H_ch1));
memset(adress_H_ch2, 0, sizeof(adress_H_ch2));
memset(adress_L_ch1, 0, sizeof(adress_L_ch1));
memset(adress_L_ch2, 0, sizeof(adress_L_ch2));
adress_ch1_index=0;
adress_ch2_index=0;
flash_run();
}