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

QQ登錄

只需一步,快速開始

搜索
查看: 9683|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

大家好,我現(xiàn)在想要實(shí)現(xiàn)同時(shí)按下兩個(gè)按鍵在執(zhí)行一個(gè)動(dòng)作,不知怎么寫了,求大神幫....

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主



-----------------------------------------------------------------------------------------------------------------------------------
#include "reg51.h"          //頭文件
//=======================聲明區(qū)=================================

typedef unsigned char u8;     //    使用“u8”代替unsigned char;無符號(hào)字符
typedef unsigned int u16;     //    使用“u16”代替unsigned int;無符號(hào)整形

sbit open=P0^0;         //馬達(dá)開
sbit suoshe=P0^1;        //鎖舌開
sbit lock=P0^2;        //馬達(dá)鎖

sbit gb1=P0^6;        //關(guān)閉通道1    通道1為開鎖
sbit gb2=P0^7;        //關(guān)閉通道2    通道2為關(guān)鎖
#define gbtd1 delay(100),gb1=0,delay(100),gb1=1
#define gbtd2 delay(100),gb2=0,delay(100),gb2=1                        
                    
                    
//==============傳感器輸入端 按鍵======================================
sbit k1=P2^0;            
sbit k2=P2^1;            
sbit k3=P2^2;            
sbit k4=P2^3;
/******************************************************************
我現(xiàn)在要同時(shí)按下k1、k2執(zhí)行“kaisuo”。同時(shí)按下k2、k3執(zhí)行“guansuo“
*******************************************************************/        
#define kaisuo k1
#define guansuo k2                        
                    
sbit op=P2^7;            //門鎖已開的傳感器,低電平有效使用k8代替
sbit clo_door=P2^6;        //門已關(guān)到位的傳感器,低電平有效,使用k7代替
sbit loc=P2^5;            //門已鎖住的傳感器,低電平有效,使用k6代替

void delay(u16 i);
void keypros();   

/*==============主程序==========================================================*/

void main()
{
   
        P0=0xc0;  //LED:共陰0關(guān)閉輸出,共陽1關(guān)閉輸出
        //P2=0x0f;
         while(1)
        {
             keypros();
            
        }

   
}

/*===============子程序=======================================================*/
//=======================延時(shí)函數(shù)=====
void delay(u16 i)
   {
     u16 j,k;
    for(j=0;j<i;j++)  
        for(k=0;k<200;k++);

   }

//=======================IO、按鍵端口控制==========================================
void keypros()
{
    if(kaisuo==0)
    {
         delay(30);
        //P0^6=1;
         if(kaisuo==0)
        {
            while(op==1)   
            {   
                 open=1;    //馬達(dá)開     
            }
            while(op==1) ;
            if(op==0)  //門鎖開傳感器
            {   
                delay(30);
                if(op==0)
                {   
                    delay(1);
                    open=0;            //馬達(dá)停止
                    suoshe=1;          //鎖舌打開
//                    while(k1==0) ;    //k1按下一直保持
                    delay(1000);
                    suoshe=0;
                    gbtd1;
                 }
             }
        }      
    }
    if(guansuo==0)
    {
         delay(30);
        //P0^7=1;
        if(guansuo==0)
        {
            if(clo_door==1) //==門未關(guān)閉,
            {   
              delay(300);    //delay,
              if(clo_door==1)  //==門未關(guān)閉,
              {
                gbtd2;
                }     
            }   
            if(clo_door==0)   
             {   
                delay(300);       //delay,
                if(clo_door==0)     //==0門關(guān)閉,
                {
                     if(loc==0)    //如果門已經(jīng)鎖住
                      {
                        gbtd2;  //     退出,關(guān)閉通道2
                      }
                       if(loc==1)   //門鎖鎖傳感器,loc==1,
                       {   
                            lock=1;      //馬達(dá)開始鎖門
                            //while(k2==0);  //k2持續(xù)按下一直點(diǎn)亮led1
                            while(loc==1);
                            if(loc==0)
                            {   
                                delay(1);
                                if(loc==0)
                                {
                                    delay(100);
                                    lock=0;
                                    gbtd2;
                                }
                            }
                       }     
                }   
             }
        }
    }
}            

程序.docx

13.37 KB, 下載次數(shù): 5

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

使用道具 舉報(bào)

沙發(fā)
ID:216625 發(fā)表于 2017-10-7 18:51 | 只看該作者
剛學(xué)51,還不熟,
回復(fù)

使用道具 舉報(bào)

板凳
ID:111634 發(fā)表于 2017-10-7 22:39 | 只看該作者
本帖最后由 zl2168 于 2017-10-7 22:42 編輯

