DEVIN_LI 发表于 2024-8-5 13:47:46

闪烁按钮



大家好,我想实现按一下P3.5按钮,P2.7灯一直闪烁。
再按一下P3.5按钮,灯全部关闭。
这个程序怎么写,现在关不了!!!头疼



Lkck8210 发表于 2024-8-5 14:07:56

加一个标志位取判断
vois main()
{
        while(1)
        {
                if(!P35)
                {
                        Delay1ms(20);
                        if(!P35)
                        {
                                Flash_En = !Flash_En;
                                while(!P35);
                        }
                }
                if(Flash_En)
                {
                        P27 = !P27;
                        Delay1000ms(1);
                }
                else
                {
                        P27 = 1;
                }
        }
}

DEVIN_LI 发表于 2024-8-5 14:15:21

Lkck8210 发表于 2024-8-5 14:07
加一个标志位取判断

感觉这样都点复杂阿,while 嵌套是不是有弊端?

一笔长空 发表于 2024-8-5 14:32:59

这不if(!P35)退出后if(!P35&P27)立马又成立了

Lkck8210 发表于 2024-8-5 14:35:24

DEVIN_LI 发表于 2024-8-5 14:15
感觉这样都点复杂阿,while 嵌套是不是有弊端?


网老四 发表于 2024-8-5 14:38:31

这个容易做,
闪灯不要用大延时,声明大循环计数器变量和闪灯频率计数器,大循环计数器做时间基准,再声明个闪灯标志,按键有效就把闪灯标志取反,
大循环里不断判断闪灯标志,若闪灯标志有效就处理闪灯部分,否则关闭灯,
闪灯部分利用闪灯计数器作判断,闪灯计数器大于某值就亮灯,小于某值就灭灯,
这种简单的时间片断处理方式没有大延时影响主循环运行,不影响其他功能处理,是很常用的手法

soma 发表于 2024-8-5 14:44:02

这个AI就能生成吧,建议最后加个while (!P35)等待按键释放。

网老四 发表于 2024-8-5 15:12:59

本帖最后由 网老四 于 2024-8-5 15:24 编辑

uint main_loop_count=0;//大循环计数器,作为软件定时基准,备用
uint flash_count=0;          //闪灯计数器
bit LED_flash_flag=0;       //闪灯标志
bit P35_old;//按键状态缓存

void main(void)
{
    while(1)
   {
      if((P35==0)&&(P35_old==1))LED_flash_flag=!LED_flash_flag;   //检测按键按下前沿,闪灯标志取反
      P35_old=P35;    //保存当前按键状态
      if((LED_flash_flag)&&(flash_count<1000))P27=0;//亮灯
      else P27=1;   //灭灯
      (flash_count<2000)?(flash_count++):(flash_count=0);    //闪灯计数器累加并限幅,控制闪灯占空比和周期
      main_loop_count++;   //大循环计数器累加
      Delay_ms(1);   //粗略的大循环周期控制,也可以改用硬件定时器嘀嗒计数来实现精确控制
   }
}

DEVIN_LI 发表于 2024-8-5 16:29:27

感谢各位指导{:handshake:}

DEVIN_LI 发表于 2024-8-5 16:29:45

网老四 发表于 2024-8-5 15:12


详细
页: [1] 2
查看完整版本: 闪烁按钮