您的位置:首页 > 其它

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

2016-01-25 11:50 148 查看
/*
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 的控制关系也是如此。

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



图片链接: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: