找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5763|回复: 5
收起左侧

单片机程序 怎么让他按下去也只循环一次 触发一次循环一次 一直触发也只循环一次

[复制链接]
ID:553625 发表于 2019-7-27 09:08 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <intrins.h>

sbit KEY_UP=P1^3;
sbit KEY_DW=P1^4;
sbit DIR_UP=P3^2;
sbit DIR_DW=P3^3;
sbit CON_ECU=P3^4;

void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
void Delay_ms(unsigned char t);

void main()
{
                KEY_UP=1;
                KEY_DW=1;
                DIR_UP=0;
                DIR_DW=0;
                CON_ECU=1;
        
                while(1)
                {
        if(KEY_UP==0)
                                {        
                                           Delay_ms(5);
                                           if(KEY_UP==0)
                                                {
                                                                CON_ECU=0;
                                                                Delay_ms(10);
                                                          DIR_UP=1;
                                                                DelayMs(10);
                                                          CON_ECU=1;
                                                          Delay_ms(10);
                                                          DIR_UP=0;
                                                         
                                                                DelayMs(190);
                                                                DelayMs(190);
                                                                DelayMs(190);
                                                                DIR_DW=1;
                                              Delay_ms(10);
                                                          DIR_DW=0;
                                                }
                                                    continue;
                                }
                                
        if(KEY_DW==0)
                                {      
                                                                DelayMs(10);
                                                                if(KEY_DW==0)
                                {
                                                                DIR_DW=1;
                                                                Delay_ms(10);
                                                                DIR_DW=0;
                                                        
                                                                DelayMs(190);
                                                                DelayMs(190);
                                                                DelayMs(190);
                                                                DIR_UP=1;
                                                          Delay_ms(10);
                                                                DIR_UP=0;
                                }
                                        continue;
                                }
        if(        KEY_UP==1)
        {
        {
                                        DelayMs(10);
                                        if(        KEY_UP==1)
                                        Delay_ms(5);
                                        DIR_UP=0;
                          }
                                  continue;
                        }
        if(KEY_DW==1)
        {
        {
                                DelayMs(10);
                                if(KEY_DW==1)
                                Delay_ms(5);
                                DIR_DW=0;
                        }
                          continue;
                }
                }
  }


void DelayUs2x(unsigned char t)
{   
                while(--t);
}

void DelayMs(unsigned char t)
{   
                while(t--)
                {

                                DelayUs2x(245);
                                DelayUs2x(245);
                }
}

void Delay_ms(unsigned char t)               
{
        unsigned char i,j,k;
  for(k=0;k<t;k++)
        {
                _nop_();
                i = 2;
                j = 199;
                do
                {
                        while (--j);
                } while (--i);
        }
}

回复

使用道具 举报

ID:577837 发表于 2019-7-27 09:35 | 显示全部楼层
break,让它在按键按下执行完循环内的程序后跳出当前循环,这样就只能循环一次了
一直触发循环一次,给循环一个结束条件不就能行了吗?
回复

使用道具 举报

ID:589552 发表于 2019-7-27 18:39 | 显示全部楼层
  把break或者continue去掉。
   现在程序判断循环的条件是 “有键按下就循环”,
   修改为: 检测按键状态,然后与上一次的按键状态进行比较,当符合“上一次按键是松开,这一次是按下”时才进行循环。
回复

使用道具 举报

ID:517466 发表于 2019-7-27 22:02 | 显示全部楼层
按照以下按键触发处理:
  按键按下了?
     是,延迟20ms,防抖动。
        按键按下了?
            是,按键松开了?
               是,调用对应这个按键的处理。
这个按键按下的处理逻辑是,只有按键被按下,并在松开后,才执行对应的处理会避免重复调用对应的处理。如果楼主学过windows系统的编程,比如VS,对于按键的事件处理有KeyDown,KeuUp,KeyPress,可以借用的,道理是一样的。
回复

使用道具 举报

ID:135715 发表于 2019-7-29 12:52 | 显示全部楼层
添加标志位 按下置1 松开清零 开关按下判断标志位 是1则不做处理 0则处理并将标志位置1
回复

使用道具 举报

ID:388197 发表于 2019-7-29 23:04 | 显示全部楼层
如果不在乎死等的话,把你触发功能的代码,夹在两个按键等待中间就行了,上面的一个如果没按就死等,下面的一个如果一直按就死等.
void Trigger()
{
    /*你要触发的功能*/
}
void main()
{
    while(1)
    {
        while(键没有按);
        Trigger();
        while(键按下了);
    }
}

如果不想死等,那就得设置些标志位,利用定时器中断隔一段时间检查你主程序的运行状态.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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