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

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

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

6

主题

6

回帖

450

积分

中级会员

积分
450
发表于 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, 下载次数: 64

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 05:20 , Processed in 0.167804 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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