标题: 单片机按键控制程序问题 [打印本页]

作者: 0426    时间: 2025-5-20 16:10
标题: 单片机按键控制程序问题
我的按键处理程序,本来设计的是第一次按下走20mm、第二次按下走15mm,现在第一次按下走20mm之后自动走了15mm,求助我的程序是哪里有问题

1.png (33.06 KB, 下载次数: 0)

1.png

2.png (33.9 KB, 下载次数: 0)

2.png

作者: haiyang201    时间: 2025-5-20 17:14
很明显按键检测有问题,逻辑不太对
作者: haiyang201    时间: 2025-5-20 17:16
按键检测程序有问题,
作者: 小点点1    时间: 2025-5-21 09:27
按键没有防抖动,按下一次,单片机扫描过快,判断按键按下不止一次,不是自动走的
作者: 黄youhui    时间: 2025-5-21 11:06
1你的按键逻辑很有问题。K1_jishuqi只有++没有--,只有自增没有自减,一旦长按超过 3S就会失效,而且也没有起到软件滤波的作用,硬件上你有没有做硬件滤波,如果也没有的话,你这个按键程序基本废了,轻轻碰一下,她接收到一个误触发信号就会工作
2就是你的  if(ChannelSet++ >= 2){ChannelSet = 0;}这个逻辑很有问题啊。在这个逻辑下ChannelSet能是0或者是1或者2 .但是你的想法里貌似只有两个按键效果
3一般很少见到 K1 == 1用来判读按键按下的, K1 == 0用来判断按键弹起的。你看下硬件别搞反了。
作者: 0426    时间: 2025-5-22 17:13
  1. void mianban_Key(void)
  2. {
  3.         static u8 K1cnt1=0,K1cnt2=0;
  4.         if(K1_KEY)//IO
  5.         {
  6.                 if(++K1cnt2 > 2)
  7.                 {
  8.                         K1cnt2=3;
  9.                         K1cnt1 = 0;                       
  10.                         K1 = 0; //
  11.                 }
  12.         }
  13.         else
  14.         {
  15.                 if(++K1cnt1 > 2)
  16.                 {
  17.                         K1cnt1 = 3;
  18.                         K1cnt2=0;
  19.                         K1 = 1;//
  20.                 }
  21.         }
  22.         ///////////////////////////
  23. }
复制代码

作者: 0426    时间: 2025-5-22 17:14
小点点1 发表于 2025-5-21 09:27
按键没有防抖动,按下一次,单片机扫描过快,判断按键按下不止一次,不是自动走的

void mianban_Key(void)
{
        static u8 K1cnt1=0,K1cnt2=0;
        if(K1_KEY)//IO
        {
                if(++K1cnt2 > 2)
                {
                        K1cnt2=3;
                        K1cnt1 = 0;                       
                        K1 = 0; //
                }
        }
        else
        {
                if(++K1cnt1 > 2)
                {
                        K1cnt1 = 3;
                        K1cnt2=0;
                        K1 = 1;//
                }
        }
        ///////////////////////////
}

作者: WL0123    时间: 2025-5-23 07:27
0426 发表于 2025-5-22 17:14
void mianban_Key(void)
{
        static u8 K1cnt1=0,K1cnt2=0;

void mianban_Key(void)//10ms扫描周期
{
        static u8 count=0;
        static bit sign=0;

        if(!K1_KEY)//IO
        {
                if(++count >= 2)&&(sign==0)
                {
                        sign=1;
                        K1=++K1%2;
                }
        }
        else
        {
                count=0;
                sign=0;
        }
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1