一个按键控制多个LED灯

描述

通过四个基础练习学习按键开关

1.第一个按键:按下一次,LED1亮,再次按下LED1灭

2.第二个按键:按下一次,LED1亮,按下第二次LED2亮..... 按下第四次LED4亮,按下第五次,LED1亮,依次往复。

3.第三个按键:按下所有LED灭

4.第四个按键:按下所有LED都亮了

单片机

四个基础练习的效果动图

按键抖动的原因和危害,软件消抖

按键开关通常为机械式开关,因为机械触点有弹性。 在闭合和断开的瞬间都会伴随弹性抖动。 抖动时间: 一般为5ms~10ms

按键的抖动对于人类来说是感觉不到的,但对单片机来说,是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级

软件消抖的方法是不断检测按键值,直到按键值稳定。

实现方法:假设未按键时输入为1,按键后输入为0,抖动时不确定。 可以做以下检测:检测到按键输入为0之后,延时5ms~10ms,再次检测,如果按键还为0,那么就认为有按键输入。 延时的5ms~10ms恰好避开了抖动期。

if(0==BUTTON1)//判断是否有按键按下
        {   
            delay(10); //延时一段时间(10ms)去除前沿抖动
            if(0==BUTTON1)//再次确认是否有按键按下
            {
                while(0==BUTTON1);//按键抬起继续往下执行,没有则继续等待
                LED1 = ~LED1;   //按下一次,LED1亮,再次按下LED1灭 
        }

单片机

一个按键控制多个LED灯

按下一次,LED1亮,按下第二次LED2亮..... 按下第四次LED4亮,按下第五次,LED1亮,依次往复。 利用C语言的取模运算符,1%4 = 1 , 2%4=2 , 3%4=3 , 4%4=0 , 5%4=1 , 6%4=2...

//定义全局变量count,a
if(0==BUTTON2)
        {   
            delay(10);//延迟10ms
            if(0==BUTTON2)
            {
                while(!BUTTON2);//按键抬起继续往下执行,没有则继续等待
                count++;//每按下BUTTON2按键抬起时,变量count加1
               
                a = count%4;
                switch(a)
                {
                    case 1:
                    P0= 0xfe; //11111110    LED1亮
                    break;
                    case 2:
                    P0= 0xfd;//11111101    LED2亮
                    break;
                    case 3:
                    P0= 0xfb; //11111011   LED3亮
                    break;
                    case 0:
                    P0=0xf7;//11110111    LED4亮
                    break;
                    default :
                    P0=0xff;
                    break;
                }
           
            }   
        }

按下4个LED灯全熄灭

P0口为高电平时LED熄灭,低电平全亮

if(0==BUTTON3)
        {   
            delay(10);
            if(0==BUTTON3)
            {
                while(0==BUTTON3);
                P0 = 0xff;  //P0 = 0x00 全亮
            }
        }

把四个练习封装成函数

void main()
{ 
    while(1)
    {
          task1();
          task2();
          task3();
          task4();
    } 
}

补充

#define u16 unsigned int 等效于typedef unsigned int u16;

#define u8 unsigned char 等效于typedef unsigned char u8;

为什么要这样定义,这样写非常直观,不用担心平台的不同可移植性好,它的字节数一看就知道,u16是16位2个字节,

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分