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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5599|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

請教一個單片機(jī)io口識別兩個按鍵的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本人菜鳥工程師,最近公司業(yè)務(wù)給我一個單片機(jī)板子。要抄板。

主控室一顆8腳的mcu,絲印被磨掉了。其中一個引腳控制了兩個按鍵。對應(yīng)原理圖如下。




現(xiàn)用代碼實(shí)現(xiàn)如下。

  1. #include <STC15F2K60S2.H>
  2. #include <intrins.h>

  3. sbit key = P2^6;
  4. sbit test = P2^7;
  5. sbit test2 = P2^5;

  6. bit key1 = 0;
  7. bit key1_last = 0;
  8. bit key2 = 0;
  9. bit key2_last = 0;

  10. void ConfigTimer0();
  11. void Key_Scanf();

  12. void main()
  13. {
  14.         ConfigTimer0();
  15.         EA = 1;

  16.         while(1)
  17.         {
  18.                  Key_Scanf();
  19.         }
  20. }

  21. void ConfigTimer0()                        //12mhz  100us
  22. {
  23.         AUXR &= 0x7F;                //定時器時鐘12T模式
  24.         TMOD &= 0xF0;                //設(shè)置定時器模式
  25.         TL0 = 0x30;                //設(shè)置定時初值
  26.         TH0 = 0xF8;                //設(shè)置定時初值
  27.         TF0 = 0;                //清除TF0標(biāo)志
  28.         TR0 = 1;                //定時器0開始計(jì)時
  29.         ET0 = 1;
  30. }

  31. void Key_Scanf()
  32. {
  33.          if(key1_last != key1)
  34.         {
  35.                 key1_last = key1;
  36.                 if(1 == key1)
  37.                 {
  38.                         test = ~test;         
  39.                 }               
  40.         }
  41.         
  42.         if(key2_last != key2)
  43.         {
  44.                 key2_last = key2;
  45.                 if(1 == key2)
  46.                 {
  47.                         test2 = ~test2;         
  48.                 }               
  49.         }        
  50. }

  51. void InterruptTimer0() interrupt 1
  52. {
  53.          static unsigned char cnt = 0;
  54. //        static unsigned char key_down_cnt = 0;
  55. //        static unsigned char key_up_cnt = 0;
  56.         
  57.         static unsigned char key_buf = 0x0f;

  58.         key_buf <<= 1;

  59.         if(key == 1)
  60.         {
  61.                  key_buf = key_buf | 0x01;
  62.         }
  63.         else
  64.         {
  65.                 key_buf = key_buf & 0xfe;         
  66.         }

  67.         if(key_buf == 0xff)
  68.         {
  69.                  key1 = 1;
  70.                 key2 = 0;               
  71.         }
  72.         else if(key_buf == 0x00)
  73.         {
  74.                    key1 = 0;
  75.                 key2 = 1;
  76.         }
  77.         else
  78.         {
  79.                 key1 = 0;
  80.                 key2 = 0;
  81.         }


  82.         if(cnt == 0)
  83.         {
  84.                  key = 1;
  85.                 P2M0 = 0x00;P2M1 = 0x00;
  86. //                P2M0 = 0x00;P2M1 = 0xff;
  87. //                P2M0 = 0xff;P2M1 = 0x00;
  88. //                P2M0 = 0xff;P2M1 = 0xff;
  89. //                key = 1;
  90.                 cnt++;
  91.         }               
  92.         else
  93.         {
  94. //                 key = 0;
  95. //                P2M0 = 0x00;P2M1 = 0x00;
  96.                 P2M0 = 0x00;P2M1 = 0xff;
  97. //                P2M0 = 0xff;P2M1 = 0x00;
  98. //                P2M0 = 0xff;P2M1 = 0xff;
  99.                 key = 0;
  100.                 cnt = 0;
  101.         }
  102. //        else{}
  103. }
復(fù)制代碼

示波器檢測按鍵io口,如下。

無按鍵



上拉部分按鍵



下拉部分按鍵



但程序最終還是無法很好的實(shí)現(xiàn)功能。
給各位一下參考,共同探討一下。




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2018-5-8 21:02 | 只看該作者
//使用STC15W104系列
#include <STC15F2K60S2.H>
#define uint unsigned int
#define uchar unsigned char
sbit key = P3^2;
sbit LED1= P3^3;
sbit LED2= P3^4;

void delay(uint k)//1ms延時
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=114;j>0;j--);
}

void key_scan()//按鍵掃描程序
{
        P2M1|=0x40;        //P2.6設(shè)置高阻
        key=0;                //P2.6置0
        if(key==1)        //判斷是否為1,S1按下
        {
                delay(10);//延時       
                if(key==1)//再次判斷是否為1,S1按下
                {
                        LED1=0;//LED輸出狀態(tài)
                        LED2=1;
                }
        }
        P2M1&=0xBF; //P2.6設(shè)置準(zhǔn)雙向
        key=1;                //P2.6置1
        if(key==0)        //判斷是否為0,S3按下
        {
                delay(10);//延時       
                if(key==0)//再次判斷是否為0,S3按下
                {
                        LED1=1;//LED輸出狀態(tài)
                        LED2=0;
                }               
        }
}

