51单片机-独立按键实验

利用按键实现LED灯亮灭状态切换的基础实验

#include <REGX52.H>

sbit LED1=P2^4;                    //位定义LED以及按键
sbit LED2=P2^5;
sbit LED3=P2^6;
sbit LED4=P2^7;
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit KEY3=P3^4;

static void DelayNms(int nms);       //延时函数

static void DelayNms(int nms)
{
  static unsigned int i,j;
  for(i=0;i<nms;i++)
    for(j=0;j<123;j++);
}

void main()
{
  LED1=0;           //初始化所有LED灯为灭
  LED2=0;
  LED3=0;
  LED4=0;
  
  while(1)
  {
    if(0==KEY1)
    {
      DelayNms(50);        //消抖
      if(0==KEY1)
      {
        LED1=~LED1;       //同时翻转LED1以及LED4的亮灭状态
        LED4=~LED4;
        while(0==KEY1); //等待按键被弹起
      }
    }
     
    if(0==KEY2)
    {
      DelayNms(50);     //消抖
      if(0==KEY2)
      {
        LED2=~LED2;
        while(0==KEY2); //等待按键被弹起
      }
    }
      
    if(0==KEY3)
    {
      DelayNms(50);    //消抖
      if(0==KEY3)
      {
        LED3=~LED3;
        while(0==KEY3); //等待按键被弹起
      }
     }
   }
}

利用按键切换流水灯样式

#include <REGX52.H>

sbit LED1=P2^4;
sbit LED2=P2^5;
sbit LED3=P2^6;
sbit LED4=P2^7;
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit KEY3=P3^4;

void DelayNms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms!=0)
	{
		i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
		xms--;
	}
}

void main()
{
  unsigned short mode = 0;       //此变量用于记录按下了哪个按键,便于切换到对应的流水灯样式
  while(1)
  {
    if(KEY1==0)
    {
      DelayNms(50);
      while(KEY1==0);
      DelayNms(50);
      
      mode=1;                 //按下KEY1 mode1变为1 表示流水灯样式1
    }
    
    if(KEY2==0)
    {
      DelayNms(50);
      while(KEY2==0);
      DelayNms(50);
      
      mode=2;              //按下KEY2 mode2变为2 表示流水灯样式2
    }
      
    
    if(KEY3==0)
    {
      DelayNms(50);
      while(KEY3==0);
      DelayNms(50);
      
      mode=3;             //按下KEY3 mode3变为3 表示流水灯样式3
    }
    
    switch(mode)         //利用switch对mode进行选择 
    {
      case 0:
        break;
      case 1:
        LED1=0;
        DelayNms(50);
        LED1=1;

        LED2=0;
        DelayNms(50);
        LED2=1;

        LED3=0;
        DelayNms(50);
        LED3=1;

        LED4=0;
        DelayNms(50);
        LED4=1; 
        break;
      case 2:
         LED1=0;
        DelayNms(50);

        LED2=0;
        DelayNms(50);


        LED3=0;
        DelayNms(50);

        LED4=0;
        DelayNms(50);

        LED1=1;
        DelayNms(50);

        LED2=1;
        DelayNms(50);

        LED3=1;
        DelayNms(50);

        LED4=1;
        DelayNms(50);
        break;
        
      case 3:
         LED1=0;
       DelayNms(50);

       LED2=0;
       DelayNms(50);


       LED3=0;
       DelayNms(50);

       LED4=0;
       DelayNms(50);

       LED4=1; 
       DelayNms(50);  

       LED3=1; 
       DelayNms(50); 

       LED2=1; 
       DelayNms(50); 

       LED1=1; 
       DelayNms(50); 
       break;
       
      default:           
        break;
    }
  }
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值