单片机独立按键实现LED移位

        今天学习了单片机独立按键的知识,想通过这篇文章记录一下。

独立按键电路

        首先当独立按键按下时电路导通,右边GND接地时负极,左边分别连接四个引脚,每个引脚上连接了一个独立按键。这四个引脚接到单片机的CPU上,当单片机接通电源时这四个引脚默认为高电平相当于 1。当独立按键被按下时线路导通,引脚变为低电平 0。 

按键的抖动

        对于机械开关,按下开关,变为低电平;松开开关,则变为高电平。当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

     所以要对按键进行消抖,消抖的方式有两种,第一种时硬件消抖,第二种时软件消抖,由于本人也是刚学习单片机这里只说软件消抖,就是通过延迟来消除独立按键按下或松开时产生的动。 

按键控制LED亮灭 

#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;

#define LED1 P2_0

void delay_us(u16 ten_us)
{
	while(ten_us--);
}
void main()
{
	while(1)
	{
		if(P3_1==0)//如果按键被按下
		{
			delay_us(20);
			while(P3_1==0);//按键一直被按下程序将在此循环中,松手继续向下执行
			delay_us(20);
			LED1=~LED1;    //每次按键被按下LED1的状态发生一次反转
		}
	}
}

按键实现LED移位 

#include <REGX52.H>
void delay_ms(u16 ten_us)
{
    while(ten_us--);
}
void main()
{
    u8 LEDNum=0;  //设置一个变量记录按下的次数
    while(1)
    {
        if(P3_1==0)
        {

             //按键的检测
            delay_ms(20);  //按下消抖
            while(P3_1==0);
            delay_ms(20);  //松开消抖
            
            if(LEDNum>=8)//按下超过八次重新开始
                LEDNum = 0;
            P2 = ~(0x01<<LEDNum);//变量取反
            LEDNum++;  //变量自增
        }
        if(P3_0==0)
        {
            delay_ms(20);
            while(P3_0==0);
            delay_ms(20);

            if(LEDNum==0)//由于采用八位寄存器,如果小于0就会溢出
                LEDNum=7;
            else
                LEDNum--;//变量自减
            P2 = ~(0x01<<LEDNum);
        }
    }
}

 

按键使LED显示二进制 

#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;

void Delayms(u16 xms)		
{
	unsigned char i, j;

	while(xms)
	{
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	
}


void main()
{
	u8 LEDNum = 0;
	while(1)
	{	
		if(P3_1==0)
		{	
			delay_us(20); //延迟消抖	  
			while(P3_1==0);
			Delay_us(20);  

			LEDNum++;     //0000 0001 ~ 1111 1111
			P2=~LEDNum;
            //P2++也可以实现,上电之后P2默认位高电平 1111 1111
		}
	}
}

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值