找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3357|回复: 15
收起左侧

独立按键的问题,请帮忙看看。

  [复制链接]
ID:63752 发表于 2014-7-12 13:11 | 显示全部楼层 |阅读模式
    独立按键控制LED亮和灭,按下按键,LED亮,再按下,LED灭。因为我们很多都是按完按键,松开手LED才亮。 我现在是想一按按键,LED就亮或灭,这个又怎么写呢?While(!D)这句是松手之后,LED亮或灭,但是,如果去掉这一句松手检测,那按键就不灵活了,有时行,有时不行,有时要按很多次才亮或者灭,请朋友们帮帮忙,要怎样改才正确?谢谢。下面是程序
void main()
{
    static bit temp;
BZ=1;
D=1;
temp=BZ;
while(1)
  {
    if(D==0)
    {
    Delay(10);
     if(D==0)
        {
        temp=~temp;
     while(!D);
     Delay(10);
     BZ=temp;
     }
    }
   
  }
}
回复

使用道具 举报

ID:2318 发表于 2014-7-12 20:26 来自手机 | 显示全部楼层
把延时涵数增加一点时间看看
回复

使用道具 举报

ID:63918 发表于 2014-7-12 22:31 | 显示全部楼层
加一个标志位
回复

使用道具 举报

ID:63752 发表于 2014-7-13 11:31 来自手机 | 显示全部楼层
如何加标志位?能说清楚吗?
回复

使用道具 举报

ID:61506 发表于 2014-7-17 08:37 | 显示全部楼层
说实话,你的程序我看的很是模糊。如果你能把你的变量都加上注释,这样更方便我们给你解答。
回复

使用道具 举报

ID:63752 发表于 2014-7-18 13:03 | 显示全部楼层
涅磐广广 发表于 2014-7-17 08:37
说实话,你的程序我看的很是模糊。如果你能把你的变量都加上注释,这样更方便我们给你解答。

D是按键,BZ是LED的IO口。temp是一个静太标志位,程序就这三个参数了。
回复

使用道具 举报

ID:19715 发表于 2014-7-26 10:44 | 显示全部楼层
小错误,更换一下语句位置就好
void main()
{
  static bit temp;
  BZ=1;
  D=1;
  temp=BZ;
while(1)
  {
    if(D==0)
    {
      Delay(10);
      if(D==0)
        {
        temp=~temp;
        BZ=temp;
        while(!D);
        }
    }   
  }
}
回复

使用道具 举报

ID:19715 发表于 2014-7-26 10:45 | 显示全部楼层
标志位设置,
bit temp;
回复

使用道具 举报

ID:63752 发表于 2014-7-26 12:41 | 显示全部楼层
问题已解决,谢谢~~
回复

使用道具 举报

ID:183120 发表于 2017-4-17 08:43 | 显示全部楼层
XUSHENG 发表于 2014-7-26 12:41
问题已解决,谢谢~~

请问楼主是怎么解决的,求教
回复

使用道具 举报

ID:17109 发表于 2017-10-29 21:12 | 显示全部楼层
明白 发表于 2014-7-26 10:44
小错误,更换一下语句位置就好
void main()
{

#include <reg52.h>
//定义一下,方便使用
#define uchar unsigned char
#define uint  unsigned int
sbit key1=P2^4;                //按键1定义
sbit key2=P2^5;                //按键2定义
sbit key3=P2^6;                //按键3定义
sbit key4=P2^7;                //按键4定义
sbit led1=P3^0;                //led1端口
sbit led2=P3^1;                //led2端口
sbit led3=P3^2;                //led3端口
sbit led4=P3^3;            //led4端口
/**************************临时变量定义****************************/
uchar keyflag_1=0;   //按键标志位       
uchar keyflag_2=0;   //按键标志位       
uchar keyflag_3=0;   //按键标志位       
uchar keyflag_4=0;   //按键标志位         
/*************************毫秒延时函数****************************/
void delayms(uint z)
{
        uint x,y;
        for(x=0;x<=76;x++)
                for(y=0;y<=z;y++);
}
/**************************按键扫描子程序****************************/
void keyscan()
{
        if(key1==0)                                //第一个按键按下
        {
                delayms(5);                        //进行短暂延时消除按键的抖动
                if(key1==0)                        //第一个按键确实按下
                {
               
                        keyflag_1++;   //键一按下,标志位加一
                        while(!key1);        //松手检测
                }
        }
        if(keyflag_1==1){led1=0;} //点亮LED1       
        if(keyflag_1==2){led1=1;keyflag_1=0; } //关闭LED1

        if(key2==0)                                //第二个按键按下
        {
                delayms(5);                        //进行短暂延时消除按键的抖动
                if(key2==0)                        //第二个按键确实按下
                {
                           keyflag_2++;   //键一按下,标志位加一
                        while(!key2);        //松手检测
                }
        }
    if(keyflag_2==1){led2=0;} //点亮LED2       
        if(keyflag_2==2){led2=1;keyflag_2=0; } //关闭LED2

        if(key3==0)                                //第三个按键按下
        {
                delayms(5);                        //进行短暂延时消除按键的抖动
                if(key3==0)                        //第三个按键确实按下
                {
                        keyflag_3++;   //键一按下,标志位加一
                        while(!key3);        //松手检测
                }
        }
        if(keyflag_3==1){led3=0;} //点亮LED3       
        if(keyflag_3==2){led3=1;keyflag_3=0; } //关闭LED3

        if(key4==0)                                //第四个按键按下
        {
                delayms(5);                        //进行短暂延时消除按键的抖动
                if(key4==0)                        //第四个按键确实按下
                {
                        keyflag_4++;   //键一按下,标志位加一
                        while(!key4);        //松手检测
                }
        }
        if(keyflag_4==1){led4=0;} //点亮LED4       
        if(keyflag_4==2){led4=1;keyflag_4=0; } //关闭LED4
}
void main()
{
        while(1)        //程序循环执行
        {
                keyscan();                //按键扫描,子函数

        }
}
回复

使用道具 举报

ID:17109 发表于 2017-10-29 21:16 | 显示全部楼层
明白 发表于 2014-7-26 10:44
小错误,更换一下语句位置就好
void main()
{

独立按键控制LED亮和灭,按下按键,LED亮,再按下,LED灭。因为我们很多都是按完按键,松开手LED才亮。 我现在是想一按按键,LED就亮或灭,这个又怎么写呢?请朋友们帮帮忙,要怎样改才正确?谢谢。下面是程序
回复

使用道具 举报

ID:244052 发表于 2017-10-29 23:27 | 显示全部楼层
加标志位
回复

使用道具 举报

ID:244229 发表于 2017-10-30 15:33 | 显示全部楼层
说实话,你的程序我看的很是模糊。如果你能把你的变量都加上注释,这样更方便我们给你解答
回复

使用道具 举报

ID:244279 发表于 2017-10-30 17:25 | 显示全部楼层
把延时涵数增加一点时间看看
回复

使用道具 举报

ID:204609 发表于 2017-10-31 12:13 | 显示全部楼层
ll13536121668 发表于 2017-10-29 21:12
#include
//定义一下,方便使用
#define uchar unsigned char

你的程序有问题,每次都是松手之后,才开始判断驱动灯亮还是灯灭,while(!key);去掉。led4=0;后加keyflag=0;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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