独立按键控制

独立按键控制

  1. 独立按键

    按下的时候金属片接触,开关接通。按下的时候IO口变为低电平,断开的时候是高电平 0代表按下,1代表松开

    因为按键开关直接与MCU连接默认是高电平,寄存器去读这个IO口的时候,如果IO口是断开的话读到的还是本身的高电平

REGX52.H头文件中声明了单独的 LED 接口,比如 P2_1,对他们操作可以直接控制单个 LED 接口

#include <REGX52.H>
P2 = 0xFE
P2_0 = 0		//这两行代码效果完全一样

而这种单独的接口还可以读取 IO 口的数据,可以用这些接口来获取按键的接通情况 0代表按下,1代表松开

#include <REGX52.H>
void main(void{
	while(1){
		if(P3_1 == 0){		//假如按键 1 被接通
			P2_0 = 0;		//就点亮 LED
		}
		else{				//假如按键 1 没有被接通
			P2_0 = 1;
		}
	}
}
  1. 单片机中的位运算

    位运算符意义
    <<按位左移
    >>按位右移
    &按位与
    |按位或
    ^按位异或
    ~按位非

    异或:相同为 0 ,不同为 1

    实例:

    0011 1100 << 1 -> 0111 1000 按位左移

    0011 1100 >> 1 -> 0001 1110 按位右移

    0011 1000 & 0011 1010 -> 0011 1000 按位与

    0011 1000 | 0011 1011 -> 0011 1011 按位或

    0011 1000 ^ 0011 1010 -> 0000 0110 按位异或

    ~0011 -> 1100 按位取反

  2. 按键的抖动

    由于机械触点的弹性作用,按键在闭合时会伴随着一连串的抖动,可能会导致误操作

    抖动的消除:硬件处理,软件处理(先延时 20ms 等待抖动稳定再执行判断)

    同时在按键检测中需要检测松手

    void main(void)
    {
        while(1)
        {
            if(P3_1 == 0)
            {
                Delay(20);				//消除按下时的抖动
                while(P3_1 == 0);		//检测松手(直到松手时才进行下一步操作)
                Delay(20);				//消除松开时的抖动
            }
        }
    }
    
  3. 通过独立按键实现二进制加减

    void main()
    {
        unsigned int LEDnum = 0;		//八位存储空间正好用来放一个寄存器的数据
        while(1)
        {
            if(P3_1 == 0)
            {
                Delay(20);
                while(P3_1 == 0);		//消除抖动
                Delay(20);
                LEDnum ++;				//每按一次就二进制加一
                P2 = LEDnum;			//把加一后的二进制数赋值给 P2	
            }
        }
    }
    
  4. 使用独立按键控制LED移位

    #include <REGX52.H>
    void Delay(int xms)//@12.000MHz
    void main(void)
    {
    	there:
        while(1)		//当按下第一个按键时,灯从全灭变成第一个亮,也就是 P2 从 1111 1111 变成 1111 1110
        {
            if(P3_1 == 0)
            {
                Delay(20);
                while(P3_1 == 0);		
                Delay(20);
                P2_0 = 0;	
    			break;
            }
        }
    	while(1)
        {
            if(P3_1 == 0)
            {
                Delay(20);
                while(P3_1 == 0);		
                Delay(20);
                P2 = P2 * 2 + 1;	//按下非第一个按键时,就把 P2 乘2再加一,使得 P2 中的0位向左移动一位
            }
    		if(P2 == 0xFF) goto there;	//假如灯又全没了就回到开始的地方
        }
    }
    void Delay(int xms)		//@12.000MHz
    {
    	unsigned char i, j;
    	while(xms)
    	{
    		i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    		xms--;
    	}
    }
    

    或者直接使用左移位运算( 更加优雅,省去了 goto )

    void main(void)
    {
        unsigned char LEDnum = 0;
        while(1)
        {
            if(P3_1 == 0)
            {
                Delay(20);
                while(P3_1 == 0);		
                Delay(20);
                LEDnum++;
                if(LEDnum>=8)
                    LEDnum = 0;
                P2 = ~(0x01<<LEDnum);
            }
            /*
            if(P3_0 == 0)			//同理,稍加修改可使得按下第二个按键时候灯发生左移
            {
                Delay(20);
                while(P3_0 == 0);		
                Delay(20);
                if(LEDnum == 0)
                    LEDnum = 7;
                else
                	LEDnum--;
                P2 = ~(0x01<<LEDnum);
            }
            */
        }
    }
    

注意:在STC89C52RC中,独立按键第一个和第二个是反的,所以P3_1代表第一个,P3_0代表第二个

IO接口代表按键
P3_1第一个
P3_0第二个
P3_2第三个
P3_3第四个
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值