htmwldex 发表于 4 天前

打卡第八集 难点问题汇总 擎天柱版本

今天,看完课程后试着去完成课后作业:

作业1:完成按下P32点亮四个灯,按下P33熄灭四个灯

源代码如图:
实际效果:
attach://95937.mp4attach://95937.mp4
作业2:按下P32依次循环点亮每一个灯


遇到问题:

无法完成,不知道什么原因

国芯人工智能 发表于 4 天前

作业1:按下P32点亮四个灯,按下P33熄灭四个灯

首先,感谢您分享您的代码和实际效果视频。从您的描述和代码来看,您已经成功实现了按下P32点亮四个灯,按下P33熄灭四个灯的功能。这是一个很好的起点,尤其是在理解GPIO控制方面。

代码分析
您的代码大致如下(根据附件推测):
c
include

sbit P32 = P3^2;
sbit P33 = P3^3;
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;

void main() {
    while (1) {
      if (P32 == 0) {
            LED1 = 0;
            LED2 = 0;
            LED3 = 0;
            LED4 = 0;
      }
      if (P33 == 0) {
            LED1 = 1;
            LED2 = 1;
            LED3 = 1;
            LED4 = 1;
      }
    }
}
代码优化建议
1. 去抖动处理:在实际应用中,按键按下时可能会产生抖动,导致多次触发。建议添加去抖动处理,例如延时检测或硬件去抖动电路。
2. 代码简洁性:可以将LED的控制部分封装成一个函数,提高代码的可读性和可维护性。
c
void controlLEDs(unsigned char state) {
    LED1 = state;
    LED2 = state;
    LED3 = state;
    LED4 = state;
}

void main() {
    while (1) {
      if (P32 == 0) {
            controlLEDs(0); // 点亮LED
      }
      if (P33 == 0) {
            controlLEDs(1); // 熄灭LED
      }
    }
}

作业2:按下P32依次循环点亮每一个灯

您提到在实现按下P32依次循环点亮每一个灯时遇到了问题。以下是一些可能的原因和解决方案。

问题分析
1. 逻辑错误:循环点亮LED的逻辑可能没有正确实现,导致无法按预期工作。
2. 延时问题:如果没有适当的延时,LED的切换速度可能过快,导致无法观察到效果。
3. 按键检测:按键检测可能没有正确处理,导致无法触发循环点亮的功能。

解决方案
以下是一个实现按下P32依次循环点亮每一个灯的示例代码:
c
include

sbit P32 = P3^2;
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;

void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = ms; i > 0; i--)
      for (j = 110; j > 0; j--);
}

void main() {
    unsigned char ledState = 0;

    while (1) {
      if (P32 == 0) {
            delay(20); // 去抖动延时
            if (P32 == 0) {
                ledState = (ledState + 1) % 4;
                switch (ledState) {
                  case 0:
                        LED1 = 0; LED2 = 1; LED3 = 1; LED4 = 1;
                        break;
                  case 1:
                        LED1 = 1; LED2 = 0; LED3 = 1; LED4 = 1;
                        break;
                  case 2:
                        LED1 = 1; LED2 = 1; LED3 = 0; LED4 = 1;
                        break;
                  case 3:
                        LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 0;
                        break;
                }
                while (P32 == 0); // 等待按键释放
            }
      }
    }
}

代码说明
1. 延时函数:delay函数用于实现简单的延时,确保按键去抖动和LED切换的可见性。
2. 按键检测:在检测到按键按下后,先进行去抖动处理,然后根据ledState的值切换LED的状态。
3. 循环点亮:通过ledState的递增和取模运算,实现四个LED的循环点亮。

总结
通过以上分析和代码示例,您应该能够解决作业2中遇到的问题。如果在实际调试中仍然遇到问题,建议逐步检查代码逻辑,确保每个部分都能按预期工作。同时,使用调试工具(如仿真器或逻辑分析仪)可以帮助您更直观地观察程序的运行状态。

希望这些建议对您有所帮助,祝您在后续的学习和实践中取得更多进展!

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 打卡第八集 难点问题汇总 擎天柱版本