打印
[51单片机]

51单片机顺序控制按键问题,求大家帮帮忙

[复制链接]
3715|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
samsunghellome|  楼主 | 2013-8-17 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
aimie| | 2013-8-17 11:37 | 只看该作者
if(k1==1)
{
  if{2==1}
  {
  led=1;
}
}

另外一种情况如法**制,,,加延时。。。。

使用特权

评论回复
板凳
qzc13457| | 2013-8-17 11:46 | 只看该作者
这不难实现吧,如楼上思路,加去抖,还有你的按键自复位吗?自复位的要定义变量储存状态值。

使用特权

评论回复
地板
samsunghellome|  楼主 | 2013-8-17 11:50 | 只看该作者
qzc13457 发表于 2013-8-17 11:46
这不难实现吧,如楼上思路,加去抖,还有你的按键自复位吗?自复位的要定义变量储存状态值。 ...

我是新手,自己试着写了程序,好长好长,好多{}和while(1),看的眼花也未实现功能,,请高手再把思路说具体一点吧或者给一个相似的程序,谢谢了。

使用特权

评论回复
5
samsunghellome|  楼主 | 2013-8-17 11:52 | 只看该作者
qzc13457 发表于 2013-8-17 11:46
这不难实现吧,如楼上思路,加去抖,还有你的按键自复位吗?自复位的要定义变量储存状态值。 ...

您看看这个

#include<reg52.h>
sbit KEY1=P3^0;  
sbit KEY2=P3^1;  
sbit LED2=P1^1;

void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void main (void)
{
                  
KEY1=1;
KEY2=1;
while (1)         
  {
  if(!KEY1)//判断按键1是否按下
    {
         DelayMs(10);
     if(!KEY1)//按键1延时去抖     
                while(1)
                {if(!KEY2)  
         {DelayMs(10);
           if(!KEY2)     
                   LED2=0;
                   break;
                 }      
                }                                            
        }
     while (1)
                {if(LED2==0)
          while(1)
                  {if(!KEY2)
                   {DelayMs(10);
                    if(!KEY2)
                         while(1)
                     {if(!KEY2)  
              {DelayMs(10);
              if(!KEY2)     
                       LED2=0;
                       break;
                      }      
                     }
                   }
                  }
           
        }
  }
}
  

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}

使用特权

评论回复
6
linfuning| | 2013-8-17 12:01 | 只看该作者
我也想学学 程序

使用特权

评论回复
7
samsunghellome|  楼主 | 2013-8-17 12:03 | 只看该作者
linfuning 发表于 2013-8-17 12:01
我也想学学 程序

人若有志,万事可为,加油:)

使用特权

评论回复
8
创隆电子| | 2013-8-17 12:04 | 只看该作者
这不还是感应灯的问题吗
再给你个思路,不想一下说明白。要不你就不能自行考虑问题与程序了
char  a,b;
if(a==0&&k1==0)
{
     b=1;//判断key1是否先按下
     if(b==1&&k2==0)
       {
        a=1;
               开启;
       }
}
关闭自己想

使用特权

评论回复
9
linfuning| | 2013-8-17 12:08 | 只看该作者
samsunghellome 发表于 2013-8-17 12:03
人若有志,万事可为,加油

是的    人怎么都不能丧失了 志

使用特权

评论回复
10
创隆电子| | 2013-8-17 12:12 | 只看该作者
当然了,还要加消抖延时欲离开检测。你可以用开关的标志位建立两个标志位,第二个更具第一个的标志位来执行

使用特权

评论回复
11
samsunghellome|  楼主 | 2013-8-17 13:01 | 只看该作者
创隆电子 发表于 2013-8-17 12:04
这不还是感应灯的问题吗
再给你个思路,不想一下说明白。要不你就不能自行考虑问题与程序了
char  a,b;

谢了,:)有问题咱们再交流。

使用特权

评论回复
12
qzc13457| | 2013-8-17 13:39 | 只看该作者
samsunghellome 发表于 2013-8-17 11:52
您看看这个

#include

为什么这么多while(1)?
去抖应该用while(!KEY1);吧,没有松开时时是空语句。参考一下

使用特权

评论回复
13
samsunghellome|  楼主 | 2013-8-17 13:45 | 只看该作者
qzc13457 发表于 2013-8-17 13:39
为什么这么多while(1)?
去抖应该用while(!KEY1);吧,没有松开时时是空语句。参考一下 ...

这个程序不能完全实现两个按键的控制,可不可以指点指点错误在哪里??

使用特权

评论回复
14
qzc13457| | 2013-8-17 13:45 | 只看该作者
qzc13457 发表于 2013-8-17 13:39
为什么这么多while(1)?
去抖应该用while(!KEY1);吧,没有松开时时是空语句。参考一下 ...

你试试这个思路,按键1按下,a赋值1;if (a==1 && 按键2 按下)执行灯亮,同时a赋值0。
PS:看你的延迟函数就知道你用的郭天祥的例程吧,嘿嘿

使用特权

评论回复
15
创隆电子| | 2013-8-17 13:49 | 只看该作者
再说了,你的那两个while(1)
                           {
                  
                           }
                            while(1)
                           {
                  
                           }
这样的话岂不死在一处,下面的执行不了。
程序编完先用软件仿真,反复多试几次

使用特权

评论回复
16
创隆电子| | 2013-8-17 13:51 | 只看该作者
嘿嘿,看错了。while应该while(K1==0)松手检测(记住这只是理想状态,除非程序再也没有其他任务,不然不可以只停在此处)

使用特权

评论回复
17
samsunghellome|  楼主 | 2013-8-17 13:57 | 只看该作者
本帖最后由 samsunghellome 于 2013-8-17 14:46 编辑

这个?? while(!key1)是松手检测,我试了,while(1),程序才会正常!!

使用特权

评论回复
18
samsunghellome|  楼主 | 2013-8-17 14:01 | 只看该作者
qzc13457 发表于 2013-8-17 13:45
你试试这个思路,按键1按下,a赋值1;if (a==1 && 按键2 按下)执行灯亮,同时a赋值0。
PS:看你的延迟 ...

c语言延时不准确,网上的延时程序也就那么几个,呵呵,精确延时还是用汇编

使用特权

评论回复
19
samsunghellome|  楼主 | 2013-8-17 14:08 | 只看该作者
创隆电子 发表于 2013-8-17 13:51
嘿嘿,看错了。while应该while(K1==0)松手检测(记住这只是理想状态,除非程序再也没有其他任务,不然不 ...

好的,看到大家热心的帮助,我真的好开心,我试试看,谢谢!

使用特权

评论回复
20
创隆电子| | 2013-8-17 14:09 | 只看该作者
你可以用STC的下载软件,就有延时计算功能,省得自己算了

使用特权

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

本版积分规则

43

主题

198

帖子

0

粉丝