当独立K1按键按一下(立即松开),LED D1点亮。再按一下K1(立即松开)LED D1熄灭。
与前一节《51单片机STC89C52RC——2.1 独立按键控制LED亮灭》当独立K1按键按下时LED D1 点亮,松开D1熄灭 效果不一样。



这里要注意一个设计的bug
P3_1 引脚对应是K1
P3_0 引脚对应是K2
要实现按一下点亮、再按一下熄灭,我们就需要分析按键上的电压变化。
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会立即断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动 。如上图。
具体在程序上我们就需要按照这个图做相应的处理。
- if(P3_1==0) //如果K1按键按下
- {
- Delay(15); //延时消抖
- while(P3_1==0); //松手检测
- Delay(15); //延时消抖
- P2_0=~P2_0; //LED1取反
- }
详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客
- #include
-
- /**
- * 函 数:延时函数 毫秒
- * 参 数:ms 延时多少毫秒
- * 返 回 值:无
- */
- void Delay_ms(int ms) //@12.000MHz
- {
- unsigned char data i, j;
- while(ms--)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- /**
- * 函 数:主函数
- * 参 数:无
- * 返 回 值:无
- */
- void main()
- {
- while(1)
- {
- if(P3_1==0) //如果K1按键按下
- {
- Delay_ms(15); //延时消抖
- while(P3_1==0); //松手检测 一直按着没松手
- Delay_ms(15); //延时消抖
- P2_0=~P2_0; //LED1取反
- }
- }
- }
代码编译请参考
《51单片机STC89C52RC——代码编译-CSDN博客》
代码下载请参考
《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》
