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

新人报道第三例。8位正反往复流水灯,有注释

[复制链接]
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    6

    主题

    7

    回帖

    334

    积分

    中级会员

    积分
    334
    发表于 2023-7-10 18:16:47 | 显示全部楼层 |阅读模式
    改了延时才发现与自己的预期不符合,没人教,只能自己实验了,附注释,学了使我快乐。
    {:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

    //                @布丁局长2022/11/15 @神自不凡 2023/07/10修改新增注释以及见解
    //                8位流水灯实验-正反往复间隔2秒,程序再次执行也是间隔2000ms,不同的参数间隔有差异
    //                LED1->LED8 逐个点亮、熄灭,LED1->LED8逐个点亮、熄灭,点亮时间2000ms,本实验采用 移位法
    //                LED灯珠由8个LED共阳极(正极)互接的公共端,每个LED配一个限流电阻。公共端接VCC,低电平点亮。
    //                LED引脚定义:P70=LED1,P71=LED2,P72=LED3,P73=LED4,P74=LED5,P75=LED6,P76=LED7,P77=LED8
    //                本实验采用准双向口模式,低电平点亮、高电平熄灭
    //                实验开发板:STC32G12K128-LQFP64  非官方板子 设定频率35MHz
    //   
    #include <STC32G.H>
    #include <config.h>
    #include <delay.h>

    void main()
    {
            u8 i;
           
            WTST = 0;                //设置等待时间为0个时钟,CPU运行速度最快
           
            P7M1 = 0x00;P7M0 = 0x00;                //设置P2口为准双向口模式
            //00:准双向口 01:推挽输出 10:高阻输入 11:开漏输出
           
            while(1)
            {
                    for(i = 0;i < 8;i++)                        //正向流水 LED1开始点亮
                    {
                            P7 = ~(0x01 << i);    //赋值=0000 0001 取反=1111 1110 然后P7^0低电平 LED1点亮保持2000ms,熄灭 i=1
                                                  //1111 1101 P7^1低电平,LED2点亮保持2000ms,熄灭 i=2                           
                                                  //1111 1011 P7^2低电平,LED3点亮保持2000ms,熄灭 i=3       
                                                  //1111 0111 P7^3低电平,LED4点亮保持2000ms,熄灭 i=4       
                                                                                            //1110 1111 P7^4低电平,LED5点亮保持2000ms,熄灭 i=5               
                                                  //1101 1111 P7^5低电平,LED6点亮保持2000ms,熄灭 i=6       
                                                   //1011 1111 P7^6低电平,LED7点亮保持2000ms,熄灭 i=7       
                                                  //0111 1111 P7^7低电平,LED8点亮保持2000ms,熄灭 i=8       
                                                  //1111 1111 P7^7低电平,LED全熄灭保持2000ms,    i=9
                            /* 可以看出:
                            当i=7,LED7点亮保持2000ms,熄灭,LED8不亮保持2000ms之后程序往下运行,
                            当i=8,LED8点亮保持2000ms,熄灭,之后程序往下运行,
                            当i=9,所有LED灯都熄灭保持2000ms加上LED8熄灭的2000ms就会看到保持熄灭4000ms,之后程序往下执行
                            LED8熄灭>>LED7亮起的时间间隔为4000ms*/
                    delayms(2000);  
                    }
                    for(i = 0;i < 6;i++)                        //反向流水
                                              
                    {
                            P7 = ~(0x40 >> i);    /*当赋值0x80=1000 0000 取反=0111 1111
                                                    现象:当正向流水灯巡行到LED8点亮保持2000ms之后运行到反向流水灯
                                                    LED8再次点亮又保持2000ms。你会看到正向到反向时LED8会点亮4000ms之后
                                                    LED7灯才会开始点亮保持2000ms */
                                                  //当赋值0x40=0100 0000 取反=1011 1111
                                                  /*现象:当正向流水灯巡行到LED8点亮保持2000ms之后运行到反向流水灯
                                                    LED7点亮保持的2000ms。你会看到用正向到反向时LED8会点亮2000ms之后
                                                    LED7灯就会开始点亮保持2000ms.*/
                                                  //赋值0x40=0100 0000 取反=1011 1111  然后P7^7低电平 LED7点亮。i=1 连续右移
                                                  //1101 1111 P7^6低电平,LED6点亮. i=2                                   
                                                  //1110 1111 P7^5低电平,LED5点亮. i=3
                                                  //1111 0111 P7^4低电平,LED4点亮. i=4
                                                                                            //1111 1011 P7^3低电平,LED3点亮. i=5
                                                  //1111 1101 P7^2低电平,LED2点亮. i=6
                                                   //1111 1110 P7^1低电平,LED1点亮. i=7
                                                                                                              //1111 1111 P7^1低电平,LED全灭.  i=8
            /*当i=6,LED2亮保持2000ms,程序再次开始从while(1)执行正向正向流水灯LED1开始亮起保持2000ms,
                            就你会看到LED2>>LED1的间隔保持2000ms,
                    当i=7,        LED1亮保持2000ms,程序再次开始从while(1)正向正向流水灯LED1又开始亮起保持2000ms,
                            你会看到LED2>>LED1的间隔却变成4000ms了,
       当i=8时候,所有LED1亮保持2000ms,之后全部LED熄灭保持2000ms,之后程序再次开始从while(1)执行
                            你就会看到LED亮2000ms,然后熄灭2000ms,在然后亮2000ms才到LED2点亮2000ms*/                       
                            delayms(2000);
                    }
            }
    }
    /*新手分析在注释里面,实验结果也如注释见解,如有错误请多包涵
    忽略机器运行周期时间。善于分析过程,才算开始懂程序,不然抄来
    的永远是抄来的,变一个数据你就无从下手了,要把他变成自己能看
    懂,别人也能看懂,你就开始入门,这才是学了的意义*/

    3.正反位移流水灯.zip

    39.73 KB, 下载次数: 17

    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-3 22:17 , Processed in 0.053675 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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