找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1760|回复: 24
打印 上一主题 下一主题
收起左侧

关与51单片机按键检测的问题

  [复制链接]
跳转到指定楼层
楼主
ID:985181 发表于 2021-11-27 00:33 来自触屏版 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是下面这个程序,按键松开后led灯不会马上熄灭的,应该是要加一个按键检测的语句,应该怎么改呢
望解答,谢谢大佬们。
#include<reg51.h>
#include<intrins.h>
sbit K1=P3^2;
void Dly( )
{ unsigned char i;
unsigned int j;
for(j=0; j<1310;j++){ for(i=0; i<252; i++)
{;}
}
void main( )
{ unsigned char OutData=0x7F;
while(1)
K1=1;
while (K1=-0)
{
P1=OutData;
Dly();
OutData=_ cror(OutData ,1)
}
P1=0xff;
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2021-11-27 06:38 | 只看该作者
  1. void main( )
  2. { unsigned char OutData=0x7F;
  3. while(1)
  4. {
  5. if (K1==0)
  6. {
  7. P1=OutData;
  8. Dly();
  9. OutData=_ cror(OutData ,1);
  10. while (K1==0);
  11. }
  12. P1=0xff;
  13. }
  14. }}
复制代码
回复

使用道具 举报

板凳
ID:155507 发表于 2021-11-27 07:49 | 只看该作者
你的程序有缺陷,给你改了一下,你试试。

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit K1=P3^2;
  4. void Dly()
  5. {
  6.         unsigned char i;
  7.         unsigned int j;
  8.         for(j=0; j<1310;j++)
  9.         {
  10.                 for(i=0; i<252; i++)
  11.                 {;}
  12.         }
  13. }
  14. void main()
  15. {
  16.         unsigned char OutData=0x7F;
  17.         while(1)
  18.         {
  19.                 K1=1;
  20.                 while (K1==0)
  21.                 {
  22.                         P1=OutData;
  23.                         Dly();
  24.                         OutData = _cror_(OutData , 1);
  25.                 }
  26.                 P1=0xff;
  27.         }
  28. }

复制代码
回复

使用道具 举报

地板
ID:985181 发表于 2021-11-27 09:50 来自触屏版 | 只看该作者
angmall 发表于 2021-11-27 07:49
你的程序有缺陷,给你改了一下,你试试。

你是指K1==1那里吗?复制有问题,本来就是k1==0的
回复

使用道具 举报

5#
ID:985181 发表于 2021-11-27 09:51 来自触屏版 | 只看该作者
xianfajushi 发表于 2021-11-27 06:38

谢谢大佬
回复

使用道具 举报

6#
ID:213173 发表于 2021-11-27 10:05 | 只看该作者
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit K1=P3^2;
  4. void Dly( )
  5. {
  6.         unsigned char i;
  7.         unsigned int j;
  8.         for(j=0; j<1310;j++)
  9.                 for(i=0; i<252; i++);
  10. }
  11. void main( )
  12. {
  13.         unsigned char OutData=0x7F;
  14.         while(1)
  15.         {
  16. //                K1=1;
  17.                 while(!K1)
  18.                 {
  19.                         P1=OutData;
  20.                         Dly();
  21.                         OutData=_cror_(OutData,1);
  22.                 }
  23. //                P1=0xff;
  24.         }
  25. }
复制代码
回复

使用道具 举报

7#
ID:928284 发表于 2021-11-27 11:06 | 只看该作者
程序多变,几种写法,都可以达到相同的效果。
回复

使用道具 举报

8#
ID:985374 发表于 2021-11-27 17:52 | 只看该作者
#include<reg51.h>
#include<intrins.h>
sbit K1=P3^2;
void Dly( )
{
        unsigned char i;
        unsigned int j;
        for(j=0; j<1310;j++)
                for(i=0; i<252; i++);
}
void main( )
{
        unsigned char OutData=0x7F;
        while(1)
        {
//                K1=1;
                while(!K1)
                {
                        P1=OutData;
                        Dly();
                        OutData=_cror_(OutData,1);
                }
//                P1=0xff;
        }
}
回复

使用道具 举报

9#
ID:985181 发表于 2021-11-27 22:50 来自触屏版 | 只看该作者
感觉大佬们理解错了我的意思了……我现在的问题是我的这个程序是没问题的,就是我按键按久了一点松开后灯不会马上熄灭,要等一下才灭怎么解决这个问题
回复

使用道具 举报

10#
ID:985181 发表于 2021-11-27 22:50 来自触屏版 | 只看该作者
jiduedwad 发表于 2021-11-27 17:52
#include
#include
sbit K1=P3^2;

好像灯也没有马上灭呢
回复

使用道具 举报

11#
ID:985181 发表于 2021-11-27 22:52 来自触屏版 | 只看该作者
xianfajushi 发表于 2021-11-27 06:38

我想要的是按住流水灯,松开马上灭,不会廷时
回复

使用道具 举报

12#
ID:985181 发表于 2021-11-27 22:53 来自触屏版 | 只看该作者
wulin 发表于 2021-11-27 10:05

好像也不会马上灭灯呢
回复

使用道具 举报

13#
ID:624769 发表于 2021-11-27 23:20 | 只看该作者
chencjy 发表于 2021-11-27 22:53
好像也不会马上灭灯呢

哎……

算了,直接用这段,按下流水,放手即灭灯:

#include<reg51.h>
#include<intrins.h>
sbit K1=P3^2;

void main()
{
        unsigned char i;
        unsigned int j;
        K1 = 1;
        while(1)
        {
                if(K1)        P1=0xff;
                else
                {
                        if(P1 == 0xff)        P1 = 0x7f;
                        else        P1 = _cror_(P1,1);
                        j = 1310;
                        while((--j) && (!K1))
                        {
                                i = 252;
                                while(--i);
                        }
                }
        }
}

回复

使用道具 举报

14#
ID:57657 发表于 2021-11-27 23:41 | 只看该作者
开1ms定时器中断,定义1个 unsigned char 和1个bit全局变量,几个按键定义几对。
中断检测按键按下变量加1,松开清0,加到255为止。
比如按键消抖25ms,计数25以上bit清0,否则置1,main函数读取该bit值即为按键状态。
回复

使用道具 举报

15#
ID:624769 发表于 2021-11-27 23:44 | 只看该作者
chencjy 发表于 2021-11-27 22:50
感觉大佬们理解错了我的意思了……我现在的问题是我的这个程序是没问题的,就是我按键按久了一点松开后灯不 ...

不是她们理解错你的意思,也不是你程序没问题。

其实你的程序问题很大,按你的设计框架,你几乎是不可能达到你的目的的。
他们比较保守,尽量尊重你的设计,要是他们不看你的代码,按你的需求直接凭空写一个,不光代码会少很多,而且你的目的也早实现了。
回复

使用道具 举报

16#
ID:624769 发表于 2021-11-28 00:07 | 只看该作者
尽量保留你的原汁原味把:

#include<reg51.h>
#include<intrins.h>
sbit K1=P3^2;

void main()
{
        unsigned char i,OutData;
        unsigned int j;
        K1 = 1;
        OutData = 0x7F;
        while(1)
        {
                if(K1)        P1=0xff;
                else
                {
                        P1        = OutData;
                        OutData = _cror_(OutData,1);
                        j = 1310;
                        while((--j) && (!K1))
                        {
                                i = 252;
                                while((--i) && (!K1));
                        }
                }
        }
}


回复

使用道具 举报

17#
ID:985181 发表于 2021-11-28 00:08 来自触屏版 | 只看该作者
188610329 发表于 2021-11-27 23:44
不是她们理解错你的意思,也不是你程序没问题。

其实你的程序问题很大,按你的设计框架,你几乎是不可 ...

嗯嗯,这是课本上题目,我也用了好多种办法都没实现 ,中断的现在我没学呢,这两天要自学一下了
回复

使用道具 举报

18#
ID:985181 发表于 2021-11-28 00:09 来自触屏版 | 只看该作者
npn 发表于 2021-11-27 23:41
开1ms定时器中断,定义1个 unsigned char 和1个bit全局变量,几个按键定义几对。
中断检测按键按下变量加1 ...

好的,感谢
回复

使用道具 举报

19#
ID:985181 发表于 2021-11-28 00:09 来自触屏版 | 只看该作者
188610329 发表于 2021-11-27 23:20
哎……

算了,直接用这段,按下流水,放手即灭灯:

谢谢大佬
回复

使用道具 举报

20#
ID:985181 发表于 2021-11-28 00:16 来自触屏版 | 只看该作者
188610329 发表于 2021-11-27 23:44
不是她们理解错你的意思,也不是你程序没问题。

其实你的程序问题很大,按你的设计框架,你几乎是不可 ...

我也感觉是,书本上就说什么加一个按键检测的,我试了几种都不行
回复

使用道具 举报

21#
ID:213173 发表于 2021-11-28 06:02 | 只看该作者
chencjy 发表于 2021-11-27 22:53
好像也不会马上灭灯呢

只要按键代码里有Dly( )存在就不可能松手立即生效。要想松手立即生效就得改变编程思路。
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit K1=P3^2;

  4. void main()
  5. {
  6.         unsigned char OutData=0x7F;
  7.         unsigned int num;
  8.         while(1)
  9.         {
  10.                 if(!K1)
  11.                 {
  12.                         P1=OutData;
  13.                         if(++num>=30000)
  14.                         {
  15.                                 num=0;
  16.                                 OutData=_cror_(OutData,1);
  17.                         }
  18.                 }
  19.                 else
  20.                 {
  21.                         num=0;
  22.                         P1=0xff;
  23.                 }
  24.         }
  25. }
复制代码
回复

使用道具 举报

22#
ID:985181 发表于 2021-11-28 12:32 来自触屏版 | 只看该作者
wulin 发表于 2021-11-28 06:02
只要按键代码里有Dly( )存在就不可能松手立即生效。要想松手立即生效就得改变编程思路。

好的,谢谢大佬
回复

使用道具 举报

23#
ID:712493 发表于 2021-11-28 18:25 | 只看该作者
-0  是什么意思  为什么不是0?  你这个在  while (K1= -0)里  有大延时,当在 P1 = outdata 后按键松开 要延时一段时间才能跳出上面这个循环,所以不会立即息灭,至于怎么改你自己想办法
回复

使用道具 举报

24#
ID:985181 发表于 2021-11-28 19:36 来自触屏版 | 只看该作者
fj51hei 发表于 2021-11-28 18:25
-0  是什么意思  为什么不是0?  你这个在  while (K1= -0)里  有大延时,当在 P1 = outdata 后按键松开  ...

是0,k1==0,复制过来错了,就是跳不出这个循环,看大佬们都是把dly廷时改了的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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