打印

如何能不占其他,而能单键控制LED循环闪烁

[复制链接]
1567|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fang355|  楼主 | 2017-9-14 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//定义和头文件省略!!!!
void main()
{
// 定义以及初始省略
while(1)   // 主函数就是扫描各个按键
  {
key2();          
  }
}
//----------------KEY2 单键触发功能:  实现按一次开频闪, 再按一次关------------------------------------------
void key2()
{ uchar numcount,count_level=100;
if(k2==0)
   {
         DelayMs(10);//控制开关的消抖
          if(k2==0)
          {        keystep2++;
           if(keystep2==2) keystep2=0;
          // while(!k2);  此句如不注释, 则出现按键无反应
          }

         switch(keystep2)
                {
            case 0:numcount++;
                       if(numcount>=count_level)
                            { numcount=0;
                                led2=1;
                                //keystep2=1;
                                }
                       break ;
            case 1: numcount++;
                       if(numcount>=count_level)
                           {numcount=0;
                            led2=0;
                                //keystep2=0
                           }
                       break;
                }

此上语句不知出现错误哪里 ,想实现按键控制循环闪烁(相当于频闪), 不胜感激 !  请路过的高人指点    谢谢

相关帖子

沙发
feelhyq| | 2017-9-15 12:24 | 只看该作者
led2=1; 这句 改为 led = ~led 或者 led = !led

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fang355 + 1 赞一个!
板凳
liwen_01| | 2017-9-16 08:36 | 只看该作者
好好翻书学吧,看你这程序写的,学生水平

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fang355 + 1 淡定
地板
fang355|  楼主 | 2017-9-16 11:41 | 只看该作者
liwen_01 发表于 2017-9-16 08:36
好好翻书学吧,看你这程序写的,学生水平

  本人就是菜鸟初级! 谢谢前辈多多赐教

使用特权

评论回复
5
fang355|  楼主 | 2017-9-16 11:44 | 只看该作者
feelhyq 发表于 2017-9-15 12:24
led2=1; 这句 改为 led = ~led 或者 led = !led

LED=!LED 是能实现亮灭闪 , 但是我这里的操作 , 是按键控制  在此处实现不了呀

使用特权

评论回复
6
fang355|  楼主 | 2017-9-16 15:05 | 只看该作者
先改进如下  ,利用do  while()语句 可以实现了按键开启闪灯和关闭,  但是闪灯一工作时,本程序中其他的功能就不能继续了。  怎么能能兼顾呢?  期待赐教!

//定义和头文件省略!!!!
void main()
{
// 定义以及初始省略
while(1)   // 主函数就是扫描各个按键
  {
key2();           
  }
}
//----------------KEY2 单键触发功能:  实现按一次开频闪, 再按一次关------------------------------------------
void key2()
{
if(k2==0)
   {
         DelayMs(10);//控制开关的消抖
          if(k2==0)
          {keystep2++;
     if(keystep2==2) keystep2=0;
         while(!k2);
          }
     switch (keystep2)
     { case 0: led2=1;  break;        //case0 为原始0点!!! ,
           case 1:  led2flashing(); break;
       
          }
        }
}
//--------闪烁子程序------------
void led2flashing()
{
do{led2=~led2;
  delay_ms(1000);}
  while(k2==1);
          
}

使用特权

评论回复
7
datouyuan| | 2017-9-16 15:21 | 只看该作者


void led_run()
{
        static uchar numcount=0;
        if(keystep2&0x01)
        {
                if(numcount>=100)
                {
                        led2=!led2;
                }
        }
        else
        {
                led2=1;
        }
}

void key2()
{
        static uchar k2_cnt=0;
        if(k2==0)
        {//按下
                k2_cnt++;
                if(k2_cnt==0) k2_cnt--;
                if(k2_cnt==2)//消抖时间约为2个DelayMs(10)
                {
                        keystep2++;
                }
        }
        else
        {//松开
                k2_cnt=0;
        }
}

void main()
{
        // 定义以及初始省略
        while(1)   // 主函数就是扫描各个按键
        {
                DelayMs(10);
                key2();
                led_run();
        }
}



根据你的功能要求改了你的代码。

一个函数不应该把多个功能混杂在一起,要功能简单单一,好理解。

使用特权

评论回复
评论
fang355 2017-9-28 22:42 回复TA
分析透彻,很有启发 。向你学习!@ 
评分
参与人数 1威望 +3 收起 理由
fang355 + 3 很给力!
8
ayb_ice| | 2017-9-17 08:30 | 只看该作者
每10ms调用一次,本次按键与上次按键比较,是否有变化,有变化且为按下则处理

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fang355 + 1 赞一个!
9
fang355|  楼主 | 2017-9-29 12:29 | 只看该作者
datouyuan 发表于 2017-9-16 15:21
根据你的功能要求改了你的代码。

一个函数不应该把多个功能混杂在一起,要功能简单单一,好理解。

你好 老师!如此下列的程序, 望请解释一下,  我还没有实现呢
if(k2==0)
        {//按下
                k2_cnt++;
                if(k2_cnt==0) k2_cnt--;
                if(k2_cnt==2)//消抖时间约为2个DelayMs(10)
                {
                        keystep2++;
                }
        }
        else
        {//松开
                k2_cnt=0;
        }

使用特权

评论回复
10
datouyuan| | 2017-9-29 14:50 | 只看该作者
fang355 发表于 2017-9-29 12:29
你好 老师!如此下列的程序, 望请解释一下,  我还没有实现呢
if(k2==0)
        {//按下

1:k2按下开始计时,
2:按下时间为20mS时(消抖)为按键有效(keystep2加1)。
3:一直按下,按键不会再次有效。
4:等k2松开后,可以再次重复1~4步。

keystep2为单数,灯闪烁。
keystep2为双数,灯灭。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
fang355 + 3 很给力!
11
datouyuan| | 2017-9-29 14:59 | 只看该作者
本帖最后由 datouyuan 于 2017-9-29 15:10 编辑
fang355 发表于 2017-9-29 12:29
你好 老师!如此下列的程序, 望请解释一下,  我还没有实现呢
if(k2==0)
        {//按下

这段代码是每隔10mS执行一次,在你的应用中依赖DelayMs(10)产生这个间隔。
我们一般用定时器产生这个10mS间隔。这个间隔非常重要,按键扫描、动态显示、长延时都要靠它。
注意,延时不是死等,而是算次数。1秒=100*10mS,执行100次就是1秒。仅仅在算次数时需要mcu处理一下,占用时间极少。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
fang355 + 3 很给力!
12
fang355|  楼主 | 2017-9-30 22:35 | 只看该作者
国庆快乐!11楼主不在! 谁个高人 帮解释一下此段意思。  在下愚昧 一直还是搞不请大师的思路, 望表述能更容易些, 不怕繁琐,就怕简洁的令我难懂!
如下一段程序:
if(k2==0)
        {//按下
                k2_cnt++;
                if(k2_cnt==0) k2_cnt--;
                if(k2_cnt==2)//消抖时间约为2个DelayMs(10)
                {
                        keystep2++;
                }
        }
        else
        {//松开
                k2_cnt=0;
        }

使用特权

评论回复
评论
datouyuan 2017-11-10 10:14 回复TA
10楼不是解释得很清楚吗?还问? 
13
山东电子小菜鸟| | 2017-10-1 14:44 | 只看该作者
看不懂 谁写的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
fang355 + 1 难得 国庆赏帖!!!
14
datouyuan| | 2017-11-10 10:26 | 只看该作者

你是版主,这么简单的代码看不懂,感觉好奇怪。

请看10楼的回复。

f(k2_cnt==0) k2_cnt--;//
保证k2_cnt最大一直为255,完成“一直按下,按键不会再次有效。”

也可以这样写:
f(k2_cnt==0) k2_cnt==255;//

使用特权

评论回复
15
cactus0117| | 2017-12-21 15:35 | 只看该作者

使用特权

评论回复
16
ipman| | 2017-12-21 15:54 | 只看该作者
这个程序,产品不能用,只能学习用

使用特权

评论回复
17
zqx1000| | 2018-4-10 22:34 | 只看该作者
kankan

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

48

帖子

0

粉丝