[技术文档] 航顺HK32F030M按键长按开关机,短按功能自己测试成功

[复制链接]
1382|1
 楼主| 盾视工作室 发表于 2023-4-25 23:59 | 显示全部楼层 |阅读模式
本帖最后由 盾视工作室 于 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芯片技术支持。
码了这么久的字,我菜鸟一个多谢支持!
[payamount]10.00[/payamount]
[pay]
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;
                 
         extern  uint16_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);

}

        [/pay]


 楼主| 盾视工作室 发表于 2023-4-26 00:07 | 显示全部楼层
本帖最后由 盾视工作室 于 2023-4-26 09:40 编辑

有需要互相学习的顶个,里面是完整代码,加上自己想要的功能就能运行。尾数为8的楼友免费分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部