433M遥控器无线解码1527协议,定时器轮询法
1527协议,最前面是引导码,紧接着前20位为地址码,每个遥控器不一样,后4位是按键码,每个遥控器都是一样的,
逻辑分析仪捕捉图形如下图:
分别按下遥控器的四个按键结果如下图:
#define GPIO_IRQ 0//测试gpio硬件中断
#define GPIO_LUOFEN 0//测试逻辑分析
#define LED GPIO_PB4//B4 需要关闭打印口
#define KEY GPIO_PA0
extern unsigned char RxFlag;//接收状态标记
extern unsigned int RxBuf[4+1];//多开一个
void timer_irq_handler(void);
void ev1527_init(void);
void ev1527decode(void);
void ev1527_task(void);
//----------------------------------
typedef enum{
OFF,
ON,
BLINK,
}LED_TypeDef;
typedef enum{
NO_KEY,
KEY1_PRESS, /* 按下 */
KEY1_SHORT_RELEASE, /* 按下立马释放 */
KEY1_LONG_PRESS, /* 长按 */
KEY1_LONG_RELEASE, /* 长按后释放 */
KEY2_PRESS, /* 按下 */
KEY2_SHORT_RELEASE, /* 按下立马释放 */
KEY2_LONG_PRESS, /* 长按 */
KEY2_LONG_RELEASE, /* 长按后释放 */
}KEY_TypeDef;
#define KEY1 GPIO_PB7//S1 配对按键
#define KEY2 GPIO_PB6//S2 up stop down stop
#define LED1 GPIO_PB5//LED指示灯
#define MOTORUP GPIO_PD3//上升
#define MOTORDOWN GPIO_PD6//下降
#define LED1ON() gpio_write(LED1, 0)
#define LED1OFF() gpio_write(LED1, 1)
#define MOTORUPON() gpio_write(MOTORUP, 1)
#define MOTORUPOFF() gpio_write(MOTORUP, 0)
#define MOTORDOWNON() gpio_write(MOTORDOWN, 1)
#define MOTORDOWNOFF() gpio_write(MOTORDOWN, 0)
extern LED_TypeDef LedFlag;
extern unsigned char learning_flag;
void motor_set(unsigned char a);
void led_task(void);
void motor_auto_stop(void);
void led_auto_off(void);
void led_auto_off1(void);
void user_led_key_init(void);
unsigned char key_scan(void);
void key_task(void);
void led_task(void);
void learning_key(void);
void ble_task(void);
#define NUMBER_COUNT 1 //1判断1次 2判断2次 3 判断3次
static Timer LedTimeHandle;//led闪烁定时器句柄
#define LED_OFF_TIME (10*1000)//ms
static Timer LedOffTimeHandle;//led自动关闭定时器句柄
#define MOTOR_OFF_TIME (2*60*1000)//ms 4分钟
static Timer MotorOffTimeHandle;//电机自动关闭句柄
#define MOTOR_ON_TIME (600)//ms 600豪秒
static Timer MotorOnTimeHandle;//电机延迟启动句柄
#if (NUMBER_COUNT == 1)
#define K433_OFF_TIME (110)
#endif
#if (NUMBER_COUNT == 2)
#define K433_OFF_TIME (140)
#endif
#if (NUMBER_COUNT == 3)
#define K433_OFF_TIME (170)
#endif
static Timer K433TimeHandle;//433超时关闭
unsigned char learning_flag = 0;//学习遥控器flag,1开始学习,0学习结束
LED_TypeDef LedFlag = ON;//led状态
void timer_irq_handler(void)//放irq_handler();里面
{
// static unsigned char a = 0;
static unsigned char msindex = 0;
#if GPIO_IRQ
if((reg_irq_src & FLD_IRQ_GPIO_EN)==FLD_IRQ_GPIO_EN){
reg_irq_src |= FLD_IRQ_GPIO_EN; // clear the relevant irq
gpio_irqsrc = (reg_gpio_irq_from_pad & KEY);
DBG("KEY = %d\n", gpio_irqsrc);
gpio_irq_cnt++;
}
#endif
if(timer_get_interrupt_status(FLD_TMR_STA_TMR0))
{
timer_clear_interrupt_status(FLD_TMR_STA_TMR0); //clear irq status
#if !GPIO_LUOFEN
ev1527decode();
#endif
#if GPIO_LUOFEN
static int gpio_irq_cnt = 0;
if(gpio_irq_cnt++ % 2) gpio_write(LED, 0);
else gpio_write(LED, 1);
#endif
}
if(msindex++ >= 20)
{
msindex = 0;
software_timer_ticks();
}
}
void ev1527_init(void)
{
#if GPIO_IRQ
gpio_set_func(LED ,AS_GPIO);
gpio_set_output_en(LED, 1); //enable output
gpio_set_input_en(LED ,0); //disable input
gpio_write(LED, 0);
gpio_set_func(KEY ,AS_GPIO);
gpio_set_output_en(KEY, 0); // disable output
gpio_set_input_en(KEY ,1); // enable input
gpio_setup_up_down_resistor(KEY, PM_PIN_PULLUP_10K);
/****GPIO_IRQ POL_FALLING Press SW2 to connect KEY1 and KEY3 to trigger an interrupt. **/
/* POL_FALLING(下降沿) POL_FALLING(上升沿) */
gpio_set_interrupt(KEY, POL_FALLING); //When SW2 is pressed, the falling edge triggers the interrupt.
irq_enable();
#endif
gpio_set_func(KEY ,AS_GPIO);
gpio_set_output_en(KEY, 0); // disable output
gpio_set_input_en(KEY ,1); // enable input
gpio_setup_up_down_resistor(KEY, PM_PIN_PULLUP_10K);
#if GPIO_LUOFEN
gpio_set_func(LED ,AS_GPIO);
gpio_set_output_en(LED, 1); //enable