盾视工作室 发表于 2023-4-25 23:59

航顺HK32F030M按键长按开关机,短按功能自己测试成功

本帖最后由 盾视工作室 于 2023-4-26 00:01 编辑

       HK32F030M4P6F芯片想实现长按一键开关功能,短按切换功能 。一直在找例程,论坛百度都找了做参考,移植都没成功,花500大洋请人写,也写的对不上用不了。

    今天边干活边想,**一现想到了一个逻辑。试着调试下还真的实现了,其实没有那些论坛说的那么难。也用不到中断啊什么的。我也还没搞明白中断代码内容,只知道有那么加速。其实长按只要把消抖时间加长就实现了。感觉是不是很简单,之前移植的老是长按松手后才进入长按功能代码,不松手不进入。就是不松手关机状态实现不了。
   下面列出长按开关机代码分享。

uint8_t KEY_Scan_short(uint8_t mode)//按键按下函数
{         
      static uint8_t key_up_short=1;//按键按松开标志
      if(mode)key_up_short=1;//支持连按
                        
      if(key_up_short&&(KEY_PWR==0))
      {
                Delay_ms(900);//去抖动
                key_up_short=0;
                if(KEY_PWR==0)
    return K_PWR;
      }else if(KEY_PWR==1)key_up_short=1;            
         return 0;// 无按键按下
}
//蓝色的是按键代码,在论坛或教程里都有,一样的,把消抖时间加长就实现在长按,达到了消抖时间不松手都进入关机程序了。


void Key_key_short(void)//长按
{

                static uint8_t key_short=0;

      key_short=KEY_Scan_short(0);      //得到键值
      

if (key_short)//长按


{

switch(key_short)
{
                              case K_PWR:      //控电源
             yin_off();//报警模式关
                        MaDa_off();
                                                      LED2_on();
                                                      LED3_on();
                                                      LED4_on();                                                
                                                Delay_ms(300);
             LED4_off();      
                                                 Delay_ms(300);
                                                      LED3_off();
                                                      Delay_ms(300);
                                                         LED2_off();                              
                                                Delay_ms(300);
                                 LEDG_on();
      MTR_off();//关机代码和指示灯,一般是电源指示灯,你一直按着运行到这电源指示灯是灭了,其实电源还没断开,等你松手才真正断电了
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);//延时这里一定要,不然关机了没延时你一直按着马上又会进入主函数重新开机。过了延时你还按着也会重新开机,所以延时可以多加点。
                                        break;
      

}


}

      
                else
                        
                Delay_us(10);

}


短按功能教程都能实现,但要和长按一个键配合一起用,还是有点不同。为了这功能代码花费了不少时间费用,如果找不到好的例程的话,稍微打赏点弥补下!如果打赏得到的代码不会使用可联系我。只限航顺030M芯片技术支持。
码了这么久的字,我菜鸟一个多谢支持!
10.00

extern uint8_t key_old;      extern uint32_t last_time,now_time;


static uint8_t key_up=1;//按键按松开标志
uint8_t KEY_Scan(uint8_t mode)//这里是支持短按,连续按按键按下函数
{         
      
      if(mode)key_up=1;//支持连按                  
      if(key_up&&(KEY_BEEP==0||KEY_IV==0))//按键数量教程都有,
      {
                Delay_ms(20);//去抖动
                key_up=0;
               
                if(KEY_BEEP==0)return K_BEEP;
                else if(KEY_IV==0)return K_IV;
      }else if(KEY_BEEP==1&&KEY_IV==1)key_up=1;            
         return 0;// 无按键按下
}


void Key_key(void)
{

                static uint8_t key=0;
               
         externuint16_t Lmd;//extern是指另处有申明此变量
      
      
      key=KEY_Scan(1);      //得到键值
                   if(key)
                {                                                   
                        switch(key)
                        {                                 

                                        case K_BEEP:      //按键变量自己设置         
                        
                              LED2_on();      //这里写上你要的功能      


//可以在这里写上你的i=i+1,一直按着不动,可以连续加,和遥控加音量一样
      
                                        break;
                              
                              
                              
                              
                        
                                                
                              case K_IV:      //第二个按键变量
                                       
                  
                                                      
            LED2_off();
      
                break;      




                        
                              }
                }
                else
                        
                Delay_us(10);
      }



static uint8_t key_up_long=1;//按键按松开标志

uint8_t KEY_Scan_long(void)//这里是短按按键按下函数,不支持连续按 ,短按和长按是一个键放这里,短按是得松手才进入短按程序。如果不松手就入短按会影响长按功能
{         
      
      //if(mode==1)key_up=1;//支持连按
                        
      if(key_up_long&&(KEY_PWR==0))
      {
                Delay_ms(10);//去抖动
                key_up_long=1;
                if(KEY_PWR==0)
    return K_PWR;
      }else if(KEY_PWR==1)key_up_long=1;            
         return 0;// 无按键按下
}

void Key_key_long(void)//短按

{
static uint16_t time_4;
                static uint8_t key_long;
    static uint8_t key_old;               
      

      key_long=KEY_Scan_long();      //得到键值
      
      
      
                   if(key_long !=0 &&time_4==0)
                {               
key_old =key_long;
time_4=1;

                }
                if (key_long !=0 &&time_4>=1&&time_4<=30)
                {
                time_4++;
                }
                              if (key_long !=0 &&time_4>=1&&time_4>30)
                {
                time_4=0;
                }

               
                                 if(key_long ==0 &&time_4 > 0 &&time_4 < 30)//短按功能 开始
                {               
               
                        switch(key_old)
                        {
case 1://1是指按键1 ,.H里面的全局变量,自己设置修改

                                                      }
break;
                                                      

}
time_4=0;
}







if (key_long ==0 &&time_4>= 50)//这里长按功能要空在这里,不然短按时会卡住,如果 自己会优化可能分享下
//time_4=29;

{

time_4=0;

}

      }
               
               
               
      
               
               
               
               
      
      uint8_t KEY_Scan_short(uint8_t mode)//按键按下函数这里是长按函数不支持连续按
{         
      static uint8_t key_up_short=1;//按键按松开标志
      if(mode)key_up_short=1;//支持连按
                        
      if(key_up_short&&(KEY_PWR==0))
      {
                Delay_ms(900);//去抖动
                key_up_short=0;
                if(KEY_PWR==0)
    return K_PWR;
      }else if(KEY_PWR==1)key_up_short=1;            
         return 0;// 无按键按下
}



void Key_key_short(void)//长按功能
{

                static uint8_t key_short=0;

      key_short=KEY_Scan_short(0);      //得到键值
      

if (key_short)//长按


{

switch(key_short)
{
                              case K_PWR:      //控电源

                                                      LED2_on();//红色字长按功能自己修改自己需要的
                                                      LED3_on();
                                                      LED4_on();                                                
                                                Delay_ms(300);
             LED4_off();      
                                                 Delay_ms(300);
                                                      LED3_off();
                                                      Delay_ms(300);
                                                         LED2_off();                              
                                                Delay_ms(300);
                                 LEDG_on();
      MTR_off();//关机
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                              Delay_ms(900);
                                        break;
      

}


}

      
                else
                        
                Delay_us(10);

}

      


盾视工作室 发表于 2023-4-26 00:07

本帖最后由 盾视工作室 于 2023-4-26 09:40 编辑

有需要互相学习的顶个,里面是完整代码,加上自己想要的功能就能运行。尾数为8的楼友免费分享!
页: [1]
查看完整版本: 航顺HK32F030M按键长按开关机,短按功能自己测试成功