C51单片机之按键控制LED【02】

前言

1.独立按键

在这里插入图片描述
当按下时,金属弹片下压,使得中间3个点连接一起。

查看原理图
在这里插入图片描述

#include <REGX52.H> // REGX52有关于位定义的,而REG52则没有,需要自己sbit定义
在这里插入图片描述

2.按下K1点亮LED

#include <REGX52.H> // REGX52有关于位定义的,而REG52则没有,需要自己sbit定义
#include <INTRINS.H>

// 延时xms
void Delay1ms(unsigned int xms) //@11.0592MHz
{
    unsigned char i, j;
    while (xms) // while里面是延时1ms的代码
    {
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j)
                ;
        } while (--i);
        --xms;
    }
}
void test1() 
{
    while (1)
    {
        if(P3_1 == 0) // 按下按键K1 点亮LED
        {
            P2_0 = 0;
        }
        else
        {
            P2_0 = 1;
        }
    }
}

void main()
{
    test1();
}

在这里插入图片描述
利用软件延时消抖。

if(P3_1 == 0)
{
	Delay1ms(20); // 软件延时消抖
	while (P3_1 == 0); // 检测松手
	Delay1ms(20); // 延时消抖
}

3.按键控制LED状态

#include <REGX52.H> // REGX52有关于位定义的,而REG52则没有,需要自己sbit定义
#include <INTRINS.H>

// 延时xms
void Delay1ms(unsigned int xms) //@11.0592MHz
{
    unsigned char i, j;
    while (xms--) // while里面是延时1ms的代码
    {
        _nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j)
                ;
        } while (--i);
    }
}


// 按下按键才点亮,再按一次就熄灭
void test2()
{
    while (1)
    {
        if(P3_1 == 0)
        {
            Delay1ms(20); // 软件延时消抖
            while (P3_1 == 0); // 检测松手
            Delay1ms(20); // 延时消抖

            P2_0 = ~P2_0;
        }
    }
    
}
void main()
{
    test2();
}

4.按键控制LED移位

// 独立按键控制LED移位
// 所使用开发板D1~D8是从左到右的
// 按下K1右移,按下K2左移
void test4()
{
    unsigned char LEDNum = 0;
    P2 = 0xFE;// 上电时要让D1点亮
    while (1)
    {
        if (P3_1 == 0)
        {
            // 软件消抖
            Delay1ms(20);
            while (P3_1 == 0)
                ; // 检测松手
            Delay1ms(20);

            LEDNum++;
            if (LEDNum >= 8)
            {
                LEDNum = 0;
            }

            // 0x01 << 1 -->  0000 0010 取反 --> 1111 1101
            // 0x01 << 2 -->  0000 0100 取反 --> 1111 1011
            // ...
            // 0x01 << 7 -->  1000 0000 取反 --> 0111 1111
            // 0x01 << 8 -->  0000 0000 取反 --> 1111 1111
            // 因此当左移到8位时,需要重新从0开始移位
            P2 = ~(0x01 << LEDNum);
        }

        // 按下K2右移
        if (P3_0 == 0)
        {
            // 软件消抖
            Delay1ms(20);
            while (P3_0 == 0)
                ; // 检测松手
            Delay1ms(20);

            if(LEDNum == 0)
            {
                LEDNum = 7; // 0再--就变成255了
            }
            else
            {
                LEDNum--;
            }

            P2 = ~(0x01 << LEDNum);
        }
    }
}
void main()
{
    test4();
}

尾声

🌹🌹🌹

写文不易,如果有帮助烦请点个赞~ 👍👍👍

Thanks♪(・ω・)ノ🌹🌹🌹

😘😘😘

👀👀由于笔者水平有限,在今后的博文中难免会出现错误之处,本人非常希望您如果发现错误,恳请留言批评斧正,希望和大家一起学习,一起进步ヽ( ̄ω ̄( ̄ω ̄〃)ゝ,期待您的留言评论。
附GitHub仓库链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值