HC6800-ES-V2.0 发表于 2018-3-2 07:25 感谢你的回答 |
检测到按键松开后再+1 |
wulin 发表于 2018-3-2 20:25 嗯,知道了。还是要感谢你 |
知了2018 发表于 2018-3-2 16:56 不知道为什么程序帖上来会丢符号? ![]() |
wulin 发表于 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; } } ![]() |
给个例子你看看 if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) { j=_cror_(j,1); while((i<50)&&(K1==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } } |