找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2998|回复: 19
打印 上一主题 下一主题
收起左侧

各位大神们,帮帮我解决按键的问题

  [复制链接]
跳转到指定楼层
楼主
ID:164174 发表于 2017-2-10 18:29 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 初来驾到 于 2017-2-10 18:33 编辑

小弟刚学 51单片机  有个问题
有四个按键分别为A B C S,四个led灯为led1 led2 led3 led4。
按下A时, led1 ,led2亮,
按下 B时, led1, led2, led3亮
按下 C时,led1 , led2 ,led3,led4,亮
按下S 时,停止亮灯。
我想实现的是 比如说当按下B时,led 1和2 3亮,这时候无论是按A或者按B,或者C都是无效的,只能按S停止亮灯。
请大神们纸条明路啊 给个思路
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:85726 发表于 2017-2-10 20:07 | 只看该作者
只是简单的按键检测然后进行相应的处理而已!
回复

使用道具 举报

板凳
ID:164174 发表于 2017-2-10 21:56 | 只看该作者
ning 发表于 2017-2-10 20:07
只是简单的按键检测然后进行相应的处理而已!

怎么检测法
回复

使用道具 举报

地板
ID:164174 发表于 2017-2-10 21:56 | 只看该作者
ning 发表于 2017-2-10 20:07
只是简单的按键检测然后进行相应的处理而已!

怎么检测法
回复

使用道具 举报

5#
ID:164174 发表于 2017-2-10 23:12 | 只看该作者
大家看看我写的这  为什么不行
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint key;
sbit gwjr=P3^0;        //按键0               
sbit gwgz=P3^1;        //按键1                       
sbit gwpc=P3^2;        //按键2               
sbit tz=P3^3;        //停止键                          

sbit tsj=P1^0;        //led0                                 
sbit clq=P1^1;        //led1                                 
sbit blq=P1^2;        //led2                               
sbit cfj=P1^3;        //led3
uint key;                  
void delay(uint key);                               



void Key_Scan(key)         //扫描按键
{
    if(gwjr==0)
          delay(20);
          while(gwjr==0);
          if(gwjr==0)key=1;
          while(gwjr==0);

         if(gwgz==0)
          delay(20);
          while(gwgz==0);
          if(gwgz==0)key=2;
          while(gwgz==0);

          if(gwpc==0)
           delay(20);
           while(gwpc==0);
           if(gwpc==0)key=3;
          while(gwpc==0);
          
          
           if(tz==0)
           delay(20);
           while(tz==0);
           if(tz==0)key=0;
           while(tz==0);

}



void main()         
{
       
        Key_Scan(key);  
        switch(key)                
         {case 1:delay(10);
                          while(key==1);
                          tsj=~tsj;
                      delay(200);
                      clq=~clq;break;                             
                          
                 
               
            case 2:delay(10);
                          while(key==2);
                          tsj=~tsj;
                      delay(200);
                      clq=~clq;
                          delay(200);
                          blq=~blq;  
                          delay(200);
                          cfj=~cfj;break;
                          
                 
                 
                                                   
                case 3:delay(10);
                          while(key==3);
                          tsj=~tsj;
                      delay(200);
                      clq=~clq;
                          delay(200);
                          blq=~blq;break;
                         
                                                   
       
                 case 0:delay(10);
                   while(key==0);
                   tsj=tsj;
                   clq=clq;
                   blq=blq;
                   cfj=cfj;break;
        }
               
               
                                 
}
  

void delay(uint z)          
{
        uint x,y;
        for(x=z;x>0;x--)
        {
           for(y=1248;y>0;y--){}
        }
}  
回复

使用道具 举报

6#
ID:164204 发表于 2017-2-11 02:48 | 只看该作者
编程思路很重要,多学习好基础,熟悉判断语句,循环语句等等
回复

使用道具 举报

7#
ID:85726 发表于 2017-2-11 09:12 | 只看该作者
初来驾到 发表于 2017-2-10 23:12
大家看看我写的这  为什么不行
#include
#define uint unsigned int

主函数里连循环也没有,你咋检测按键!找本书看看吧,基础没打好!
回复

使用道具 举报

8#
ID:152237 发表于 2017-2-11 09:20 | 只看该作者
放一下标志位就可以了嘛
回复

使用道具 举报

9#
ID:105206 发表于 2017-2-11 10:33 | 只看该作者
用判断语句就可以了。
回复