void main()
{
        P3M0=0x00;        //初始化P3口準(zhǔn)雙向
        P3M1=0x00;        //初始化P3口準(zhǔn)雙向
        LED1=1;                //初始化LED1熄滅
        LED2=1;                //初始化LED2熄滅
        while(1)
        {
                key_scan();//按鍵掃描
        }
}
回復(fù)

使用道具 舉報

板凳
ID:960619 發(fā)表于 2021-11-9 14:57 | 只看該作者
本帖最后由 baobao125 于 2021-11-9 14:59 編輯
wulin 發(fā)表于 2018-5-8 21:02
//使用STC15W104系列
#include
#define uint unsigned int

這樣不行,實(shí)際電路這樣按鍵S1是一直被按下的狀態(tài),P26一下置1一下置0,檢測P26才1.5V左右跳動,為何就成了高電平?
回復(fù)

使用道具 舉報

地板
ID:624769 發(fā)表于 2021-11-9 16:06 | 只看該作者
這東西8年前還是多少年前,STC剛出15系列的時候,倒是研究過。
這個電路,需要加個電容,和下拉電阻,

先用強(qiáng)推挽給電容充電,然后轉(zhuǎn)高阻,讀取按鍵,
如果依然是高,說明接地的按鍵沒有按下,不然電容被放電了。
然后,等待一定時間,(取決于電容和下拉電阻),變低了,說明接VCC的按鍵也沒有按下,反之,接VCC按鍵按下了。
回復(fù)

使用道具 舉報

5#
ID:960619 發(fā)表于 2021-11-9 17:55 | 只看該作者
188610329 發(fā)表于 2021-11-9 16:06
這東西8年前還是多少年前,STC剛出15系列的時候,倒是研究過。
這個電路,需要加個電容,和下拉電阻,

就上面的電路,用ADC去判斷應(yīng)該可以吧
回復(fù)

使用道具 舉報

6#
ID:624769 發(fā)表于 2021-11-9 18:35 | 只看該作者
baobao125 發(fā)表于 2021-11-9 17:55
就上面的電路,用ADC去判斷應(yīng)該可以吧

用ADC判斷就沒必要這樣接了,這樣接明顯是沒有ADC的IO,不過這個接法有缺陷,雖然IO = 1 可以被接地的按鈕拉低, 但是IO = 0, 不是所有的單片機(jī)都可以被接VCC的按鈕拉高,所以要有通用性的話,還是需要利用電容充放電來確認(rèn)接VCC的按鍵有沒有按下。
回復(fù)

使用道具 舉報

7#
ID:587810 發(fā)表于 2021-11-10 16:15 | 只看該作者
識別高低電平就可以了吧
回復(fù)

使用道具 舉報

8#
ID:966423 發(fā)表于 2021-12-2 10:26 | 只看該作者
你這樣還不如直接放AD口,兩個電阻不一樣的話AD值就不一樣了,就可以判斷了
回復(fù)

使用道具 舉報

9#
ID:979299 發(fā)表于 2021-12-2 11:25 | 只看該作者
圖上不是一個引腳控制兩個按鍵,是兩個按鍵控制一個引腳,按上面輸入高電平,按下面輸入低電平。又看到回復(fù)S1是一直按下去的,那就一直是高電平了啊,就沒有按鍵的意義了,如果P2.6為低電平按S3沒有作用的,如果P2.6為高電平時,S1常通又按S3相當(dāng)于經(jīng)R7取得一個中間值,這個值對單片機(jī)無用。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 性精品 | 91视频18| 91免费电影 | 国产激情视频在线观看 | 亚洲高清电影 | 亚洲性人人天天夜夜摸 | 午夜免费视频观看 | 91视频网| 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 日本欧美国产 | 91视频在线 | 五月激情综合网 | 日韩成年人视频在线 | 国产精品久久久久久久久久久久久 | 日韩精品成人免费观看视频 | 国产精品s色 | 97精品超碰一区二区三区 | 久久伊人一区 | 久久机热 | 精品在线看 | 亚洲视频一区在线观看 | 国产一区二区三区四区五区加勒比 | 精产国产伦理一二三区 | 国产精品一区二区三区四区 | 国产精品自产拍在线观看蜜 | 天天干视频 | 亚洲免费人成在线视频观看 | 瑞克和莫蒂第五季在线观看 | 国产精品jizz在线观看老狼 | 日韩插插| 三极网站 | 高清一区二区 | 欧美一级在线观看 | 欧美精品乱码久久久久久按摩 | 国产三区在线观看视频 | 久久大全 | 国产一区 在线视频 | 97精品久久| 精产国产伦理一二三区 | 国产一区二 | 日韩欧美在线观看视频 |