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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6214|回復: 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);
        }
}

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

使用道具 舉報

沙發
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,可以借用的,道理是一樣的。
回復

使用道具 舉報

5#
ID:135715 發表于 2019-7-29 12:52 | 只看該作者
添加標志位 按下置1 松開清零 開關按下判斷標志位 是1則不做處理 0則處理并將標志位置1
回復

使用道具 舉報

6#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产探花在线精品一区二区 | 国产色网 | 亚洲精品一区二区三区蜜桃久 | 日韩电影一区二区三区 | 啪啪免费| 欧美aⅴ| 亚洲美女av网站 | 特级生活片 | 免费毛片在线 | 玖玖视频 | 可以在线观看av的网站 | 亚洲成人三级 | 欧美精品一区二区在线观看 | 成人久久18免费网站麻豆 | 亚洲成av | 可以免费观看的av | 在线免费观看黄a | 欧美日韩中文字幕在线 | 欧美日韩亚洲成人 | 亚洲国产精品一区在线观看 | 午夜看片网站 | 日本一区二区高清不卡 | 美女天天操 | 色婷婷国产精品 | 亚洲精品成人在线 | 一区二区三区欧美 | 婷婷激情综合 | 欧美日韩中文字幕在线播放 | 一区二区中文 | 午夜国产在线 | 中文字幕国产 | 亚洲欧美在线视频 | 国产中文字幕亚洲 | 日本三级线观看 视频 | 欧洲尺码日本国产精品 | 婷婷免费视频 | 影音先锋中文字幕在线观看 | 国产成人免费一区二区60岁 | 久久久久精 | 久久免费看 | www中文字幕 |