航顺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 09:40 编辑
有需要互相学习的顶个,里面是完整代码,加上自己想要的功能就能运行。尾数为8的楼友免费分享!
页:
[1]