栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

前言 1.独立按键


当按下时,金属弹片下压,使得中间3个点连接一起。

查看原理图

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

2.按下K1点亮LED
#include  // REGX52有关于位定义的,而REG52则没有,需要自己sbit定义
#include 

// 延时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有关于位定义的,而REG52则没有,需要自己sbit定义
#include 

// 延时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仓库链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号