按鍵擴(kuò)展Shift功能
在計(jì)算機(jī)中,有一個(gè)<Shift>鍵,同時(shí)按下某一按鍵和<Shift>鍵時(shí),會(huì)導(dǎo)致該某一按鍵的第二個(gè)鍵功能,即相當(dāng)于增加了一個(gè)鍵。計(jì)算機(jī)常用此法變相擴(kuò)展了鍵盤鍵的數(shù)量,單片機(jī)也可采用類似<Shift>鍵,在基本不增加耗費(fèi)I/O端線的前提下,變相擴(kuò)展按鍵的數(shù)量。
實(shí)例74 按鍵擴(kuò)展shift功能.7z (23.73 KB, 下載次數(shù): 14)

Proteus仿真一下,確認(rèn)有效。
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
map0391 + 30 又學(xué)到了新的知識(shí)

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:237726 發(fā)表于 2017-10-7 22:50 | 只看該作者
加油,相信自己
回復(fù)

使用道具 舉報(bào)

5#
ID:216625 發(fā)表于 2017-10-8 02:06 | 只看該作者
zl2168 發(fā)表于 2017-10-7 22:39
按鍵擴(kuò)展Shift功能
在計(jì)算機(jī)中,有一個(gè)鍵,同時(shí)按下某一按鍵和鍵時(shí),會(huì)導(dǎo)致該某一按鍵的第二個(gè)鍵功能,即 ...

首先要感謝您的解答,又學(xué)到了一種控制方法。
我之前的問題描述的不夠清楚,
這個(gè)是原始的

這個(gè)是要修改的

回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2017-10-8 10:36 | 只看該作者
給你寫了一個(gè)單鍵+2鍵+3鍵任意組合例程,你根據(jù)需求刪改。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
#define PX (P2&0x0f)        //P2低4位映射到PX低4位
uint key;                                //鍵值變量

/**************按鍵掃描*******************/
void key_scan()
{
        static uint cnt;                //計(jì)數(shù)延時(shí)
        static bit sign=0;        //按鍵自鎖標(biāo)志
        if(PX!=0x0f)                        //有鍵按下
        {
                cnt++;
                if(cnt>=1000)                //延時(shí)消抖,消除多鍵同步差
                {
                        cnt=1000;                //防止溢出
                        if(sign==0)
                        {
                                sign=1;                //防止鍵未抬起重復(fù)讀鍵
                                switch(PX)        //4個(gè)鍵去除0f共15種組合,根據(jù)實(shí)際要求取舍
                                {
                                        case 0x0e: key= 1; break;
                                        case 0x0d: key= 2; break;
                                        case 0x0c: key= 3; break;
                                        case 0x0b: key= 4; break;
                                        case 0x0a: key= 5; break;
                                        case 0x09: key= 6; break;
                                        case 0x08: key= 7; break;
                                        case 0x07: key= 8; break;
                                        case 0x06: key= 9; break;
                                        case 0x05: key=10; break;
                                        case 0x04: key=11; break;
                                        case 0x03: key=12; break;
                                        case 0x02: key=13; break;
                                        case 0x01: key=14; break;
                                        case 0x00: key=15; break;
                                }
                        }
                }
        }
        else                                 //鍵抬起
        {
                cnt=0;       
                sign=0;
        }

}
/**************按鍵服務(wù)*******************/
void key_service()
{
        switch(key)        //共15種組合,根據(jù)實(shí)際任務(wù)取舍
        {
                case 1:  P1=0xfe; break;        //LED顯示鍵值
                case 2:  P1=0xfd; break;
                case 3:  P1=0xfc; break;
                case 4:  P1=0xfb; break;
                case 5:  P1=0xfa; break;
                case 6:  P1=0xf9; break;
                case 7:  P1=0xf8; break;
                case 8:  P1=0xf7; break;
                case 9:  P1=0xf6; break;
                case 10: P1=0xf5; break;
                case 11: P1=0xf4; break;
                case 12: P1=0xf3; break;
                case 13: P1=0xf2; break;
                case 14: P1=0xf1; break;
                case 15: P1=0xef; break;
        }
}

void main()
{
        while(1)
        {
                key_scan();                                //按鍵掃描
                key_service();                        //按鍵服務(wù)
        }
}

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
map0391 + 30

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:162136 發(fā)表于 2017-10-8 10:47 | 只看該作者
if(loc==0) 這語句的意思是:如果小括號(hào)里的表達(dá)式是真的( loc等于0 )就執(zhí)行下面大括號(hào)里的語句,否則跳過
{}
想加判斷條件可以寫如下
if((loc==0) && (abc==0)) 這意思是loc和abc都等于0時(shí),才執(zhí)行后面大括號(hào)里的語句,否則跳過
{}
&& 是一個(gè)運(yùn)算符,有興趣的話查查看,C語言還有其實(shí)的運(yùn)算符,對(duì)編程序很有用。

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
map0391 + 30 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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