P1 接 8 个独立按键,P2 接 8 个 LED,要求用按键控制 LED 的发光状态

来源:互联网 发布:mac的桌面 编辑:程序博客网 时间:2024/05/01 07:46

/*
P1.0~P1.5 接的 6 个按键,分别对应控制 P2.0~P2^5 所接的 6 个 LED。
按一下 P1.0 的按键,P2.0 接的 LED 就长亮,重复按一下,LED 就熄灭;
这 6 路都如此控制。

P1.6 和 P1.7 的按键控制对应的 P2.6 和 P2.7 所接的 2 个 LED。
但是要求输出是 100ms 交替闪烁的信号。

按一下 P1.6 的按键,P2.6 接的 LED 就以100ms的间隔闪烁,重复按一下,LED 就熄灭;
P1.7 与 P2.7 的控制关系也是如此。


下列程序已经调试通过,可以满足上述要求。
仿真截屏如下:

P1 接 8 个独立按键,P2 接 8 个 LED,要求用按键控制 LED 的发光状态 - 非著名博主 - 电子信息角落
图片链接:http://xiangce.baidu.com/picture/detail/93d80b5bd9e3be333f45174afb0e9eee071f831c

*/

#include <AT89X51.h>

#include <intrins.h>

#define uchar  unsigned char 

#define uint   unsigned int 

//-----------------------------------------------------------

uchar  aa, bb, cc, dd;     //设定变量.

//-----------------------------------------------------------

void delay(uint ms)

{

    uchar t;

    while(ms--)  for(t = 0; t < 123; t++);

}

//-----------------------------------------------------------

void main(void)

{

    TMOD = 0x01;     // T0定时方式1

    TL0 = (65536 - 50000) % 256; //50ms@12MHz

    TH0 = (65536 - 50000) / 256; 

    TR0 = 1;                //启动定时器0

    IE  = 0x82;             //中断允许.

    bb = 0x3f;

    cc = 0;

    while(1) {

      aa = P1;           //读入按键.

      if (aa < 255) {    //如果有按下.

        delay(10);       //延时消抖.

        aa = P1;         //再读.

        if (aa < 255) {  //如果仍然按下.

          if (aa == 255 - 1)   bb ^= 1;  //根据按键,分别处理.

          if (aa == 255 - 2)   bb ^= 2;  //这里也可以使用 case 语句.

          if (aa == 255 - 4)   bb ^= 4;

          if (aa == 255 - 8)   bb ^= 8;

          if (aa == 255 - 16)  bb ^= 16;

          if (aa == 255 - 32)  bb ^= 32;

          if (aa == 255 - 64)  bb ^= 64;

          if (aa == 255 - 128) bb ^= 128;

          P2 = (cc & 0xc0) + (bb & 0x3f);//输出.

          while(aa < 255)  aa = P1;      //等待按键松开.

    } } }

}

//-----------------------------------------------------------

void T0_INT() interrupt 1

{

    TL0 = (65536 - 50000) % 256; //50ms@12MHz

    TH0 = (65536 - 50000) / 256; 

    dd++;

    dd %= 4;                     //4,代表200ms

    if (dd == 0) {               //如果时间到了.

      if ((bb & 64) == 64)    cc ^= 64;  //按照指定位取反.

      else                    cc |= 64;  //关闭指定位.

      if ((bb & 128) == 128)  cc ^= 128;

      else                    cc |= 128; //关闭指定位.  

      P2 = (cc & 0xc0) + (bb & 0x3f); //输出.

    }

}

//----------------------------------------------------------- 

//提问者对于答案的评价:程序很好,因为有了你的无私帮助,让我们这些菜鸟更快的融入单片机世界,感谢。

//原题网址:http://zhidao.baidu.com/question/287237680.html

0 0
原创粉丝点击