标题: 51单片机板子按键返回值求大佬帮帮忙 [打印本页]

作者: 下一站过后    时间: 2024-3-31 14:15
标题: 51单片机板子按键返回值求大佬帮帮忙
unsigned char  Positional_Selection()//位选:选择更改位{

        if(Key()==2)
        {
               
                Bit_selection++;
               
        }
      
        if(Bit_selection>5)
        {
               
                Bit_selection=0;
      
        }

      
        return Bit_selection;
}
按下按钮后
if(Key()==2)
        {

                Bit_selection++;

        }

这段代码判断失效
求各位大佬帮忙看下到底是哪出了问题
如果不使用函数进行按键判断,将按键判断的代码直接写到主程序的这样是可以运行的,为什么,返回值有问题吗
普中的板子

DS1302时钟显示 - 可调时钟.rar

60.28 KB, 下载次数: 5


作者: kk555    时间: 2024-4-1 12:01
找一个B站矩阵按键的函数看看,要消抖
作者: 下一站过后    时间: 2024-4-1 20:46
kk555 发表于 2024-4-1 12:01
找一个B站矩阵按键的函数看看,要消抖

谢谢,key函数里写了消抖
作者: lkc8210    时间: 2024-4-1 22:14
代码逻辑问题
每一次主循环里,key()函数只可运行一次
不要有类似
if(key()==1){...}
if(key()==2){...}
这种写法
作者: 下一站过后    时间: 2024-4-1 22:36
lkc8210 发表于 2024-4-1 22:14
代码逻辑问题
每一次主循环里,key()函数只可运行一次
不要有类似

大佬您好,非常感谢您能回复我的贴子,您说的我想了想还是不太明白,所以想问下您key()函数怎么改合适一点,麻烦您给我指一下方向,大概给个思路,真的很谢谢您。
作者: xiaobendan001    时间: 2024-4-2 07:39
下一站过后 发表于 2024-4-1 22:36
大佬您好,非常感谢您能回复我的贴子,您说的我想了想还是不太明白,所以想问下您key()函数怎么改合适一 ...

例如char t;
t = key();
if(t==1);
if(t==2);
这样就只运行了一次key();
或者可以switch(key()){case:1;case:2;}这样是不是也行
作者: 下一站过后    时间: 2024-4-2 09:39
xiaobendan001 发表于 2024-4-2 07:39
例如char t;
t = key();
if(t==1);

非常感谢大佬您的回复,麻烦问下我可不可以理解为每一次循环相同的函数只会调用一次,刚学没多久,不大明白,谢谢您
作者: xiaobendan001    时间: 2024-4-2 09:55
下一站过后 发表于 2024-4-2 09:39
非常感谢大佬您的回复,麻烦问下我可不可以理解为每一次循环相同的函数只会调用一次,刚学没多久,不大明 ...

调用多少次你自己说了算,但是类似您这样大量使用delay的情况下多长重复调用会消耗很多时间,这导致反应变慢很多。你可以尝试在定时器中断里面做一个计数器,用来消除抖动带来的影响。只要不使用DELAY这种,一个比如1ms的定时器里可以做很多事,实在不行2ms也可以
作者: 下一站过后    时间: 2024-4-2 10:14
xiaobendan001 发表于 2024-4-2 09:55
调用多少次你自己说了算,但是类似您这样大量使用delay的情况下多长重复调用会消耗很多时间,这导致反应 ...

谢谢您的回复,这段程序的问题主要是出在延时函数的问题吗?延时函数确实会影响到程序运行的效率,它会影响到我这个按键的判断吗?这个逻辑我不是很明白,谢谢您。麻烦您有空指导一下我的问题是出在哪。
作者: 下一站过后    时间: 2024-4-2 13:17
lkc8210 发表于 2024-4-1 22:14
代码逻辑问题
每一次主循环里,key()函数只可运行一次
不要有类似

大佬您好,我想问下您说的这个每一次主循环里key()函数只可运行一次,这个是什么意思,为什么只可以运行一次,我查了很久的资料也没有答案,麻烦您有空解答一下,谢谢
作者: lkc8210    时间: 2024-4-2 13:57
主要问题就在于55行的那个while(1)
把那个while(1)拆开分析归纳后的得出三个区域
a. key()==2 : 几微秒
b. 一堆LCD_ShowNum():几百毫秒
c. key()==1 : 几微秒
你觉得按键按下时,会在哪个区域?
当然是b
然后就进入c
基于key()里有放手死等
所以就算按下了2
进入C区域,也要等到放手才离开
结果就是a区域的key()==2永不成立

作者: 下一站过后    时间: 2024-4-2 15:59
lkc8210 发表于 2024-4-2 13:57
主要问题就在于55行的那个while(1)
把那个while(1)拆开分析归纳后的得出三个区域
a. key()==2 : 几微秒

谢谢您的回复,我明白了,太感谢了,困扰我好久了,谢谢
作者: YSY521    时间: 2024-4-3 20:08
我像个NT一样看着评论区




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