单片机P0口低4位接4个led灯,为"0"时LED灯亮,为"1"时LED熄灭,P1口P1^0接一按钮开关接地,要求:一上电P0^0闪烁,其他不亮,再按一次时,P0^1闪烁,其他不亮,再按一次时,P0^2闪烁,其他不亮,再按一次时,P0^3闪烁,其他不亮,再按一次时,P1^0闪烁,其他不亮。。。。 依次下去,我的程序如下: #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit P00=P0^0; sbit P10=P1^0; void main() { uchar c,i,a; i=0; P0=0xff; P10=1; while(1) { switch(i) { case 0: { P0=0xfe; for(a=0;a<201;a++) for(c=0;c<101;c++); P0=0xff; for(a=0;a<201;a++) for(c=0;c<101;c++); }break; case 1: { P0=0xfd; for(a=0;a<201;a++) for(c=0;c<101;c++); P0=0xff; for(a=0;a<201;a++) for(c=0;c<101;c++); }break; case 2: { P0=0xfb; for(a=0;a<201;a++) for(c=0;c<101;c++); P0=0xff; for(a=0;a<201;a++) for(c=0;c<101;c++); }break; case 3: { P0=0xf7; for(a=0;a<201;a++) for(c=0;c<101;c++); P0=0xff; for(a=0;a<201;a++) for(c=0;c<101;c++); }break; } if(P10==0) { for(a=0;a<101;a++) for(c=0;c<51;c++); if(P10==0) { while(P10==0); i++; if(i==4) { i=0; } } } } }
虽然功能大体上实现了,但有个问题,不知道叫不叫传说中的bug,各位高手请看:由于前面的闪烁延时比较长,近40ms,后面还有个延时去抖动5ms,人按键的速度有快有慢,当按键时间小于45ms时,很可能按键信息就丢失了,自己捉摸了好一会,感觉这个是程序的架构问题,(在一个死循环周期里,先闪烁再扫描开关)有没有高人指点一二呀?解决这个问题,谢谢
坐到板凳等 ^_^ |