找回密码
 立即注册
查看: 26|回复: 1

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-28 08:56:43
已绑定手机

6

主题

4

回帖

68

积分

注册会员

积分
68
发表于 4 天前 | 显示全部楼层 |阅读模式
今天,看完课程后试着去完成课后作业:

作业1:完成按下P32点亮四个灯,按下P33熄灭四个灯
课堂作业1.png
源代码如图:
实际效果:
https://www.stcaimcu.com/forum.php?mod=attachment&aid=OTU5Mzd8YmFkOTE0MzgwNTljZjU3NWJjYjllN2VkMDc1MWUxZDl8MTc0NjEyNDIzOQ%3D%3D&request=yes&_f=.mp4
作业2:按下P32依次循环点亮每一个灯


遇到问题:

为啥无法识别P3i的灯呢

为啥无法识别P3i的灯呢

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

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 4 天前 | 显示全部楼层
作业1:按下P32点亮四个灯,按下P33熄灭四个灯

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

代码分析
您的代码大致如下(根据附件推测):
  1. c
  2. include
  3. sbit P32 = P3^2;
  4. sbit P33 = P3^3;
  5. sbit LED1 = P1^0;
  6. sbit LED2 = P1^1;
  7. sbit LED3 = P1^2;
  8. sbit LED4 = P1^3;
  9. void main() {
  10.     while (1) {
  11.         if (P32 == 0) {
  12.             LED1 = 0;
  13.             LED2 = 0;
  14.             LED3 = 0;
  15.             LED4 = 0;
  16.         }
  17.         if (P33 == 0) {
  18.             LED1 = 1;
  19.             LED2 = 1;
  20.             LED3 = 1;
  21.             LED4 = 1;
  22.         }
  23.     }
  24. }
复制代码
代码优化建议
1. 去抖动处理:在实际应用中,按键按下时可能会产生抖动,导致多次触发。建议添加去抖动处理,例如延时检测或硬件去抖动电路。
2. 代码简洁性:可以将LED的控制部分封装成一个函数,提高代码的可读性和可维护性。
  1. c
  2. void controlLEDs(unsigned char state) {
  3.     LED1 = state;
  4.     LED2 = state;
  5.     LED3 = state;
  6.     LED4 = state;
  7. }
  8. void main() {
  9.     while (1) {
  10.         if (P32 == 0) {
  11.             controlLEDs(0); // 点亮LED
  12.         }
  13.         if (P33 == 0) {
  14.             controlLEDs(1); // 熄灭LED
  15.         }
  16.     }
  17. }
复制代码

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

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

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

解决方案
以下是一个实现按下P32依次循环点亮每一个灯的示例代码:
  1. c
  2. include
  3. sbit P32 = P3^2;
  4. sbit LED1 = P1^0;
  5. sbit LED2 = P1^1;
  6. sbit LED3 = P1^2;
  7. sbit LED4 = P1^3;
  8. void delay(unsigned int ms) {
  9.     unsigned int i, j;
  10.     for (i = ms; i > 0; i--)
  11.         for (j = 110; j > 0; j--);
  12. }
  13. void main() {
  14.     unsigned char ledState = 0;
  15.     while (1) {
  16.         if (P32 == 0) {
  17.             delay(20); // 去抖动延时
  18.             if (P32 == 0) {
  19.                 ledState = (ledState + 1) % 4;
  20.                 switch (ledState) {
  21.                     case 0:
  22.                         LED1 = 0; LED2 = 1; LED3 = 1; LED4 = 1;
  23.                         break;
  24.                     case 1:
  25.                         LED1 = 1; LED2 = 0; LED3 = 1; LED4 = 1;
  26.                         break;
  27.                     case 2:
  28.                         LED1 = 1; LED2 = 1; LED3 = 0; LED4 = 1;
  29.                         break;
  30.                     case 3:
  31.                         LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 0;
  32.                         break;
  33.                 }
  34.                 while (P32 == 0); // 等待按键释放
  35.             }
  36.         }
  37.     }
  38. }
复制代码

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:30 , Processed in 0.150619 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表