找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3490|回复: 8
打印 上一主题 下一主题
收起左侧

单片机按键控制数码管的程序怎么改延时去抖动呢?大佬们帮帮忙。

[复制链接]
跳转到指定楼层
楼主
求延时去按键抖动的程序,我现在按键一下有时跳了两下。。。。。

QQ图片程序.png (7.96 KB, 下载次数: 49)

程序

程序

QQ图片20180301211106.png (9.02 KB, 下载次数: 51)

仿真图

仿真图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2018-3-2 07:25 | 只看该作者
给个例子你看看
                if(K1==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K1==0)
                        {
                                j=_cror_(j,1);
                                while((i<50)&&(K1==0))         //检测按键是否松开
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                        }
                }               
回复

使用道具 举报

板凳
ID:213173 发表于 2018-3-2 13:25 | 只看该作者
本帖最后由 wulin 于 2018-3-2 13:33 编辑

仿真软件里的元件都是按理想状态使用的,有没有防抖语句无所谓,你按一次出现多次计数是你的程序缺陷。单片机的电源、地、复位及外部晶振都是默认存在,不需要画出来,你的图画错了,地线标志要放在两个振荡电容之间。想要改变晶振频率只要在单片机属性里修改即可,不信你试试这个程序。把注释掉的防抖语句添加回去效果还是一样的,但在实际电路中必须要防抖。#include <AT89X52.H>
#define uint unsigned int                 //宏定义变量uint为无符号整型数据
#define uchar unsigned char         //宏定义变量uchar为无符号字符型数据

sbit key=P3^0;                                        //按键端口定义        
uchar code table[]={        //共阳数码管段码0~F
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

uchar i;                                        //按键计数变量
bit key_sign=0;                //按键有效标志
//uchar count=0;                        //消抖计数变量               

void main()        
{        

        while(1)        
        {
                if(key==0)                                        //检测按键如果为0
                {
//                        count++;                                //消抖计数
//                        if(count>=250)
//                        {
                                if(key_sign==0)
                                {                        
                                        key_sign=1;                //按键有效标志置1,防止重复计数
                                        i++;
                                        if(i>=16)
                                                i=0;
                                }
//                        }
                }
                else                                                //按键抬起
                {
                        key_sign=0;                                //按键有效标志清0
//                        count=0;                                //消抖计数清0
                }        
                P2=table;
        }
}





回复

使用道具 举报

地板
ID:279740 发表于 2018-3-2 16:56 | 只看该作者
wulin 发表于 2018-3-2 13:25
仿真软件里的元件都是按理想状态使用的,有没有防抖语句无所谓,你按一次出现多次计数是你的程序缺陷。单片 ...

谢谢你的帮助
回复

使用道具 举报

5#
ID:213173 发表于 2018-3-2 20:25 | 只看该作者

不知道为什么程序帖上来会丢符号?

回复

使用道具 举报

6#
ID:279740 发表于 2018-3-4 21:05 | 只看该作者
wulin 发表于 2018-3-2 20:25
不知道为什么程序帖上来会丢符号?

嗯,知道了。还是要感谢你
回复

使用道具 举报

7#
ID:288124 发表于 2018-3-6 11:47 | 只看该作者
检测到按键松开后再+1
回复

使用道具 举报

8#
ID:279740 发表于 2018-3-6 16:48 来自手机 | 只看该作者
HC6800-ES-V2.0 发表于 2018-3-2 07:25
给个例子你看看
                if(K1==0)                //检测按键K1是否按下
                {

感谢你的回答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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