找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8312|回复: 8
收起左侧

大家好,我现在想要实现同时按下两个按键在执行一个动作,不知怎么写了,求大神帮....

[复制链接]
ID:216625 发表于 2017-10-7 18:21 | 显示全部楼层 |阅读模式



-----------------------------------------------------------------------------------------------------------------------------------
#include "reg51.h"          //头文件
//=======================声明区=================================

typedef unsigned char u8;     //    使用“u8”代替unsigned char;无符号字符
typedef unsigned int u16;     //    使用“u16”代替unsigned int;无符号整形

sbit open=P0^0;         //马达开
sbit suoshe=P0^1;        //锁舌开
sbit lock=P0^2;        //马达锁

sbit gb1=P0^6;        //关闭通道1    通道1为开锁
sbit gb2=P0^7;        //关闭通道2    通道2为关锁
#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;
/******************************************************************
我现在要同时按下k1、k2执行“kaisuo”。同时按下k2、k3执行“guansuo“
*******************************************************************/        
#define kaisuo k1
#define guansuo k2                        
                    
sbit op=P2^7;            //门锁已开的传感器,低电平有效使用k8代替
sbit clo_door=P2^6;        //门已关到位的传感器,低电平有效,使用k7代替
sbit loc=P2^5;            //门已锁住的传感器,低电平有效,使用k6代替

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

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

void main()
{
   
        P0=0xc0;  //LED:共阴0关闭输出,共阳1关闭输出
        //P2=0x0f;
         while(1)
        {
             keypros();
            
        }

   
}

/*===============子程序=======================================================*/
//=======================延时函数=====
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;    //马达开     
            }
            while(op==1) ;
            if(op==0)  //门锁开传感器
            {   
                delay(30);
                if(op==0)
                {   
                    delay(1);
                    open=0;            //马达停止
                    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) //==门未关闭,
            {   
              delay(300);    //delay,
              if(clo_door==1)  //==门未关闭,
              {
                gbtd2;
                }     
            }   
            if(clo_door==0)   
             {   
                delay(300);       //delay,
                if(clo_door==0)     //==0门关闭,
                {
                     if(loc==0)    //如果门已经锁住
                      {
                        gbtd2;  //     退出,关闭通道2
                      }
                       if(loc==1)   //门锁锁传感器,loc==1,
                       {   
                            lock=1;      //马达开始锁门
                            //while(k2==0);  //k2持续按下一直点亮led1
                            while(loc==1);
                            if(loc==0)
                            {   
                                delay(1);
                                if(loc==0)
                                {
                                    delay(100);
                                    lock=0;
                                    gbtd2;
                                }
                            }
                       }     
                }   
             }
        }
    }
}            

程序.docx

13.37 KB, 下载次数: 5

回复

使用道具 举报

ID:216625 发表于 2017-10-7 18:51 | 显示全部楼层
刚学51,还不熟,
回复

使用道具 举报

ID:111634 发表于 2017-10-7 22:39 | 显示全部楼层
本帖最后由 zl2168 于 2017-10-7 22:42 编辑

按键扩展Shift功能
在计算机中,有一个<Shift>键,同时按下某一按键和<Shift>键时,会导致该某一按键的第二个键功能,即相当于增加了一个键。计算机常用此法变相扩展了键盘键的数量,单片机也可采用类似<Shift>键,在基本不增加耗费I/O端线的前提下,变相扩展按键的数量。
实例74 按键扩展shift功能.7z (23.73 KB, 下载次数: 14)

评分

参与人数 1黑币 +30 收起 理由
map0391 + 30 又学到了新的知识

查看全部评分

回复

使用道具 举报

ID:237726 发表于 2017-10-7 22:50 | 显示全部楼层
加油,相信自己
回复

使用道具 举报

ID:216625 发表于 2017-10-8 02:06 | 显示全部楼层
zl2168 发表于 2017-10-7 22:39
按键扩展Shift功能
在计算机中,有一个键,同时按下某一按键和键时,会导致该某一按键的第二个键功能,即 ...

首先要感谢您的解答,又学到了一种控制方法。
我之前的问题描述的不够清楚,
这个是原始的

这个是要修改的

回复

使用道具 举报

ID:213173 发表于 2017-10-8 10:36 | 显示全部楼层
给你写了一个单键+2键+3键任意组合例程,你根据需求删改。
#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;                //计数延时
        static bit sign=0;        //按键自锁标志
        if(PX!=0x0f)                        //有键按下
        {
                cnt++;
                if(cnt>=1000)                //延时消抖,消除多键同步差
                {
                        cnt=1000;                //防止溢出
                        if(sign==0)
                        {
                                sign=1;                //防止键未抬起重复读键
                                switch(PX)        //4个键去除0f共15种组合,根据实际要求取舍
                                {
                                        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;
        }

}
/**************按键服务*******************/
void key_service()
{
        switch(key)        //共15种组合,根据实际任务取舍
        {
                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();                        //按键服务
        }
}

评分

参与人数 1黑币 +30 收起 理由
map0391 + 30

查看全部评分

回复

使用道具 举报

ID:162136 发表于 2017-10-8 10:47 | 显示全部楼层
if(loc==0) 这语句的意思是:如果小括号里的表达式是真的( loc等于0 )就执行下面大括号里的语句,否则跳过
{}
想加判断条件可以写如下
if((loc==0) && (abc==0)) 这意思是loc和abc都等于0时,才执行后面大括号里的语句,否则跳过
{}
&& 是一个运算符,有兴趣的话查查看,C语言还有其实的运算符,对编程序很有用。

评分

参与人数 1黑币 +30 收起 理由
map0391 + 30 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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