找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1788|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

關(guān)與51單片機按鍵檢測的問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:985181 發(fā)表于 2021-11-27 00:33 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
就是下面這個程序,按鍵松開后led燈不會馬上熄滅的,應(yīng)該是要加一個按鍵檢測的語句,應(yīng)該怎么改呢
望解答,謝謝大佬們。
#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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:332444 發(fā)表于 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. }}
復(fù)制代碼
回復(fù)

使用道具 舉報

板凳
ID:155507 發(fā)表于 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. }

復(fù)制代碼
回復(fù)

使用道具 舉報

地板
ID:985181 發(fā)表于 2021-11-27 09:50 來自觸屏版 | 只看該作者
angmall 發(fā)表于 2021-11-27 07:49
你的程序有缺陷,給你改了一下,你試試。

你是指K1==1那里嗎?復(fù)制有問題,本來就是k1==0的
回復(fù)

使用道具 舉報

5#
ID:985181 發(fā)表于 2021-11-27 09:51 來自觸屏版 | 只看該作者
xianfajushi 發(fā)表于 2021-11-27 06:38

謝謝大佬
回復(fù)

使用道具 舉報

6#
ID:213173 發(fā)表于 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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

7#
ID:928284 發(fā)表于 2021-11-27 11:06 | 只看該作者
程序多變,幾種寫法,都可以達到相同的效果。
回復(fù)

使用道具 舉報

8#
ID:985374 發(fā)表于 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;
        }
}
回復(fù)

使用道具 舉報

9#
ID:985181 發(fā)表于 2021-11-27 22:50 來自觸屏版 | 只看該作者
感覺大佬們理解錯了我的意思了……我現(xiàn)在的問題是我的這個程序是沒問題的,就是我按鍵按久了一點松開后燈不會馬上熄滅,要等一下才滅怎么解決這個問題
回復(fù)

使用道具 舉報

10#
ID:985181 發(fā)表于 2021-11-27 22:50 來自觸屏版 | 只看該作者
jiduedwad 發(fā)表于 2021-11-27 17:52
#include
#include
sbit K1=P3^2;

好像燈也沒有馬上滅呢
回復(fù)

使用道具 舉報

11#
ID:985181 發(fā)表于 2021-11-27 22:52 來自觸屏版 | 只看該作者
xianfajushi 發(fā)表于 2021-11-27 06:38

我想要的是按住流水燈,松開馬上滅,不會廷時
回復(fù)

使用道具 舉報

12#
ID:985181 發(fā)表于 2021-11-27 22:53 來自觸屏版 | 只看該作者
wulin 發(fā)表于 2021-11-27 10:05

好像也不會馬上滅燈呢
回復(fù)

使用道具 舉報

13#
ID:624769 發(fā)表于 2021-11-27 23:20 | 只看該作者
chencjy 發(fā)表于 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);
                        }
                }
        }
}

回復(fù)

使用道具 舉報

14#
ID:57657 發(fā)表于 2021-11-27 23:41 | 只看該作者
開1ms定時器中斷,定義1個 unsigned char 和1個bit全局變量,幾個按鍵定義幾對。
中斷檢測按鍵按下變量加1,松開清0,加到255為止。
比如按鍵消抖25ms,計數(shù)25以上bit清0,否則置1,main函數(shù)讀取該bit值即為按鍵狀態(tài)。
回復(fù)

使用道具 舉報

15#
ID:624769 發(fā)表于 2021-11-27 23:44 | 只看該作者
chencjy 發(fā)表于 2021-11-27 22:50
感覺大佬們理解錯了我的意思了……我現(xiàn)在的問題是我的這個程序是沒問題的,就是我按鍵按久了一點松開后燈不 ...

不是她們理解錯你的意思,也不是你程序沒問題。

其實你的程序問題很大,按你的設(shè)計框架,你幾乎是不可能達到你的目的的。
他們比較保守,盡量尊重你的設(shè)計,要是他們不看你的代碼,按你的需求直接憑空寫一個,不光代碼會少很多,而且你的目的也早實現(xiàn)了。
回復(fù)

使用道具 舉報

16#
ID:624769 發(fā)表于 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));
                        }
                }
        }
}


回復(fù)

使用道具 舉報

17#
ID:985181 發(fā)表于 2021-11-28 00:08 來自觸屏版 | 只看該作者
188610329 發(fā)表于 2021-11-27 23:44
不是她們理解錯你的意思,也不是你程序沒問題。

其實你的程序問題很大,按你的設(shè)計框架,你幾乎是不可 ...

嗯嗯,這是課本上題目,我也用了好多種辦法都沒實現(xiàn) ,中斷的現(xiàn)在我沒學(xué)呢,這兩天要自學(xué)一下了
回復(fù)

使用道具 舉報

18#
ID:985181 發(fā)表于 2021-11-28 00:09 來自觸屏版 | 只看該作者
npn 發(fā)表于 2021-11-27 23:41
開1ms定時器中斷,定義1個 unsigned char 和1個bit全局變量,幾個按鍵定義幾對。
中斷檢測按鍵按下變量加1 ...

好的,感謝
回復(fù)

使用道具 舉報

19#
ID:985181 發(fā)表于 2021-11-28 00:09 來自觸屏版 | 只看該作者
188610329 發(fā)表于 2021-11-27 23:20
哎……

算了,直接用這段,按下流水,放手即滅燈:

謝謝大佬
回復(fù)

使用道具 舉報

20#
ID:985181 發(fā)表于 2021-11-28 00:16 來自觸屏版 | 只看該作者
188610329 發(fā)表于 2021-11-27 23:44
不是她們理解錯你的意思,也不是你程序沒問題。

其實你的程序問題很大,按你的設(shè)計框架,你幾乎是不可 ...

我也感覺是,書本上就說什么加一個按鍵檢測的,我試了幾種都不行
回復(fù)

使用道具 舉報

21#
ID:213173 發(fā)表于 2021-11-28 06:02 | 只看該作者
chencjy 發(fā)表于 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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

22#
ID:985181 發(fā)表于 2021-11-28 12:32 來自觸屏版 | 只看該作者
wulin 發(fā)表于 2021-11-28 06:02
只要按鍵代碼里有Dly( )存在就不可能松手立即生效。要想松手立即生效就得改變編程思路。

好的,謝謝大佬
回復(fù)

使用道具 舉報

23#
ID:712493 發(fā)表于 2021-11-28 18:25 | 只看該作者
-0  是什么意思  為什么不是0?  你這個在  while (K1= -0)里  有大延時,當(dāng)在 P1 = outdata 后按鍵松開 要延時一段時間才能跳出上面這個循環(huán),所以不會立即息滅,至于怎么改你自己想辦法
回復(fù)

使用道具 舉報

24#
ID:985181 發(fā)表于 2021-11-28 19:36 來自觸屏版 | 只看該作者
fj51hei 發(fā)表于 2021-11-28 18:25
-0  是什么意思  為什么不是0?  你這個在  while (K1= -0)里  有大延時,當(dāng)在 P1 = outdata 后按鍵松開  ...

是0,k1==0,復(fù)制過來錯了,就是跳不出這個循環(huán),看大佬們都是把dly廷時改了的
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表