stm32—基础二跑马灯以及呼吸灯

                                                                                                 跑马灯及其呼吸灯      

                   跑马灯 

    1.需要在项目中添加GPIO的驱动(前篇已经讲到)

                     每个项目放到的文件夹可能不一样,所以具体看你自己的项目,前篇更为详细,这个项目内容有点乱

                   

         2.修改配置文件

        

                                     

                现在已经初始化GPIOB5和GPIOE5,根据stm32的电路图我们可以知道GPIOB5和GPIOE5分别控制led0(红灯)和led1(绿灯)

                          

                 编写或者定义功能函数

                   

                 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)来判断key_up按键是否有按下,当有按键按下时就 GPIO_SetBits(GPIOE,GPIO_Pin_5);或者

 GPIO_ResetBits(GPIOE,GPIO_Pin_5);来置位或者重置led1(GPIOE绿灯)

                     2.硬件连接

                              J-OB 黄线连接SWD对应板子上连接SWDIO,连接CLK的橙色对应连接板子上SWDCLK,红线连接GND的对应连接板子上GND(线的颜色没影响,

                            主要时要对应连接)

                                      

                                           

                       呼吸灯

                      以上连接都不变,只需要将主函数中的程序修改即可

                     以下为呼吸灯的程序

                       void LedOnOff(uint16_t t,uint16_t i,uint8_t no)
                     {
                                   GPIO_ResetBits(GPIOB,GPIO_Pin_5);//bsp_LedOn(no);
                                   GPIO_SetBits(GPIOE,GPIO_Pin_5);     //bsp_LedOff(no);
                                   delay_us(i);              //bsp_DelayUS(i);

                                    GPIO_SetBits(GPIOB,GPIO_Pin_5);     //bsp_LedOff(no);
                                    GPIO_ResetBits(GPIOE,GPIO_Pin_5);
                                     delay_us(t-i); //bsp_DelayUS(t-i);

                      }


                      int main(void)
                    {
                                 int i=0;
                                 delay_init();    //???????
                                 LED_Init();          //???LED??
                                 while(1)
                                {
              
                                       for(i=1; i<25000; i+=416)
                                            LedOnOff(25000,i,3);
                                      for(i=25000; i>1; i-=416)
                                           LedOnOff(25001,i,3);


                                 }
                    }

                   通用型方法二
                   /*
                     原理分析,模拟人体呼吸,吸气和呼气各占1.5S,人眼的图像滞留时间0.04s(1/24帧画面)
                    按最快0.04s算,就是40ms。亮0.02S,灭0.02s,人眼看到的应该是一直亮(可以实验)
                    呼吸灯,就是改变这40ms中,亮和灭所占的百分比。
                    亮的百分比多,人眼看到的就亮,反之就是暗(实验,设置20ms一个周期,20ms内调整亮和灭的比例)
                    因此程序设计:1.5S需要1500/20=75个周期,75个周期中,亮度百分比有0%增长到100%,因此每个周期增长
                    时间为20ms/75=266us(点亮)。熄灭的原理,正好相反,熄灭时间增长。
                     */
                    #define B_length 3000000
                    #define NUM 30000
                   #define FR NUM/(B_length/NUM)
                    int main(void)
                   {
                            int i=0;
                            delay_init();    //初始化延时函数
                            LED_Init();          //初始化LED端口
                            while(1)
                            {
                                       //   GPIO_ResetBits(GPIOB,GPIO_Pin_5);  //LED0对应引脚GPIOB.5拉低,亮  等同LED0=0;
                                      //   GPIO_SetBits(GPIOE,GPIO_Pin_5);   //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
                                      //    GPIO_SetBits(GPIOB,GPIO_Pin_8);
                                      //   delay_ms(300);       //延时300ms
                                      //   GPIO_SetBits(GPIOB,GPIO_Pin_5);    //LED0对应引脚GPIOB.5拉高,灭  等同LED0=1;
                                      //   GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
                                     //    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
                                     //   delay_ms(300);                     //延时300ms

                                       for(i=1; i<NUM+1; i+=FR)
                                               LedOnOff(NUM+1,i,3);
                                       for(i=NUM; i>1; i-=FR)
                                              LedOnOff(NUM+1,i,3);
                                                delay_ms(500);


                                  }
                     }            



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值