基于51单片机的按键控制LED流水灯实验

/**************************************************************************************
*                       按键控制LED流水灯实验  *
实现现象:定义按键 1,控制流水灯从中间 LED 依次向外点亮,再从两侧向中间依次熄灭,重复
          此过程。按键控制流水灯的运行与暂停  
***************************************************************************************/


#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器


typedef unsigned int u16;  //对数据类型进行声明定义
typedef unsigned char u8;


#define led P2   //将P2口定义为led 后面就可以使用led代替P2口


sbit k1=P3^1;   //定义独立按键1


u16 lightled[6]={0xe7,0xdb,0xbd,0x7e,0xbd,0xdb}; //小灯显示方式


/*******************************************************************************
* 函 数 名         : delay
* 函数功能   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}


/*******************************************************************************
* 函 数 名         : keypros
* 函数功能   : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{
if(k1==0)                    //检测按键K1是否按下
{
delay(1000);                    //消除抖动 一般大约10ms
if(k1==0)                    //再次判断按键是否按下
{
while(!k1);                //检测按键是否松开
while(1) //按下后说明需要停止,就会进入这个死循环函数,知道按键再次按下
{
    delay(50000); //用循环的延时函数来实现停止
if(k1==0) //检测按键K1是否按下

    delay(1000);    //消除抖动 一般大约10ms
if(k1==0) //再次判断按键是否按下
{
     while(!k1); //检测按键是否松开
 break; //说明再一次按下了按键,需要进行实验,用break 来跳出循环
}
}
}
}
}
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能 : 主函数
* 输    入       : 无
* 输    出     : 无
*******************************************************************************/
void main()
{
u8 i;
led=0x00;                  //刚开始让小灯全亮
delay(50000);                 //大约延时450ms
while(1)
{
for(i=0;i<6;i++)      //将led左移一位
{
led=lightled[i];
delay(50000);         //大约延时450ms
keypros();  //检测按键是否按下
}
}
}

猜你喜欢

转载自blog.csdn.net/cheetah2/article/details/80172865