找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2241|回复: 14
收起左侧

请问按钮怎样关机和开机?附单片机程序

[复制链接]
ID:103131 发表于 2021-5-10 15:58 | 显示全部楼层 |阅读模式
按钮要长按才能显示关机,放手就不行了,我想要的是按一下就永久关机,再按一下就永久开机。

void KEY_TEST2(void)
{
    static unsigned int i = 0;
     if(KEY2==0)//按键1
       {
        delay_ms(50);
        if(KEY2==0)
          {     
             i = ++i%2;        
                        
                           printf("i =  %d\r\n",i);
              switch(i)
                          {
                                  case(0):
                                       
                                          POWER_OFF_MODE();break;

                                  case(1):
                                       
                                        AD_TEST();break;
                                 
                          }   
                            while(!KEY2);
                   }
                  
                }
         
}




void main(void)
{        
        
        
               

        while(1)
        {               
         
                 AD_TEST();
                 KEY_TEST2();
               
        }


               


               
}


回复

使用道具 举报

ID:103131 发表于 2021-5-10 18:14 | 显示全部楼层
为什么程序一起工作,按钮按下没法锁定信号?
回复

使用道具 举报

ID:101869 发表于 2021-5-10 20:16 来自手机 | 显示全部楼层
while(!KEY2);这个是等待按键抬起,一般都是抬起后再执行关机吧
回复

使用道具 举报

ID:103131 发表于 2021-5-10 20:40 | 显示全部楼层
非凡科技 发表于 2021-5-10 20:16
while(!KEY2);这个是等待按键抬起,一般都是抬起后再执行关机吧

两个函数一起运行,KEY按下后再放下就没有锁定了,请问有什么办法让按一下关闭,再按一下就打开?
回复

使用道具 举报

ID:889094 发表于 2021-5-10 21:42 | 显示全部楼层
   i = ++i%2;        神一样的句子,让我专门去百度%和左++的优先级

按一下关,再按一下开,直接检测放开不好么?
按下,消抖,等待放开然后操作,似乎更容易理解一些,你如果想按下和放开有不同的操作的话才会一定要在按下的时候来执行操作的。

另外求教一下:    printf("i =  %d\r\n",i);是打印到串口了吗?函数是怎么重定向的?
回复

使用道具 举报

ID:889094 发表于 2021-5-10 22:02 | 显示全部楼层
goldbirderman 发表于 2021-5-10 20:40
两个函数一起运行,KEY按下后再放下就没有锁定了,请问有什么办法让按一下关闭,再按一下就打开?

单片机怎么会有同时执行的问题?单片机是任务执行的,应该没有同时执行的情况吧
回复

使用道具 举报

ID:101869 发表于 2021-5-10 22:23 来自手机 | 显示全部楼层
把开关取反就行了
回复

使用道具 举报

ID:213173 发表于 2021-5-11 07:40 | 显示全部楼层
楼上讨论的都不在问题核心点上。此按键函数内只在开/关机函数中2选1调用,但主函数始终在执行开机函数,当然按键关机后一旦松手即又开机,是楼主犯了逻辑错误。
回复

使用道具 举报

ID:824490 发表于 2021-5-11 09:04 | 显示全部楼层
http://www.51hei.com/bbs/dpj-203511-1.html
看年这个对你是不是有帮助?
回复

使用道具 举报

ID:103131 发表于 2021-5-11 14:33 | 显示全部楼层
wulin 发表于 2021-5-11 07:40
楼上讨论的都不在问题核心点上。此按键函数内只在开/关机函数中2选1调用,但主函数始终在执行开机函数,当 ...

static  unsigned int i = 0;

    if(KEY2==0)//按键1
       {
        delay_ms(50);
        if(KEY2==0)
          {     
            i++;
                          if(i>1)
                                  i = 0;
                       
                           printf("i =  %d\r\n",i);
              switch(i)
                          {
                                  case(0):
                                       
                                       while(!i)
                                          POWER_OFF_MODE();break; 我改成这样就可以锁定,可是没法让它开机
回复

使用道具 举报

ID:213173 发表于 2021-5-11 16:01 | 显示全部楼层
goldbirderman 发表于 2021-5-11 14:33
static  unsigned int i = 0;

    if(KEY2==0)//按键1

不要白忙活,原来的按键程序可以用,把main函数里AD_TEST();注释掉即可。
void main(void)
{        
        while(1)
        {
//                AD_TEST();
                KEY_TEST2();
        }
}
回复

使用道具 举报

ID:103131 发表于 2021-5-11 16:17 | 显示全部楼层
wulin 发表于 2021-5-11 16:01
不要白忙活,原来的按键程序可以用,把main函数里AD_TEST();注释掉即可。
void main(void)
{        

可是我AD_TEST()这个函数也要运行
回复

使用道具 举报

ID:139866 发表于 2021-5-11 16:51 | 显示全部楼层
goldbirderman 发表于 2021-5-11 16:17
可是我AD_TEST()这个函数也要运行

那就设置标志位,别直接拿去用函数
回复

使用道具 举报

ID:103131 发表于 2021-5-11 16:54 | 显示全部楼层
天ノ忆 发表于 2021-5-11 16:51
那就设置标志位,别直接拿去用函数

怎样标志位?
回复

使用道具 举报

ID:609524 发表于 2021-5-12 10:58 | 显示全部楼层

设置一个标志位,为1开,为0关,标志位到按键里面取反就行了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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