按键小程序请教

2020-01-19 19:34发布

刚开始学习51单片机,写了个小程序,当P3^2口按键按下,点亮P1^0口的LED,并间隔约0.5秒闪烁;当P3^7口按键按下,熄灭LED。现在看到的现象是能点亮和熄灭,但不会闪烁。请大家帮忙看看是什么问题。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar num;
sbit key_sec05=P3^2;
sbit key_stop=P3^7;
sbit out=P1^0;

void allport_Init()                                //端口初始化
{
        P0=P1=P2=P3=0xff;
}

void delayms(uint xms)      //延时
{
        uint b,c;
        for(b=xms;b>0;b--)
    for(c=100;c>0;c--);
}

void keyscan()                                //按键扫描
{
        if(key_sec05==0)
        {
                delayms(10);
                if(key_sec05==0)
                {
                    while(1)
                        {
                                out=0;
                                if(num==10)
                {
                                        num=0;
                        out=~out;                        //使发光管状态取反
                                }               
                                if(key_stop==0)
                                {       
                                        delayms(10);
                                        if(key_stop==0)
                                        {
                                                out=1;
                                                break;
                                        }       
                        }
                          }
                }
        }
}
                               
void T0_time() interrupt 1
{
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        num++;
}

void main()
{
        allport_Init();       
        TMOD=0x01;//定时器0工作于方式1
          TH0=(65535-45872)/256;
          TL0=(65535-45872)%256;
          EA=1;//开总中断
          ET0=1;//开定时器0的中断
          TR0=1;//启动定时器                                       
        while(1)
        {
                keyscan();
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
weare
1楼-- · 2020-01-20 00:41
 精彩回答 2  元偷偷看……
e1ki0lp
2楼-- · 2020-01-20 06:25
  1. void keyscan(void)
  2. {
  3.     if(key_sec05 == 0)
  4.     {
  5.         delayms(10);
  6.         if(key_sec05 == 0)
  7.         {
  8.             out = 0;
  9.             while(1)
  10.             {
  11.                 if(num == 10)
  12.                 {
  13.                     num = 0;
  14.                     out = ~out;
  15.                 }
  16.                 if(key_stop == 0)
  17.                 {
  18.                     delayms(10);
  19.                     if(key_stop == 0)
  20.                     {
  21.                         out = 1;
  22.                         break;
  23.                     }
  24.                 }
  25.             }
  26.         }
  27.     }
  28. }
复制代码
cd4000
3楼-- · 2020-01-20 10:26
我试了,去掉后,当P3^2口按键按下,要过差不多10秒后P1^0口的LED才会点亮并闪烁
cd4000
4楼-- · 2020-01-20 16:03
倒是P3^7口按键一按下,马上就熄灭LED。
Jmhh247
5楼-- · 2020-01-20 19:40
你那个 while(1) 里面的内容写的有问题

你想一下,当下面这个 if 语句成立后会出现什么情况

  1.          if(num==10)
  2.                 {
  3.                         num=0;
  4.                         out=~out;                        //使发光管状态取反
  5.                  }           
复制代码

情况就是灯确实取反了,但是程序马上进入下次的 while (1)里,在这里面执行的第一条
程序就是点灯
  1. out=0;
复制代码

上面这个过程非常快,你肉眼看到的就是灯一直在亮,没闪烁……

你的要求实现起来很简单的,你再仔细想想吧
Jmhh247
6楼-- · 2020-01-20 22:43
 精彩回答 2  元偷偷看……

一周热门 更多>