久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3971|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 自拍视频网站 | 日日操av | 国产激情视频网站 | 黄色在线免费网站 | 久久国产成人精品国产成人亚洲 | 国产激情视频在线免费观看 | 日本aa毛片a级毛片免费观看 | 一区二区三区久久 | 理论片免费在线观看 | 国产污视频在线 | 欧美精品一区二区三区在线 | 成人深夜福利 | 精品久久久久久18免费网站 | 日韩欧美高清 | 自拍偷拍中文字幕 | 欧美 日韩精品 | 久久精品色欧美aⅴ一区二区 | 久久33| 91视频久久 | 97色在线观看免费视频 | 一本色道精品久久一区二区三区 | 九九热在线观看视频 | 成人在线视 | 99视频免费在线观看 | 婷婷久久综合 | 成人黄色av网站 | 91青青草视频 | 中文字幕av在线 | 一级大黄 | 手机在线观看 | 一区二区精品 | 国产精品视频免费观看 | 日韩在线 | 9999久久| 国产精品theporn | 一区二区三区四区在线视频 | 一区二区不卡 | 午夜精品久久久久久久星辰影院 | 91免费在线看 | 日韩不卡一区二区三区 | 99精品国自产在线 |