qq_45379364 2024-03-16 12:01 采纳率: 82.9%
浏览 13
已结题

关于一个按键控制三个LED的问题

描述:
有K1按键,LED1,LED/2,LED-3,初始状态3个灯全灭,按第一次K1,按住LED1亮,松开熄灭,再按一次K1,不松开LED2一直亮,松开熄灭,再按一次K1,按住不放LED3亮,松开熄灭
断电打开后总是从一灯开始。
用的C51单片机

  • 写回答

5条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-16 12:02
    关注

    qq_45379364 中午好🌞🌞🌞
    本答案参考ChatGPT-3.5

    要实现这个按键控制三个LED的功能,可以按以下步骤进行:

    步骤1:定义和初始化变量:使用一个整型变量来记录按键的状态和控制LED的亮灭。初始时,将变量置为0,表示三个LED都是熄灭状态。

    步骤2:设置按键检测功能:使用外部中断功能来检测按键状态的变化。当按键按下时,持续检测按键状态,直到按键松开。

    步骤3:根据按键状态控制LED:根据按键状态变化的次数,控制相应的LED亮灭情况。

    - 第一次按下:将LED2和LED3熄灭,将LED1点亮。
    
    - 第二次按下:保持LED1熄灭,将LED3熄灭,将LED2点亮。
    
    - 第三次按下:保持LED1和LED2熄灭,将LED3点亮。
    
    - 第四次按下:将LED1、LED2和LED3都熄灭。
    

    步骤4:断电保存状态:为了确保重启后从正确状态开始,需要在断电前保存当前按键状态。使用非易失性存储器将按键状态保存,以便在下次开机时恢复。

    步骤5:断电恢复状态:在上电时读取保存的按键状态,并根据该状态进行相应的LED控制。

    以下是一个简单的C语言示例代码,演示了如何实现按键控制三个LED的功能:

    #include <reg51.h>
    
    sbit LED1 = P1^0;
    sbit LED2 = P1^1;
    sbit LED3 = P1^2;
    sbit K1 = P3^2;
    
    unsigned char ledState = 0;
    
    void delay() {
        unsigned int i, j;
        for (i = 0; i < 100; i++) {
            for (j = 0; j < 1000; j++) {
                // 延时循环,增加适当延时时长
            }
        }
    }
    
    void main() {
        K1 = 1; // 按键上拉
        EA = 1; // 总中断使能
        EX1 = 1; // 外部中断1使能
    
        ledState = readLedStateFromNonVolatileMemory(); // 从非易失性存储器中读取保存的状态
        switch (ledState) {
            case 1:
                LED1 = 1;
                LED2 = 0;
                LED3 = 0;
                break;
            case 2:
                LED1 = 0;
                LED2 = 1;
                LED3 = 0;
                break;
            case 3:
                LED1 = 0;
                LED2 = 0;
                LED3 = 1;
                break;
            default:
                LED1 = 0;
                LED2 = 0;
                LED3 = 0;
                break;
        }
    
        while (1) {
            delay();
        }
    }
    
    void externalInterrupt1() interrupt 2 {
        // 延时去抖动
        delay();
        if (K1 == 0) {
            // 检测按键是否按下
            delay();
            if (K1 == 0) {
                // 检测确认按键确实按下(去抖动)
                switch (ledState) {
                    case 0:
                        LED1 = 1;
                        ledState = 1;
                        break;
                    case 1:
                        LED1 = 0;
                        LED2 = 1;
                        ledState = 2;
                        break;
                    case 2:
                        LED2 = 0;
                        LED3 = 1;
                        ledState = 3;
                        break;
                    case 3:
                        LED1 = 0;
                        LED2 = 0;
                        LED3 = 0;
                        ledState = 0;
                        break;
                    default:
                        break;
                }
            }
        }
        writeLedStateToNonVolatileMemory(ledState); // 将状态保存到非易失性存储器中
    }
    

    请注意,上述代码是一个简化的示例,可能还需要进一步的逻辑判断和完善,以满足具体的应用需求。同时,非易失性存储器的具体使用方式和接口可能会因不同的单片机型号而有所差异,请根据实际情况进行调整和修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分