久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3522|回復: 16
打印 上一主題 下一主題
收起左側

學了一個多星期單片機,做了一個按鍵單雙擊代碼,死活不運行,不知哪出錯了

  [復制鏈接]
跳轉到指定樓層
樓主
ID:999983 發表于 2022-1-6 10:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請大家幫忙看看
我的意思是,按一下松鍵,等600US,還沒有鍵再次按下,即單擊;一次按下后松鍵計時,在600US內再有鍵按下,即雙擊。
在邏輯上應該沒錯啊,因為我在51圖形化編程上以這樣的思路實現了的,但那是小孩玩的,用那也不是長久這計,這下真不知錯哪了,請高手指點一二,小弟不甚感激!

單片機源程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit  KEY=P3^2;
sbit  LED=P0^0;
sbit  LED2=P0^5;
uchar  num;i;


void init_t0()
{
        TMOD=0x01;
        TH0=(65536-922)/256;
        TL0=(65536-922)%256;
        EA=1;
        ET0=1;
        TR0=1;
}


void delay (uint ms)
{  uchar j;
   while(ms--)
   for(j=0;j<120;j++ );
}

void keyscan()
{     if(KEY==0)
         { delay(5);
           if(KEY==0)
             { while(!KEY)
               {i=i+1;num=0;}
             }
          }
}

