找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3817|回復: 5
收起左側

單片機P3.4和P3.5兩個I/O口分別接兩個獨立按鍵程序問題

[復制鏈接]
ID:848140 發(fā)表于 2020-11-26 18:14 | 顯示全部樓層 |閱讀模式
初學51單片機,我用單片機(STC89C52RC)的P3.4和P3.5兩個I/O口分別接兩個獨立按鍵,想把這兩個獨立按鍵的四種狀態(tài)(00,01,10,11)用P1口接的4個led小燈顯示出來。
但是用我自己寫的程序下載進學習板,每次只有當把兩個按鍵都按下,才有一個小燈亮。其余三種按鍵狀態(tài)怎么也顯示不出來。

單片機源程序如下:
  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.            }}
復制代碼
回復

使用道具 舉報

ID:213173 發(fā)表于 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 發(fā)表于 2020-11-28 19:15 | 顯示全部樓層
wulin 發(fā)表于 2020-11-27 06:40
#include
void main(void)
{

多謝指點!
回復

使用道具 舉報

ID:849826 發(fā)表于 2020-11-29 07:33 來自手機 | 顯示全部樓層
這個怎么改成,用一個按鍵控制三個燈分別點亮,就是一個按鍵控制電風扇那樣,低,中,高,關。三個輸出端
回復

使用道具 舉報

ID:848140 發(fā)表于 2020-11-30 23:40 | 顯示全部樓層
6313 發(fā)表于 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;
}

回復

使用道具 舉報

ID:848140 發(fā)表于 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;
}

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表