标题: 学了一个多星期单片机,做了一个按键单双击代码,死活不运行,不知哪出错了 [打印本页]

作者: 15527262695    时间: 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++;

}

作者: 压着我头发啦    时间: 2022-1-6 11:13
http://www.51hei.com/bbs/dpj-195612-1.html   里面有几个工程附带protues仿真。有单双击的程序你看看
作者: lkc8210    时间: 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
作者: 15527262695    时间: 2022-1-6 11:53
lkc8210 发表于 2022-1-6 11:25
有几个错处
num是uchar,数值范围0~255,不会上到600

多谢大师的解说,作为以前的老电工来说,有空想进一步学点单睡片机充实自已,看来还有漫长的路要走……

作者: Y_G_G    时间: 2022-1-6 12:54
代码都不用看就知道不行了,别说是一个星期,就是一万年都不行
600uS
就是0.6mS,你就是单身30年,都没有这手速!
双击一般是500mS,mS,mS,mS!
而且,双击检测必需要有一个标志位,用来区分是首次按下还是第二次按下
作者: npn    时间: 2022-1-6 13:22
你可以看下这个帖子的13楼
http://www.51hei.com/bbs/dpj-216155-1.html
作者: lkc8210    时间: 2022-1-6 14:50
15527262695 发表于 2022-1-6 11:53
多谢大师的解说,作为以前的老电工来说,有空想进一步学点单睡片机充实自已,看来还有漫长的路要走……

大师不敢当
活到老学到老,不懂可以问,欢迎交流
作者: tatachaoren    时间: 2022-1-6 19:35
有的人为什么评论这么遭人嫌弃呢?人又不是万能的,对待初学者应该要包容点,是谁我就不说了,反正好多帖子都看到那个谁。在这推荐一个我比较喜欢的大佬@ wulin
作者: Y_G_G    时间: 2022-1-7 12:56
tatachaoren 发表于 2022-1-6 19:35
有的人为什么评论这么遭人嫌弃呢?人又不是万能的,对待初学者应该要包容点,是谁我就不说了,反正好多帖子 ...

可以直接点名说我,没有关系的,我不会介意的
作者: Y_G_G    时间: 2022-1-7 13:04
tatachaoren 发表于 2022-1-6 19:35
有的人为什么评论这么遭人嫌弃呢?人又不是万能的,对待初学者应该要包容点,是谁我就不说了,反正好多帖子 ...

遭人嫌弃这个是你的感觉
我不会去贬低任何一个人,但如果不是很精确的技术问题本身,我可能会带有调侃,如果你觉得,这就是嫌弃,那就是你个人的感觉,我不可能做到让所有人都感觉很好
没有那个必要,我的初衷是好的,针对问题本身,我会有对应的解答,这就行了
我不需要去迎合每个人,如果你觉得这是嗟来之食,那是你的事,我做我的,你说你的
作者: jjwangxu2008    时间: 2022-1-7 16:15
我感觉  图形化编程 时序 是不严格的。
作者: 15527262695    时间: 2022-1-26 21:49
又学了一段时间,回头看,确实是有点S了,看来模块化编程确实是个害人的东西....谢谢各位指点!
作者: 188610329    时间: 2022-1-26 23:54
15527262695 发表于 2022-1-26 21:49
又学了一段时间,回头看,确实是有点S了,看来模块化编程确实是个害人的东西....谢谢各位指点!

和模块化编程关系不大, 拿个计算器,按好   1 ,+ ,  1    然后打开秒表,不停的按狂按 +  计时1分钟,大多数人,1分钟 连500都到不了,就算能达到600, 一分钟60 秒  也就是 0.1秒  按键间隔, 既100ms , 你设600us 是绝对不可能 完成双击的。
作者: 13205495918    时间: 2022-1-27 09:06
uchar  num;i;,我从上往下看,看到这里发现了这个错误,num和i之间用英文符号的逗号。
作者: 不倒翁.WZT    时间: 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;

                        }

                }

}
作者: Dinosaur    时间: 2022-1-27 21:09
15527262695 发表于 2022-1-26 21:49
又学了一段时间,回头看,确实是有点S了,看来模块化编程确实是个害人的东西....谢谢各位指点!

模块化就像你上面说的,主要是用来给小孩或者初学者锻炼逻辑思维用的
作者: 天ノ忆    时间: 2022-1-28 15:40
Dinosaur 发表于 2022-1-27 21:09
模块化就像你上面说的,主要是用来给小孩或者初学者锻炼逻辑思维用的

你怎么会有这种想法,试试几万行不用模块化编程?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1