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

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2025-05-02 03:29:52
已绑定手机

13

主题

75

回帖

335

积分

中级会员

积分
335
发表于 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方面的知识与经验。
欢迎看到此贴的坛友针对文中代码内容发表意见。
欢迎坛友提出别的方法来实现流水灯,希望能看到更多的实现方法。


学习MCU
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:08 , Processed in 0.104630 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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