void main()
{  init_t0();
   KEY=1;
   i=0;
   LED=1;
   while(1)
    {   
         keyscan();
         if(num>600)
           {i=0;}
         if(i==2)
           {LED=0;}
         if(i==1&&num==600)      
           {LED=1;}  
    }
}
void t0() interrupt 1   
{
        
        TH0=(65536-922)/256;
        TL0=(65536-922)%256;
          num++;

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:716656 發表于 2022-1-6 11:13 | 只看該作者
http://www.zg4o1577.cn/bbs/dpj-195612-1.html   里面有幾個工程附帶protues仿真。有單雙擊的程序你看看
回復

使用道具 舉報

板凳
ID:161164 發表于 2022-1-6 11:25 | 只看該作者
有幾個錯處
num是uchar,數值范圍0~255,不會上到600

while(!KEY)
               {i=i+1;num=0;}這句代碼使得按下按鍵那段時間,i被加了上千次,在0~255之間循環

         if(i==1&&num==600)      
           {LED=1;}  對小系統(while(1)循環時間快過定時器中斷時間)來說,這句沒問題,如果是大系統或代碼中有阻塞式延時,num的值在每次比較時未必一定會相差1,如上次比較是599,下次有機會是601/602
回復

使用道具 舉報

地板
ID:999983 發表于 2022-1-6 11:53 | 只看該作者
lkc8210 發表于 2022-1-6 11:25
有幾個錯處
num是uchar,數值范圍0~255,不會上到600

多謝大師的解說,作為以前的老電工來說,有空想進一步學點單睡片機充實自已,看來還有漫長的路要走……
回復

使用道具 舉報

5#
ID:401564 發表于 2022-1-6 12:54 | 只看該作者
代碼都不用看就知道不行了,別說是一個星期,就是一萬年都不行
600uS
就是0.6mS,你就是單身30年,都沒有這手速!
雙擊一般是500mS,mS,mS,mS!
而且,雙擊檢測必需要有一個標志位,用來區分是首次按下還是第二次按下
回復

使用道具 舉報

6#
ID:57657 發表于 2022-1-6 13:22 | 只看該作者
你可以看下這個帖子的13樓
http://www.zg4o1577.cn/bbs/dpj-216155-1.html
回復

使用道具 舉報

7#
ID:161164 發表于 2022-1-6 14:50 | 只看該作者
15527262695 發表于 2022-1-6 11:53
多謝大師的解說,作為以前的老電工來說,有空想進一步學點單睡片機充實自已,看來還有漫長的路要走……

大師不敢當
活到老學到老,不懂可以問,歡迎交流
回復

使用道具 舉報

8#
ID:488334 發表于 2022-1-6 19:35 | 只看該作者
有的人為什么評論這么遭人嫌棄呢?人又不是萬能的,對待初學者應該要包容點,是誰我就不說了,反正好多帖子都看到那個誰。在這推薦一個我比較喜歡的大佬@ wulin
回復

使用道具 舉報

9#
ID:401564 發表于 2022-1-7 12:56 | 只看該作者
tatachaoren 發表于 2022-1-6 19:35
有的人為什么評論這么遭人嫌棄呢?人又不是萬能的,對待初學者應該要包容點,是誰我就不說了,反正好多帖子 ...

可以直接點名說我,沒有關系的,我不會介意的
回復

使用道具 舉報

10#
ID:401564 發表于 2022-1-7 13:04 | 只看該作者
tatachaoren 發表于 2022-1-6 19:35
有的人為什么評論這么遭人嫌棄呢?人又不是萬能的,對待初學者應該要包容點,是誰我就不說了,反正好多帖子 ...

遭人嫌棄這個是你的感覺
我不會去貶低任何一個人,但如果不是很精確的技術問題本身,我可能會帶有調侃,如果你覺得,這就是嫌棄,那就是你個人的感覺,我不可能做到讓所有人都感覺很好
沒有那個必要,我的初衷是好的,針對問題本身,我會有對應的解答,這就行了
我不需要去迎合每個人,如果你覺得這是嗟來之食,那是你的事,我做我的,你說你的

評分

參與人數 1黑幣 +5 收起 理由
MOVEORDIE + 5 贊一個!

查看全部評分

回復

使用道具 舉報

11#
ID:86450 發表于 2022-1-7 16:15 | 只看該作者
我感覺  圖形化編程 時序 是不嚴格的。
回復

使用道具 舉報

12#
ID:999983 發表于 2022-1-26 21:49 | 只看該作者
又學了一段時間,回頭看,確實是有點S了,看來模塊化編程確實是個害人的東西....謝謝各位指點!
回復

使用道具 舉報

13#
ID:624769 發表于 2022-1-26 23:54 | 只看該作者
15527262695 發表于 2022-1-26 21:49
又學了一段時間,回頭看,確實是有點S了,看來模塊化編程確實是個害人的東西....謝謝各位指點!

和模塊化編程關系不大, 拿個計算器,按好   1 ,+ ,  1    然后打開秒表,不停的按狂按 +  計時1分鐘,大多數人,1分鐘 連500都到不了,就算能達到600, 一分鐘60 秒  也就是 0.1秒  按鍵間隔, 既100ms , 你設600us 是絕對不可能 完成雙擊的。
回復

使用道具 舉報

14#
ID:908826 發表于 2022-1-27 09:06 | 只看該作者
uchar  num;i;,我從上往下看,看到這里發現了這個錯誤,num和i之間用英文符號的逗號。
回復

使用道具 舉報

15#
ID:149988 發表于 2022-1-27 20:44 | 只看該作者
做成短按鍵、長按鍵有不同反應較難一點,如果用將長按變成按兩次,就比較簡單。下面程序,按一次鍵時,為短按,短按LED_1點亮。按兩次鍵時,為長按,長LED_2點亮。

#include < reg51.h >

#include <intrins.h>

sbit k1=P1^0;        //
sbit LED_1=P0^7;

sbit LED_2=P0^0;

unsigned char Time;

unsigned char i;

void delay(unsigned int ms)        /
{

        unsigned char x,y;

        for(x=0;x<ms;x++)

          for(y=0;y<120;y++);

}



void key_scan()          //
{

        i=0;

        if(k1==0)               /
        {

                delay(5);

                if(k1==0)             /
                {

                  while(!k1);        /
                        i=++i;

                }

        }

}

void  main()

{

  P0=0x00;

       

        while(1)

                {

                        key_scan();        

                        if(i==1)

                        {

                                LED_1=1;

                        }

                        if(i==2)

                        {

                                LED_2=1;

                        }

                }

}
回復

使用道具 舉報

16#
ID:482293 發表于 2022-1-27 21:09 | 只看該作者
15527262695 發表于 2022-1-26 21:49
又學了一段時間,回頭看,確實是有點S了,看來模塊化編程確實是個害人的東西....謝謝各位指點!

模塊化就像你上面說的,主要是用來給小孩或者初學者鍛煉邏輯思維用的
回復

使用道具 舉報

17#
ID:139866 發表于 2022-1-28 15:40 | 只看該作者
Dinosaur 發表于 2022-1-27 21:09
模塊化就像你上面說的,主要是用來給小孩或者初學者鍛煉邏輯思維用的

你怎么會有這種想法,試試幾萬行不用模塊化編程?
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美国产一区二区 | 亚洲免费三区 | 亚洲高清在线观看 | 国产精品久久久久久久7电影 | 免费观看色| 国产高清在线观看 | 中文在线а√在线8 | av免费网站在线观看 | 亚洲精品一区二区三区四区高清 | 91av在线免费观看 | 国产成人免费视频网站视频社区 | 狠狠操婷婷 | 日韩高清国产一区在线 | 一区二区三区不卡视频 | 日本在线视频中文字幕 | 亚洲欧美国产一区二区三区 | 九九亚洲精品 | 国产在线视频一区二区 | 亚洲国产高清在线 | 亚洲成人一级片 | 国产91在线 | 中日 | 免费亚洲成人 | 最新中文字幕久久 | 91成人在线视频 | 亚洲欧美精品一区 | 天堂中文字幕av | 中文字幕一区二区三区乱码图片 | 久久久久99 | 狠狠涩| 国产69精品久久久久777 | 亚洲国产一区二区三区在线观看 | 麻豆精品国产91久久久久久 | 日韩一区二区三区在线 | 成人精品在线观看 | 亚洲国产18 | 9191成人精品久久 | h片免费在线观看 | 性福视频在线观看 | 毛片一区二区三区 | 欧美成ee人免费视频 | 国产一区二区在线视频 |