qq_45379364 2024-03-14 23:55 采纳率: 82.9%
浏览 6
已结题

关于按键控制LED流水灯

请教,现在有K1按键,按一次K1,LED1亮,松开K1,LED1熄灭,再按一次K1,LED2亮,松开熄灭,再按一次K1,LED3亮,松开熄灭,再按一次又是LED1亮,如此这般

用的是51单片机

  • 写回答

6条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-14 23:56
    关注

    qq_45379364 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    要实现按键控制LED流水灯,你可以按照以下步骤进行:

    1. 确定硬件连接:将LED1、LED2、LED3连接至51单片机的GPIO引脚,将K1按键连接至另一个GPIO引脚。

    2. 初始化GPIO引脚:在主程序中,使用相应的指令初始化LED1、LED2、LED3以及K1 GPIO引脚。

    3. 编写按键检测逻辑:使用中断或轮询的方式检测K1按键状态的变化,当检测到按键按下时,进入相应的处理逻辑。

    4. 编写流水灯控制逻辑:使用一个变量(比如state)来记录当前流水灯的状态,初始状态为1(LED1亮),当接收到K1按键按下的信号时,更新state变量的值。根据state的值来控制相应的LED亮灭状态。

    5. 使用延时函数:在流水灯控制逻辑中,使用延时函数(如delay_ms)来控制流水灯的亮灭时间。

    6. 进入主循环:在主循环中进行按键和流水灯的控制逻辑处理。

    下面是示例代码:

    #include <reg51.h>
    
    // 定义LED引脚和K1引脚
    sbit LED1 = P1^0;
    sbit LED2 = P1^1;
    sbit LED3 = P1^2;
    sbit K1 = P2^0;
    
    // 延时函数
    void delay_ms(unsigned int ms) {
        unsigned int i, j;
        for (i = 0; i < ms; i++) {
            for (j = 0; j < 1000; j++);
        }
    }
    
    void main() {
        unsigned char state = 1; // 初始状态为LED1亮
    
        LED1 = 0; // 初始状态熄灭LED1
        LED2 = 0; // 初始状态熄灭LED2
        LED3 = 0; // 初始状态熄灭LED3
        
        while (1) {
            if (K1 == 0) { // 检测到按键按下
                delay_ms(10); // 延时去抖动
                if (K1 == 0) { // 确认按键按下
                    state++; // 更新状态
                    if (state > 3) {
                        state = 1; // 如果状态超过3,重新回到状态1
                    }
                    while (K1 == 0); // 等待按键松开
                }
            }
            
            // 根据状态控制LED
            if (state == 1) {
                LED1 = 1; // LED1亮
                LED2 = 0;
                LED3 = 0;
            }
            else if (state == 2) {
                LED1 = 0;
                LED2 = 1; // LED2亮
                LED3 = 0;
            }
            else if (state == 3) {
                LED1 = 0;
                LED2 = 0;
                LED3 = 1; // LED3亮
            }
        }
    }
    

    该代码可以实现按下K1按键时,依次控制LED1、LED2和LED3亮灭,并且循环往复。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月16日
  • 创建了问题 3月14日

悬赏问题

  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