找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3668|回復(fù): 16
收起左側(cè)

學(xué)了一個(gè)多星期單片機(jī),做了一個(gè)按鍵單雙擊代碼,死活不運(yùn)行,不知哪出錯(cuò)了

  [復(fù)制鏈接]
ID:999983 發(fā)表于 2022-1-6 10:14 | 顯示全部樓層 |閱讀模式
請(qǐng)大家?guī)兔纯?br /> 我的意思是,按一下松鍵,等600US,還沒有鍵再次按下,即單擊;一次按下后松鍵計(jì)時(shí),在600US內(nèi)再有鍵按下,即雙擊。
在邏輯上應(yīng)該沒錯(cuò)啊,因?yàn)槲以?1圖形化編程上以這樣的思路實(shí)現(xiàn)了的,但那是小孩玩的,用那也不是長久這計(jì),這下真不知錯(cuò)哪了,請(qǐng)高手指點(diǎn)一二,小弟不甚感激!

單片機(jī)源程序如下:
#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++;

}
回復(fù)

使用道具 舉報(bào)

ID:716656 發(fā)表于 2022-1-6 11:13 | 顯示全部樓層
http://www.torrancerestoration.com/bbs/dpj-195612-1.html   里面有幾個(gè)工程附帶protues仿真。有單雙擊的程序你看看
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-6 11:25 | 顯示全部樓層
有幾個(gè)錯(cuò)處
num是uchar,數(shù)值范圍0~255,不會(huì)上到600

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

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

使用道具 舉報(bào)

ID:999983 發(fā)表于 2022-1-6 11:53 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-6 11:25
有幾個(gè)錯(cuò)處
num是uchar,數(shù)值范圍0~255,不會(huì)上到600

多謝大師的解說,作為以前的老電工來說,有空想進(jìn)一步學(xué)點(diǎn)單睡片機(jī)充實(shí)自已,看來還有漫長的路要走……
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-1-6 12:54 | 顯示全部樓層
代碼都不用看就知道不行了,別說是一個(gè)星期,就是一萬年都不行
600uS
就是0.6mS,你就是單身30年,都沒有這手速!
雙擊一般是500mS,mS,mS,mS!
而且,雙擊檢測必需要有一個(gè)標(biāo)志位,用來區(qū)分是首次按下還是第二次按下
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2022-1-6 13:22 | 顯示全部樓層
你可以看下這個(gè)帖子的13樓
http://www.torrancerestoration.com/bbs/dpj-216155-1.html
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-6 14:50 | 顯示全部樓層
15527262695 發(fā)表于 2022-1-6 11:53
多謝大師的解說,作為以前的老電工來說,有空想進(jìn)一步學(xué)點(diǎn)單睡片機(jī)充實(shí)自已,看來還有漫長的路要走……

大師不敢當(dāng)
活到老學(xué)到老,不懂可以問,歡迎交流
回復(fù)

使用道具 舉報(bào)

ID:488334 發(fā)表于 2022-1-6 19:35 | 顯示全部樓層
有的人為什么評(píng)論這么遭人嫌棄呢?人又不是萬能的,對(duì)待初學(xué)者應(yīng)該要包容點(diǎn),是誰我就不說了,反正好多帖子都看到那個(gè)誰。在這推薦一個(gè)我比較喜歡的大佬@ wulin
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-1-7 12:56 | 顯示全部樓層
tatachaoren 發(fā)表于 2022-1-6 19:35
有的人為什么評(píng)論這么遭人嫌棄呢?人又不是萬能的,對(duì)待初學(xué)者應(yīng)該要包容點(diǎn),是誰我就不說了,反正好多帖子 ...

可以直接點(diǎn)名說我,沒有關(guān)系的,我不會(huì)介意的
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-1-7 13:04 | 顯示全部樓層
tatachaoren 發(fā)表于 2022-1-6 19:35
有的人為什么評(píng)論這么遭人嫌棄呢?人又不是萬能的,對(duì)待初學(xué)者應(yīng)該要包容點(diǎn),是誰我就不說了,反正好多帖子 ...

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

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
MOVEORDIE + 5 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:86450 發(fā)表于 2022-1-7 16:15 | 顯示全部樓層
我感覺  圖形化編程 時(shí)序 是不嚴(yán)格的。
回復(fù)

使用道具 舉報(bào)

ID:999983 發(fā)表于 2022-1-26 21:49 | 顯示全部樓層
又學(xué)了一段時(shí)間,回頭看,確實(shí)是有點(diǎn)S了,看來模塊化編程確實(shí)是個(gè)害人的東西....謝謝各位指點(diǎn)!
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-1-26 23:54 | 顯示全部樓層
15527262695 發(fā)表于 2022-1-26 21:49
又學(xué)了一段時(shí)間,回頭看,確實(shí)是有點(diǎn)S了,看來模塊化編程確實(shí)是個(gè)害人的東西....謝謝各位指點(diǎn)!

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

使用道具 舉報(bào)

ID:908826 發(fā)表于 2022-1-27 09:06 | 顯示全部樓層
uchar  num;i;,我從上往下看,看到這里發(fā)現(xiàn)了這個(gè)錯(cuò)誤,num和i之間用英文符號(hào)的逗號(hào)。
回復(fù)

使用道具 舉報(bào)

ID:149988 發(fā)表于 2022-1-27 20:44 | 顯示全部樓層
做成短按鍵、長按鍵有不同反應(yīng)較難一點(diǎn),如果用將長按變成按兩次,就比較簡單。下面程序,按一次鍵時(shí),為短按,短按LED_1點(diǎn)亮。按兩次鍵時(shí),為長按,長LED_2點(diǎn)亮。

#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;

                        }

                }

}
回復(fù)

使用道具 舉報(bào)

ID:482293 發(fā)表于 2022-1-27 21:09 | 顯示全部樓層
15527262695 發(fā)表于 2022-1-26 21:49
又學(xué)了一段時(shí)間,回頭看,確實(shí)是有點(diǎn)S了,看來模塊化編程確實(shí)是個(gè)害人的東西....謝謝各位指點(diǎn)!

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

使用道具 舉報(bào)

ID:139866 發(fā)表于 2022-1-28 15:40 | 顯示全部樓層
Dinosaur 發(fā)表于 2022-1-27 21:09
模塊化就像你上面說的,主要是用來給小孩或者初學(xué)者鍛煉邏輯思維用的

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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