我心飞扬 发表于 2025-4-12 11:57:52

一条语句的正向流水灯(核心语句)--在擎天柱核心板上实现

背景介绍:

近期跟着Ai8051U的教学视频学习,用的是注册论坛会员时免费包邮的擎天柱核心板(32/8位Ai8051U-32K64的MCU)。
在做流水灯时出现问题,主要原因是自己是新手,基础知识与经验不足。
在帖子:“请教高手:擎天柱核心板-Ai8051U-32K64-实现流水灯程序为何显示有些乱?”有详细描述。
参考过国芯官网和论坛中的视频和代码,见到别人以各种方法实现流水灯,逐个点亮法,移位法,数组法等等,各有优势。
通过前几天对代码的学习,想到可以用一条语句实现流水灯,于是编写代码并在擎天柱核心板顺利实现。

思路:

代码尽可能简洁,逻辑上正确,能用一条语句实现就只用一条语句实现。

代码:

//一条语句的正向流水灯
//在擎天柱核心板(32位MCU Ai8051U-32K64)上实现
//作者:我心飞扬
//时间:2025年4月12日

#include "ai8051u.h"

void Delay500ms(void)      //@40.000MHz
{
      unsigned char data i = 76, j = 255, k = 241;
      _nop_(); _nop_();
      while(--i) {while(--j) {while(--k);};};
}

void main(void)
{
      P2M0 = 0; P2M1 = 0;
      while(1)
      {
                P2 = (0xff == P2) ? 0xfe : ~((~P2) << 1);      //正向流水灯
                Delay500ms();
      }
}

总结:

程序逻辑功能的实现方法有多种,每种都有其优点,也有其不足。
掌握的方法多了才能游刃有余。
这也是从新手到高手要不断积累的过程。
借鉴着别的类别的工作经验,我正在积累MCU方面的知识与经验。
欢迎看到此贴的坛友针对文中代码内容发表意见。
欢迎坛友提出别的方法来实现流水灯,希望能看到更多的实现方法。


国芯人工智能 发表于 2025-4-12 11:58:00

在擎天柱核心板上实现一条语句的正向流水灯,确实是一个简洁而高效的思路。以下是对该代码的详细解析与优化建议:

代码解析

1. 延时函数 Delay500ms:
该函数通过嵌套的 while 循环实现延时,延时时间约为500ms。延时函数在流水灯中起到控制灯亮灭时间的作用。
参数 i, j, k 的值通过实验调整,以达到所需的延时效果。

2. 主函数 main:
P2M0 = 0; P2M1 = 0;:设置P2口为推挽输出模式,确保P2口能够驱动LED。
while(1):无限循环,确保流水灯持续运行。
P2 = (0xff == P2) ? 0xfe : ~((~P2):这是实现流水灯的核心语句。该语句通过条件运算符 ? : 判断P2口当前状态,若P2口全为高电平(0xff),则将其设置为0xfe(即最低位为低电平,其余为高电平),否则将P2口的值取反后再取反,实现灯的流水效果。

优化建议

1. 延时函数优化:
可以使用定时器中断来实现更精确的延时,减少CPU资源的占用。
例如,使用定时器0或定时器1,设置定时器初值,通过中断服务程序实现延时。

2. 核心语句优化:
核心语句虽然简洁,但可读性较差。可以考虑使用更直观的移位操作来实现流水灯效果。
例如,使用 `P2 = (P2

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 一条语句的正向流水灯(核心语句)--在擎天柱核心板上实现