51单片机学习之独立按键实例

/**************************************************************************
* 实验名               : 独立按键实验
* 使用的IO         : LED使用P2,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果       : 按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一位。
*    注意                     :由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验
*效果,最好把红外线先取下来。
**************************************************************************/
#include<reg51.h>
#include<intrins.h>    

#define GPIO_LED P2
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
void Delay10ms( );   //延时10ms

/**************************************************************************
* 函数名         : main
* 函数功能           : 主函数
* 输入           : 无
* 输出              : 无
**************************************************************************/
void main(void)
{
    unsigned int i,j;
    while(1)
    {
        if(K1==0)        //检测按键K1是否按下
        {
            Delay10ms();    //消除抖动
            if(K1==0) //再次检测按键是否按下
                j=0;
            while((i<50)&&(K1==0))     //检测按键松手检测,如果不松手超过延时也会自动结束等待
            {
                Delay10ms();
                i++;
            }
            i=0;
        }        
        if(K2==0)             //检测按键K2是否按下
        {
            Delay10ms();
            if(K2==0)
                j=0xff;
            while((i<50)&&(K2==0))
            {
                Delay10ms();
                i++;
            }
            i=0;
        }            
        if(K3==0)                //检测按键K3是否按下
        {
            Delay10ms();
            if(K3==0)
            {
                if((j==0)||(j==0xff))         //如果当前状态是全亮的或者全灭的,就点亮他的第一盏灯
                {
                    j=0xfe;
                }
                else
                    j=_crol_(j,1);            //左移一位
            }
            while((i<50)&&(K3==0))
            {
                Delay10ms();
                i++;
            }
            i=0;
        }
            
        if(K4==0)                    //检测按键K4是否按下
        {
            Delay10ms();
            if(K4==0)
            {
                if((j==0)||(j==0xff))
                {
                    j=0xfe;
                }
                else
                    j=_cror_(j,1);        //右移一位
            }
            while((i<50)&&(K4==0))
            {
                Delay10ms();
                i++;
            }
            i=0;
        }
        GPIO_LED=j;
    }                
}
/*************************************************************************
* 函数名         : Delay10ms
* 函数功能           : 延时函数,延时10ms
* 输入           : 无
* 输出              : 无
**************************************************************************/
void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

posted on 2017-10-23 18:51  雨后心晴  阅读(1658)  评论(0)    收藏  举报