使用道具 举报

10#
ID:105206 发表于 2017-2-11 11:11 | 只看该作者
#include <STC89C5xRC.H>

#define uint unsigned int
#define uchar unsigned char


sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit stop=P1^3;

sbit LED0=P0^0;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;



int main()
{
        P1=0xff;
        P0=0xff;
        while(1)
        {
                if(stop==0) P0=0xff;
                else if(key1==0)P0=0xfc;
                else if(key2==0)P0=0xf8;
                else if(key3==0)P0=0xf0;               
                    
        }
}


以上不知合不合你胃口。
回复

使用道具 举报

11#
ID:164174 发表于 2017-2-11 21:15 来自手机 | 只看该作者
jubaolun 发表于 2017-2-11 11:11
#include

#define uint unsigned int

这样的话 如果按了key1再去按key2的话 是会有效的 我想的是 key1 后 只有按下stop才能有效
回复

使用道具 举报

12#
ID:105206 发表于 2017-2-12 08:50 | 只看该作者
初来驾到 发表于 2017-2-11 21:15
这样的话 如果按了key1再去按key2的话 是会有效的 我想的是 key1 后 只有按下stop才能有效

你在切换的时候判断P0是否为0XFF,如果是,执行。否则,无效。
回复

使用道具 举报

13#
ID:164174 发表于 2017-2-13 12:52 | 只看该作者
jubaolun 发表于 2017-2-12 08:50
你在切换的时候判断P0是否为0XFF,如果是,执行。否则,无效。

我这样 还是不行呢

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint temp;
sbit key1=P3^0;                               
sbit key2=P3^1;                               
sbit key3=P3^2;                       
sbit stop=P3^3;

sbit led1= P1^0;                                         
sbit led2= P1^1;                                         
sbit led3= P1^2;                                       
sbit led4= P1^3;                                          
void delay(uint);

void main()       
{
         
                 
          if(key1==0)
                  {
                     delay(10);
                         if(key1==0)
                         {
                                 while(!key1);
                                 if(P1==0xff)
                                 {led1=0;delay(200);led2=0;}
       
                         }
                  
                   }
                  if (key2==0)
                  {
                     delay(10);
                         if(key2==0)
                         {
                                 while(!key2);
                                 if(P1==0xff)
                                 {led1=0;delay(200);led2=0; delay(200);led3=0;delay(200);led4=0;}
                          }
       
                  }
                  if (key3==0)
                  {
                     delay(10);
                         if(key3==0)
                         {
                                 while(!key3);
                                 if(P1==0xff)
                                 {led1=0;delay(200);led2=0; delay(200);led3=0;}
                          }
                   }
                  if(stop==0)
              {
                    delay(10);
                        if(stop==0)
                        {
                                 while(!stop);
                                 led1=1;led2=1;led3=1;led4=1;
                       
                        }
                 
                 
                  }
               
       
}



void delay(uint z)          
{
        uint x,y;
        for(x=z;x>0;x--)
        {
           for(y=1248;y>0;y--){}
        }
}  

回复

使用道具 举报

14#
ID:164174 发表于 2017-2-13 21:24 | 只看该作者
哎 快来帮帮俺
回复

使用道具 举报

15#
ID:87568 发表于 2017-2-13 21:35 | 只看该作者
提供个思路 在其它语句中你可以使用while函数  比如while(a)  在这个语句中死循环   在stop函数中添加
=0;语句 只有当按下stop键  才能解除死循环  楼主可以试试  
回复

使用道具 举报

16#
ID:84299 发表于 2017-2-13 22:01 | 只看该作者
基础严重不足,建议多看看书,再这说是不明白的
回复

使用道具 举报

17#
ID:164589 发表于 2017-2-14 15:22 | 只看该作者
编程思路很重要,多学习好基础,熟悉判断语句,循环语句等等
回复

使用道具 举报

18#
ID:153437 发表于 2017-2-16 19:13 | 只看该作者
算法问题。我也想不出来好的办法...暂停可以用外部中断。
回复

使用道具 举报

19#
ID:111634 发表于 2017-2-16 20:17 | 只看该作者
“uint key;”,又是一个外行老师教出来的!!!
回复

使用道具 举报

20#
ID:164363 发表于 2017-2-18 13:22 | 只看该作者
补补基础吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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