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--);
}
浙公网安备 33010602011771号