一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 1731|回复: 9

[其他综合] 请教一个按键程序,请老师帮忙看看

[复制链接]
发表于 2014-8-5 18:10 | 显示全部楼层 |阅读模式
本帖最后由 gw168sh 于 2014-8-5 18:12 编辑

我弄了一个按键程序,在STC上面运行的挺好,换了个新塘的单片机,怎么弄都觉得不顺溜,请老师帮忙看看

这是按键扫描里面的一个按键判断
void Key(){
       if(Mkbz==1)                         //这是一个标志位,这个标志为1 的时候才进入里面
         {
                if(MOD_K==0)                 //判断按键是否按下
                {

                 num++;                  //num的值加一
                Mkbz=0;                    //如果按下了,就把标志位改成0,如果按键没有抬起,下次就进不来了
                }
          }
       if(MOD_K==1)  Mkbz=1;      //只有按键=1 的时候才把标志位改为1 ,方便下次进去扫描是否按下按键


我遇到的情况是,我按下去一次,有时候不是加一,每次都不一样,有时候加好几个数。

请教老师,这段程序有问题吗?



发表于 2014-8-5 18:16 | 显示全部楼层
防抖
回复

使用道具 举报

发表于 2014-8-5 19:21 | 显示全部楼层
楼上正解,可以适当延时一下
回复

使用道具 举报

发表于 2014-8-5 19:22 | 显示全部楼层
本帖最后由 sdf15937 于 2014-8-5 22:59 编辑

uchar  Mkbz=0;

if(Mkbz==0)
   {
        if(MOD_K==0)
        {        
           Delay1ms(10);
                if(MOD_K==0)
                {
                        
                num++;                  //num的值加一
                Mkbz=1;

                }
        }
   }
if(MOD_K==1)
{
Mkbz=0;
}
我用这种方法,很好用。不过我只试过STC和arduino
就是需要一个按键一个标志


点评

其实,趋向于吧Delay1ms();换成os_wait2();  发表于 2014-8-5 22:17
回复

使用道具 举报

发表于 2014-8-5 19:46 | 显示全部楼层
我的习惯是,,


浪费一个TIMER,做系统计时.
如每一个ms加1.
然后轮询,
仅当 某个IO电平满足条件&&两次读取TIMER之差超过某个数值时,才对某个变量++....

点评

用TIMER计时的缺点是浪费好多个字节的RAM,程序会显得更复杂,优点的可以腾出CPU  发表于 2014-8-6 11:34
觉得既然计时都加了就可以做按键长短按了。  发表于 2014-8-5 22:16
回复

使用道具 举报

发表于 2014-8-5 20:16 | 显示全部楼层
要加去抖动,按下后过十几ms再次检测按键状态
回复

使用道具 举报

发表于 2014-8-6 04:43 | 显示全部楼层
估计是后来换的新塘的单片机比STC的快了好些
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 18:27 , Processed in 0.041114 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表