找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3694|回复: 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++;

}
回复

使用道具 举报

ID:716656 发表于 2022-1-6 11:13 | 显示全部楼层
http://www.51hei.com/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

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

使用道具 举报

ID:401564 发表于 2022-1-6 12:54 | 显示全部楼层
代码都不用看就知道不行了,别说是一个星期,就是一万年都不行
600uS
就是0.6mS,你就是单身30年,都没有这手速!
双击一般是500mS,mS,mS,mS!
而且,双击检测必需要有一个标志位,用来区分是首次按下还是第二次按下
回复

使用道具 举报

ID:57657 发表于 2022-1-6 13:22 | 显示全部楼层
你可以看下这个帖子的13楼
http://www.51hei.com/bbs/dpj-216155-1.html
回复

使用道具 举报

ID:161164 发表于 2022-1-6 14:50 | 显示全部楼层
15527262695 发表于 2022-1-6 11:53
多谢大师的解说,作为以前的老电工来说,有空想进一步学点单睡片机充实自已,看来还有漫长的路要走……

大师不敢当
活到老学到老,不懂可以问,欢迎交流
回复

使用道具 举报

ID:488334 发表于 2022-1-6 19:35 | 显示全部楼层
有的人为什么评论这么遭人嫌弃呢?人又不是万能的,对待初学者应该要包容点,是谁我就不说了,反正好多帖子都看到那个谁。在这推荐一个我比较喜欢的大佬@ wulin
回复

使用道具 举报

ID:401564 发表于 2022-1-7 12:56 | 显示全部楼层
tatachaoren 发表于 2022-1-6 19:35
有的人为什么评论这么遭人嫌弃呢?人又不是万能的,对待初学者应该要包容点,是谁我就不说了,反正好多帖子 ...

可以直接点名说我,没有关系的,我不会介意的
回复

使用道具 举报

ID:401564 发表于 2022-1-7 13:04 | 显示全部楼层
tatachaoren 发表于 2022-1-6 19:35
有的人为什么评论这么遭人嫌弃呢?人又不是万能的,对待初学者应该要包容点,是谁我就不说了,反正好多帖子 ...

遭人嫌弃这个是你的感觉
我不会去贬低任何一个人,但如果不是很精确的技术问题本身,我可能会带有调侃,如果你觉得,这就是嫌弃,那就是你个人的感觉,我不可能做到让所有人都感觉很好
没有那个必要,我的初衷是好的,针对问题本身,我会有对应的解答,这就行了
我不需要去迎合每个人,如果你觉得这是嗟来之食,那是你的事,我做我的,你说你的

评分

参与人数 1黑币 +5 收起 理由
MOVEORDIE + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:86450 发表于 2022-1-7 16:15 | 显示全部楼层
我感觉  图形化编程 时序 是不严格的。
回复

使用道具 举报

ID:999983 发表于 2022-1-26 21:49 | 显示全部楼层
又学了一段时间,回头看,确实是有点S了,看来模块化编程确实是个害人的东西....谢谢各位指点!
回复

使用道具 举报

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 是绝对不可能 完成双击的。
回复

使用道具 举报

ID:908826 发表于 2022-1-27 09:06 | 显示全部楼层
uchar  num;i;,我从上往下看,看到这里发现了这个错误,num和i之间用英文符号的逗号。
回复

使用道具 举报

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;

                        }

                }

}
回复

使用道具 举报

ID:482293 发表于 2022-1-27 21:09 | 显示全部楼层
15527262695 发表于 2022-1-26 21:49
又学了一段时间,回头看,确实是有点S了,看来模块化编程确实是个害人的东西....谢谢各位指点!

模块化就像你上面说的,主要是用来给小孩或者初学者锻炼逻辑思维用的
回复

使用道具 举报

ID:139866 发表于 2022-1-28 15:40 | 显示全部楼层
Dinosaur 发表于 2022-1-27 21:09
模块化就像你上面说的,主要是用来给小孩或者初学者锻炼逻辑思维用的

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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