找回密码
 立即注册
查看: 1013|回复: 0

位移流水灯,位移多少次,闪亮多少次,双层for循环

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2024-11-09 21:53:17

6

主题

6

回帖

450

积分

中级会员

积分
450
发表于 2023-7-12 12:48:00 | 显示全部楼层 |阅读模式
分享学习过程也是一种进步,自己给你自己出题目然后去完成,不断夯实基础,非常有成就感。

// @神自不凡 2022/7/12 新手报到第四例
// 1.共阳极8个LED接P7端口,每个LED接限流电阻430Ω,公共正极接VCC,低电平点亮,高电平熄灭。
// 2.P7^0=LED1,P7^1=LED2,P7^2=LED3,P7^3=LED4,P7^4=LED5,P7^5=LED6,P7^6=LED7,P7^7=LED8.
// 3.采用开发板STM32G12K128,设置频率35MHz
/* 4.实现功能:位移效果,LED1亮灭一次各持续0.5秒,然后LED2亮灭2次各持续0.5秒,
     再然后LED3亮灭3次各持续0.5秒,以此类推直到LED8亮灭8次各持续0.5秒,
     在之后保持全灭2S,程序循环执行LED的亮灭过程.


#include <STC32G.H>
#include <config.h>
#include <delay.h>

u8 x,y;//x控制位移,y控制亮灭次数

void main()
{
       
        WTST= 0;                 //设置等待时间为0个时钟,CPU运行速度最快
        P7M0=0x00;  P7M1=0x00;  //设置P7口为准双向
        while(1)
        {
                       
   for(x=0;x<8;x++)  //第一个for循环
                {
                        P7=~(0x01<<x);  //赋值0x01=0000 0001 取反=1111 1110
       delayms(500);        //LED亮保持0.25S
                        P7=0xff;                          //LED灭
                         delayms(500);  //LED灭保持0.25S  这样就完成1次亮灭的操作过程
//过程见解如下:               
/*  当x=1 程序完成一个for循环第一次,这时LED1已经执行了亮灭一次0.5s的操作了,
                然后进入到第二个for循环                       
                初值y为0,满足条件y<x,执行y自加1,得到y为1,不满足条件y<x
                就不会再次执行LED1亮灭一次的操作。然后退出第二个for循环,
                这样就是看到的效果LED1亮灭一次然后到LED2亮灭的操作。       
                (由于单片机运行速度非常快LED1亮灭完成再到LED2执行亮灭,间隔不一定是0.5s
                        可能是0.5000001s或者0.4999998啥的,单片机频率有误差,延时有误差,所以忽略不计)
                       
                当x=2 程序完成第一个for循环第二次,LED1亮灭1次一次完成了,这时赋值然后左移2位,变成1111 1101,
                这时LED2执行了亮灭第一次0.5s的操作了,
                然后进入到第二个for循环,初值y为0,满足条件y<x,执行y自加1,得到y为1,
                就会再次执行LED2亮灭一次的操作。这时LED2就执行了亮灭2次的操作,
                在次执行y自加1,得到y为2,不满足y<x,就会退出第二个for循环,
                这样就是看到效果LED2亮灭2次的操作。
                       
                当x=3 程序完成第一个for循环第三次,LED1亮灭1次完成了,LED2亮灭2次完成了,
                这时赋值然后左移3位,变成1111 1011,这时LED3执行了亮灭第一次0.5s的操作了,
                然后进入到第二个for循环,初值y为0,满足条件y<x,执行y自加1,得到y为1,
                就会再次执行LED3亮灭一次的操作。这时LED3就执行了亮灭2次的操作,
                再次执行y自加1,得到y为2,满足y<x,
                又在次执行LED3亮灭一次的操作。这时LED3就执行了亮灭3次的操作,
                在次执行y自加1,得到y为3,不满足y<x,就会退出第二个for循环,
                这样就是看到效果LED3亮灭3次的操作。       
    |
                |
                |
    直到x=8完成,LED8亮灭8次的操作。
*/
                        for(y=0;y<x;y++)        //第二个for循环               
      {
                                P7=~(0x01<<x);
                                  delayms(500);       
                          P7=0xff;
                            delayms(500); //LED亮灭的操作过程
                        }
                }
                P7=0xff;       //0xff=1111 1111高电平熄灭所有LED
                delayms(1500); //由于LED8第八次熄灭持续了0.5s,所以LED全灭保持1.5s就会得到要求的2s全熄灭
        }
}



位移闪亮.zip

38.39 KB, 下载次数: 51

程序效果.mp4

49.87 MB, 下载次数: 78

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 20:47 , Processed in 0.115577 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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