找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3145|回复: 5
打印 上一主题 下一主题
收起左侧

单片机P3.4和P3.5两个I/O口分别接两个独立按键程序问题

[复制链接]
跳转到指定楼层
楼主
ID:848140 发表于 2020-11-26 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学51单片机,我用单片机(STC89C52RC)的P3.4和P3.5两个I/O口分别接两个独立按键,想把这两个独立按键的四种状态(00,01,10,11)用P1口接的4个led小灯显示出来。
但是用我自己写的程序下载进学习板,每次只有当把两个按键都按下,才有一个小灯亮。其余三种按键状态怎么也显示不出来。

单片机源程序如下:
  1. #include<reg52.h>



  2. void main(void)

  3. {

  4.    unsigned char temp;

  5.    

  6.    while(1)

  7.    {

  8.        P3 = 0XFF; //P3.4,P3.5作为独立键盘输入口

  9.            temp = P3;

  10.            temp = temp & 0X30;  //保留 P3.4和P3.5,屏蔽其他位   

  11.                    switch(temp)

  12.             {

  13.                case 0X00: P1=0XFE; break;

  14.                case 0X01: P1=0XFD; break;

  15.                case 0X02: P1=0XFB; break;

  16.                case 0X03: P1=0XF7; break;

  17.             }

  18.            }}
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-11-27 06:40 | 只看该作者
#include<reg52.h>
void main(void)
{
        unsigned char temp;
        while(1)
        {
//                P3 = 0XFF; //P3.4,P3.5作为独立键盘输入口
//                temp = P3;
                temp = P3 & 0X30;  //保留 P3.4和P3.5,屏蔽其他位   
                switch(temp)
                {
                        case 0X00: P1=0XFE; break;
                        case 0X10: P1=0XFD; break;
                        case 0X20: P1=0XFB; break;
                        case 0X30: P1=0XF7; break;
                }
        }
}
回复

使用道具 举报

板凳
ID:848140 发表于 2020-11-28 19:15 | 只看该作者
wulin 发表于 2020-11-27 06:40
#include
void main(void)
{

多谢指点!
回复

使用道具 举报

地板
ID:849826 发表于 2020-11-29 07:33 来自手机 | 只看该作者
这个怎么改成,用一个按键控制三个灯分别点亮,就是一个按键控制电风扇那样,低,中,高,关。三个输出端
回复

使用道具 举报

5#
ID:848140 发表于 2020-11-30 23:40 | 只看该作者
6313 发表于 2020-11-29 07:33
这个怎么改成,用一个按键控制三个灯分别点亮,就是一个按键控制电风扇那样,低,中,高,关。三个输出端

按照你的想法,我用P1口的接的3个led小灯作为三个输出端。 用P3.4口接一个独立按键,用这个独立按键控制3个led小灯分别点亮。按一下,led1点亮;按两下,led2点亮;按三下,led3点亮;按四下,全部熄灭;

但我按键部分也有点问题,每次需要“小心的”按,不然 led小灯可能按第一下,第二个小灯就亮了。论坛里的高手给指点指点吧!


#include<reg52.h>

sbit key = P3^4;

void delayms(void);                               //延时
void led_refresh(unsigned char i);    //led显示
unsigned char keyscan(void);               //按键
void init(void);                                        //初始化

void main(void)
{
   unsigned char m;

   init();
   while(1)
        {
          m = keyscan();
          led_refresh(m);
        }

}
               
void delayms(void)
{
  unsigned int i;

  i = 10000;
  while(i--);
}

void led_refresh(unsigned char j)
{
      switch(j)
           {
                     case 0 :  P1=0xFF; break;
                  case 1 :        P1=0xFE; break;                // led1 点亮
                  case 2 :  P1=0XFD; break;                // led2 点亮
                  case 3 :  P1=0XFB; break;                // led3 点亮
           }
}

unsigned char keyscan(void)
{
       unsigned char z;
           static unsigned char count=0;

           if(key == 0)
                 delayms();
                if(key == 0)
                 {
                   {
                             count++;
                          if(count>=4)
                          {
                                  count = 0;
                          }
                           while(!key);
                   }
                  }
                 z=count;
                 return z;
}

void init(void)
{
         key = 1;
         P1 = 0XFF;
}

回复

使用道具 举报

6#
ID:848140 发表于 2020-12-1 23:52 | 只看该作者
本帖最后由 压线帽 于 2020-12-10 22:55 编辑

再次修改
1.用软件延时的方法:

#include<reg52.h>

sbit key = P3^4; //定义按键

void delayms(void);                         //延时
void led_refresh(unsigned char i);   //led显示
unsigned char keyscan(void);                 //按键
void init(void);                                         //初始化

void main(void)
{
   unsigned char m;

   init();
   while(1)
        {
          m = keyscan();
          led_refresh(m);
        }

}
               
void delayms(void)                   //延时函数
{
  unsigned int i;

  i = 10000;
  while(i--);
}

void led_refresh(unsigned char j)        //led显示
{
      switch(j)
           {
                     case 0 :  P1=0xFF; break;            // 全部熄灭
                  case 1 :        P1=0xFE; break;                // led1 点亮
                  case 2 :  P1=0XFD; break;                // led2 点亮
                  case 3 :  P1=0XFB; break;                // led3 点亮
           }
}

unsigned char keyscan(void)                          //按键扫描
{
        static unsigned char count = 0;
        unsigned char z = 0;
    static bit keyflag = 1;
    static bit backup = 1;

       keyflag = key;
              if(keyflag != backup )
           {
                 delayms();
                     if(keyflag == key)
                       {
                             if(backup == 0)
                            {
                                     count++;
                                   if(count >= 4)
                                             {
                                       count = 0;
                            }         }
                          }
                }
                backup = keyflag;
                    z=count;
                 return z;
}

void init(void)                               
{
         key = 1;
         P1 = 0XFF;
}







2.用中断扫描的方法:

#include<reg52.h>

sbit key = P3^4; //定义按键

void delayms(void);                         //延时
void led_refresh(unsigned char i);   //led显示
unsigned char keyscan(void);                 //按键
void init(void);                                         //初始化

void main(void)
{
   unsigned char m;

   init();
   while(1)
        {
          m = keyscan();
          led_refresh(m);
        }

}
               
void delayms(void)                   //延时函数
{
  unsigned int i;

  i = 10000;
  while(i--);
}

void led_refresh(unsigned char j)        //led显示
{
      switch(j)
           {
                     case 0 :  P1=0xFF; break;            // 全部熄灭
                  case 1 :        P1=0xFE; break;                // led1 点亮
                  case 2 :  P1=0XFD; break;                // led2 点亮
                  case 3 :  P1=0XFB; break;                // led3 点亮
           }
}

unsigned char keyscan(void)                          //按键扫描
{
        static unsigned char count = 0;
        unsigned char z = 0;
    static bit keyflag = 1;
    static bit backup = 1;

       keyflag = key;
              if(keyflag != backup )
           {
                 delayms();
                     if(keyflag == key)
                       {
                             if(backup == 0)
                            {
                                     count++;
                                   if(count >= 4)
                                             {
                                       count = 0;
                            }         }
                          }
                }
                backup = keyflag;
                    z=count;
                 return z;
}

void init(void)                               
{
         key = 1;
         P1 = 0XFF;
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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