MCU学习4--利用一个按键控制两个LED与防抖

/**

 * IO, 1个按钮控制2LED. 并添加防键盘抖动逻辑.

 */

#include <stdio.h>

#include <reg52.h>

 

// 10LED

sbit P10 = P1^0;

sbit P11 = P1^1;

sbit P12 = P1^2;

sbit P13 = P1^3;

sbit P14 = P1^4;

sbit P15 = P1^5;

sbit P16 = P1^6;

sbit P17 = P1^7;

 

// 定义开关. 低电平有效.

sbit K1 = P3^2;

sbit K2 = P3^5;

 

void main( void )

{

    unsigned char i = 0; // 通过i的值为1还是2来判断按钮的2种控制.

   

    while( 1 )

    {  

       if( !K1 )

       {

           i++;   // 这里需要做防抖动措施. 极度不安全!

       }

      

       if(i == 1)    // 1次点

       {

           P10 = 0;   P11 = 1;

       }

       else if (i == 2)// 2次点

       {

           i = 0; // 清零

             

           P10 = 1;   P11 = 0;

       }

       else          // 发生了异常咯

       {

           P12 = 0;

       }

    }

}

从逻辑上看, 这是可行的, 但很显然没有处理按键抖动, 造成了结果不是预期的. 处理按键抖动的思路 :

在按下的时候产生一个延迟, 在弹起的时候产生一个延迟. 这个延迟就是等待状态稳定, 在延迟的这一小段时间里, 无论无核抖动都不理会

while( 1 )

{

    unsigned int n;

   

    if( !K1 )

    {

       /*

        *  这里延迟一小会,在这段时间内, 无论如何抖动都不理会.

        * 实际就是在等待按键按下稳定下来.

        */

       for(n=1000; n>0; n--);

      

       /*

        * 这个循环一直在进行, 也就是代码不会往下走了, 除非手松开.

        * 实际就是等待按键弹起来. 死等...

        *

        * cool !

        */

       while( !K1 );

      

       /*

        * 这里延迟一小会,在这段时间内, 无论如何抖动都不理会.

        * 实际就是在等待按键弹起稳定下来

        */

       for(n=1000; n>0; n--);

    }

}

那么程序就改进为

/**

 * IO, 1个按钮控制2LED. 并添加防键盘抖动逻辑.

 */

#include <stdio.h>

#include <reg52.h>

 

// 10LED

sbit P10 = P1^0;

sbit P11 = P1^1;

sbit P12 = P1^2;

sbit P13 = P1^3;

sbit P14 = P1^4;

sbit P15 = P1^5;

sbit P16 = P1^6;

sbit P17 = P1^7;

 

// 定义开关. 低电平有效.

sbit K1 = P3^2;

sbit K2 = P3^5;

 

void main(void)

{

    bit light = 0; // 初始值设为点亮!

    unsigned int n; // 延时使用

   

    while( 1 )

    {

       if( !K1 )

       {

           /*

            *  这里延迟一小会,在这段时间内, 无论如何抖动都不理会.

            * 实际就是在等待按键按下稳定下来.

            */

           for(n=1000; n>0; n--);

          

           light = ~light; // watch me J !

          

           /*

            * 这个循环一直在进行, 也就是代码不会往下走了, 除非手松开.

            * 实际就是等待按键弹起来. 死等...

            */

           while( !K1 );

      

           /*

            * 这里延迟一小会,在这段时间内, 无论如何抖动都不理会.

            * 实际就是在等待按键弹起稳定下来

            */

           for(n=1000; n>0; n--);

       }

 

       P10 = light;

    }

}

 

作业

改为4个按键,分别控制4LED的亮和灭。相当应用到多个房间的单键开关灯共用一个cpu处理

 

/**

 * IO, 1个按钮控制2LED. 并添加防键盘抖动逻辑.

 */

#include <stdio.h>

#include <reg52.h>

 

// 10LED

sbit P10 = P1^0;

sbit P11 = P1^1;

sbit P12 = P1^2;

sbit P13 = P1^3;

sbit P14 = P1^4;

sbit P15 = P1^5;

sbit P16 = P1^6;

sbit P17 = P1^7;

 

// 定义开关. 低电平有效.

sbit K1 = P3^2;

sbit K2 = P3^3;

sbit K3 = P3^4;

sbit K4 = P3^5;

 

 

void main(void)

{

    bit light1, light2, light3, light4; // 初始值设为点亮!

    unsigned int n; // 延时使用

   

    while( 1 )

    {

       if( !K1 )

       {

           for(n=1000; n>0; n--);

           light1 = ~light1;

           while( !K1 );

           for(n=1000; n>0; n--);

       }

      

       if( ! K2 )

       {

           for(n=1000; n>0; n--);

           light2 = ~light2;

           while( ! K2 );

           for(n=1000; n>0; n--);

       }

      

       if( !K3 )

       {

           for(n=1000; n>0; n--);

           light3 = ~light3;

           while( !K3 );

           for(n=1000; n>0; n--);

       }

      

       if( !K4 )

       {

           for(n=1000; n>0; n--);

           light4 = ~light4;

           while( !K4 );

           for(n=1000; n>0; n--);

       }

 

       P10 = light1;

       P11 = light2;

       P12 = light3;

       P13 = light4;

    }

}

MS有点体力劳动, 也许应该抽象一个通过key控制led的函数.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值