求教关于51单片机的独立按键

2019-07-15 08:56发布

求教:为什么这个关于独立按键的程序只能执行一个按键的功能,我明明写了两个按键的执行程序
怎么才能让着两个按键执行程序?而不是再开关一次电源
# include "reg52.h"
# define u16 unsigned int
typedef unsigned char u8;

sbit k1 = P3^1;     //  位定义 k1
sbit k2 = P3^0;     //  位定义 k2

sbit beep = P1^5;    //  定义P1^5为蜂鸣器
sbit a = P2^2;     //   
sbit b = P2^3;
sbit c = P2^4;

u8 h,m;
u8 code n[]={0x7b,0x3e,0x3f,0x38}; // 显示L o v e

# define smg P0     //  宏定义 led
  
void delay(u16 i)  //  延时函数
{
while (i--);
}

void key1()   //  独立按键k1控制数码管动态显示
{
if (k1)
{
  delay(1000);
  if (k1 == 0)
  {
      while (1)
   {
    for(h=0;h<=7;h+=2)
    {
     switch (h)           //  位选,选择点亮的数码管,
     {
      case 0: a=0;b=0;c=0;break; //显示第0位
      case 2: a=0;b=1;c=0;break; //    2
      case 4: a=0;b=0;c=1;break; //    4
      case 6: a=0;b=1;c=1;break; //    6
     }
        m=h/2;         
     smg=n[m];         //  发送段码
     delay(100);
    }
   }
  }
  while (!k1);
}
}

void key2()      //    独立按键k2控制蜂鸣器
{
if (k2 == 0)
{
  delay(1000);
  if (k2 == 0)
  {
   while (1)
   {
    beep=~beep;
    delay(500);
      }
  }
  while (!k2);
}
}

void main()
{
while (1)
{
   key1();
   key2();
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
小丑殇
1楼-- · 2019-07-15 12:15
人中狼 发表于 2018-1-30 18:16
看你的思路是两个按键在按键按下不放的情况下会执行相应的操作,不过在按键释放后并没有清除相应的操作,比如蜂鸣器不确定是否关闭,显示是否清除。
要根据你的错误现象来分析程序的问题,不过在执行完相应的操作后,进行必要的状态回归是必要的。 ...

可是怎么才能回归最初的状态?
小丑殇
2楼-- · 2019-07-15 17:27
wulinwl 发表于 2018-1-30 21:17
你在两个按键程序中都使用了死循环while (1),上电后按任何一个键,程序就死在里面出不来。

如果没有while(1);数码管就不能动态显示了,蜂鸣器也不能工作
人中狼
3楼-- · 2019-07-15 20:25
在 while (!k1);之后,加一个更改显示内容的显示,比如显示全0,
在while (!k2);之后,加一个关闭蜂鸣器的语句,比如高电平关闭蜂鸣器,则加一个beep=1;
wulinwl
4楼-- · 2019-07-15 23:02
小丑殇 发表于 2018-1-31 15:02
如果没有while(1);数码管就不能动态显示了,蜂鸣器也不能工作

你只能把数码管显示程序和蜂鸣器程序独立出来放在主函数中运行,两个按键写一个按键扫描程序,通过输出键值变量控制数码管显示和蜂鸣器。

一周热门 更多>