如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
功能:按一下数码管的数字增加1,当显示F的时候再按下的话,数码管从新变回数字0#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitP27=P2^7;//动态数码管的通电的控制I/O端口sbitK5=P1^4;//独立按钮ucharnum;Unsignedcharcodes8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示数码管数字的编码voiddelay1ms(uinti){ucharj;while(i--){for(j=0;j<115;j++)//1ms基准延时程序{;}}}voidmain(){P27=0;while(1){if(K5==0)//判断按钮是否被按下{delay1ms(15);//避免机械抖动if(K5==0)//再次判断按钮是否被按下{num=num+1;//进行加一操作if(num==16)//当加到16的时候num归0{num=0;}while(!K5);//等待按键释放}}P0=s8[num];}}和这个对比不同之处有1.voiddelay1ms(uinti){ucharj;while(i--){for(j=0;j<115;j++)//1ms基准延时程序{;}}}延时的时间更加长第二个if语句把num=num+1;if(num==16){num=0;}while(!K5);//等待按键释放}都包含进去了在最后才显示数字由此可以得出第一个程序的错误之处在于延迟时间不够长未在后面延迟时间把第二个程序改变之后如下所示#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitP27=P2^7;sbitK5=P1^4;ucharnum;unsignedcharcodes8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay1ms(uinti){ucharj;while(i--){for(j=0;j<115;j++)//1ms基准延时程序{;}}}voidmain(){P27=0;while(1){if(K5==0){delay1ms(15);//没有了if语句开头num=num+1;if(num==16){num=0;}while(!K5);//等待按键释放//没有了if语句的结尾}P0=s8[num];}}会出现如下情况由于机械抖动在释放按钮的时候也会出现,所以在没有第二个if语句的时候就会出现按一个按钮就会可能按一次数字变化多次。但是经过大量实验,现在我观察到的都是按一次变化2次的,所以证明虽然机械抖动容易令到加一程序执行多次,但是释放的时候机械抖动使if(k5==0)的几率还是比较小的,但是由于机械抖动使抖动多次的所以常常会令到if(k5==0)成立但是在加上第二个if语句的时候由于即使令到第一个if(k5==0)成立,但是在成立之后第二个if语句成立的几率太小较了所以,程序不执行加一操作,而是跳过num=num+1;语句,因此即使执行了之后的if(num==16){num=0;}while(!K5);//等待按键释放//没有了if语句的结尾}P0=s8[num];也没有半点影响。因此难以造成按一次出现变化两次的可能性。当去掉第二个if语句的时候在键稳定阶段过去之后,进入抖动阶段的时候有很大的可能性满足if(K5==0),当延时阶段过去之后其实按键已经提起来了,但是又因为没有继续判断K5==0,所以程序就会继续执行下去,继续进