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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2184|回復: 15
打印 上一主題 下一主題
收起左側

關于單片機矩陣按鍵讀取的程序理解

[復制鏈接]
跳轉到指定樓層
樓主
這個是某設備上的程序,我有一些不明白的地方把它復制過來了,就是按鍵值的范圍我不太理解

單片機源程序如下:
#include <c8051F020.H>
#include <intrins.H>
#define Keybus  P0
unsigned char R_Keyno;

unsigned char Get_Keyno(void)
{
     unsigned char Key_h,Key_l,Key_no;
   _nop_();_nop_();_nop_();
   Key_h=Keybus;           //我的理解:此時Key_h=P0,應該是P0口的實際狀態。
   _nop_();_nop_();_nop_();_nop_();_nop_();
  Keybus=0x0f;               
  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  Key_l=Keybus;                  //我的理解:此時Key_l=0x0f
   _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
  Keybus=0xf1;
   Key_no=Key_h | Key_l;        //我的理解:如果按位或的話那么 Key_no的值低四位永遠是F
   _nop_();
   return Key_no;
}
這是矩陣鍵盤按鍵讀取的子程序,




void keyin_work(void)
{
    switch (R_Keyno)                 //這是其他引用按鍵的程序,它的后四位并不是F,請問大神們這個怎么得出來的
         case     0xbc:
         case     0xec:
         case     0xea:
         case     0xba:
         case     0xda:
         case     0xd6:
         case     0xb6:
}
這是應用鍵盤值判斷是哪個按鍵被按下的應用程序。

51hei圖片_20211014105813.jpg (4.22 MB, 下載次數: 52)

51hei圖片_20211014105813.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:123289 發表于 2021-10-14 13:09 | 只看該作者
結合硬件接線圖,就一目了然了。
回復

使用道具 舉報

板凳
ID:624769 發表于 2021-10-14 14:22 | 只看該作者
基于, #define Keybus  P0   , 所以,Keybus 就是  P0 的意思,是任何時候,而不是僅僅“此時”

所以:   Key_h=Keybus;  就是把  P0 的 值 賦值給 Key_h

所以: Key_no=Key_h | Key_l;    只要有按鍵按下, 就不會等于 0xff

從你: Keybus=0x0f;  Keybus=0xf1;  這兩句看, 如果不是寫錯了。
那么,你的矩陣鍵盤就是   3x4  = 12 的矩陣。

所以,switch (R_Keyno)     里面的 Case, 隨便找一個,轉換成 二進制:
比如: 0xbc  =>   1011 1100      居然 三個0??  

看不懂了………… 你自己捉摸吧……
回復

使用道具 舉報

地板
ID:450037 發表于 2021-10-14 14:52 | 只看該作者
188610329 發表于 2021-10-14 14:22
基于, #define Keybus  P0   , 所以,Keybus 就是  P0 的意思,是任何時候,而不是僅僅“此時”

所以 ...

keybus 在任何時候都是P0,那么keybus=0x0f;然后給key_l 這個結果是0x0f,還是P0啊?
然后它按位或的時候?低四位結果不是全是1嗎?
回復

使用道具 舉報

5#
ID:959346 發表于 2021-10-14 15:04 | 只看該作者
Key_l=Keybus;                  //我的理解:此時Key_l=0x0f   
回復

使用道具 舉報

6#
ID:959346 發表于 2021-10-14 15:07 | 只看該作者
上一句沒回復完,按錯發送了。
Key_l=Keybus;                  //我的理解:此時Key_l=0x0f
這一句,輸出“1”的位就是輸入了,如果有按鍵按下,讀回來的就不是“1”了。
回復

使用道具 舉報

7#
ID:624769 發表于 2021-10-14 15:07 | 只看該作者
zhangzhao2423 發表于 2021-10-14 14:52
keybus 在任何時候都是P0,那么keybus=0x0f;然后給key_l 這個結果是0x0f,還是P0啊?
然后它按位或的時 ...

沒有鍵按下,就是0x0f, 有鍵按下就是 0x07,0x0b 之類的
回復

使用道具 舉報

8#
ID:959346 發表于 2021-10-14 15:15 | 只看該作者
估計樓主用直接設置IO輸入輸出方向的MCU比較多,用傳統51比較少,對這種轉換輸入方式不太理解。或者是一下沒反應過來?
回復

使用道具 舉報

9#
ID:624769 發表于 2021-10-14 15:31 | 只看該作者
Jiang_YY 發表于 2021-10-14 15:15
估計樓主用直接設置IO輸入輸出方向的MCU比較多,用傳統51比較少,對這種轉換輸入方式不太理解。或者是一下 ...

看看我之前的回復。

所以,switch (R_Keyno)     里面的 Case, 隨便找一個,轉換成 二進制:
比如: 0xbc  =>   1011 1100      居然 三個0??   

這里,我是暈了, 你幫忙分析分析啥情況,為啥3個0???  
回復

使用道具 舉報

10#
ID:450037 發表于 2021-10-14 15:31 | 只看該作者
188610329 發表于 2021-10-14 15:07
沒有鍵按下,就是0x0f, 有鍵按下就是 0x07,0x0b 之類的

不能理解,在3x4的矩陣里,假設P0^0是0,我隨便按下哪個按鈕,也是其中的另外兩個位為0,應該不會有0X07的情況吧
回復

使用道具 舉報

11#
ID:624769 發表于 2021-10-14 15:42 | 只看該作者
zhangzhao2423 發表于 2021-10-14 15:31
不能理解,在3x4的矩陣里,假設P0^0是0,我隨便按下哪個按鈕,也是其中的另外兩個位為0,應該不會有0X07 ...

所以,這個時候,就需要電路圖了, 你設置的  P0 = 0x0f;  誰會知道你的 P0^0 會被拉低呢? 而且如果你的 P0^0 會被拉低, 那么 即使你沒有按任何按鍵, 你的
Key_l=Keybus;                  //我的理解:此時Key_l=0x0f
這個推測是不會成立的,  這個時候也應該是:   Key_l=0x0e
回復

使用道具 舉報

12#
ID:450037 發表于 2021-10-14 16:06 | 只看該作者
188610329 發表于 2021-10-14 15:42
所以,這個時候,就需要電路圖了, 你設置的  P0 = 0x0f;  誰會知道你的 P0^0 會被拉低呢? 而且如果你的 ...

假設0.0到0.3是行,0.4到0.7是列,那么按理說可以區分16個按鍵的值。因為P0^0一直拉低,所以也可以區分12個按鍵,任何一個按鍵按下去,應該會有三個位是0,因為P0^0始終是零。
回復

使用道具 舉報

13#
ID:624769 發表于 2021-10-14 16:17 來自手機 | 只看該作者
zhangzhao2423 發表于 2021-10-14 16:06
假設0.0到0.3是行,0.4到0.7是列,那么按理說可以區分16個按鍵的值。因為P0^0一直拉低,所以也可以區分12 ...

這樣的話,你兩次對p0的設置,應該分別是 0x0e和0xf0,確保p0.0始終為低,而不是你代碼里的0x0f和0xf1。因為1有不確定性,0有穩定性。
回復

使用道具 舉報

14#
ID:213173 發表于 2021-10-14 17:21 | 只看該作者
從樓主給的現有條件來看,這個矩陣鍵盤用了6個端口組成3*3,只使用了7個按鍵。并且P0.0是被接地,P0.7空。否則不可能得到上述7個鍵碼。
給你把按鍵代碼順序調整了一下,便于你理解鍵碼是怎么產生的。這是驗證程序:
  1. #include <reg51.H>
  2. #define Keybus  P0
  3. unsigned char Get_Keyno(void)
  4. {
  5.         unsigned char Key_h,Key_l,Key_no;
  6.         Keybus=0xf1;
  7.         Key_h=Keybus;           //獲取高4位狀態
  8.         Keybus=0x0f;               
  9.         Key_l=Keybus;           //獲取低4位狀態
  10.         Key_no=Key_h | Key_l;   //高低4位相加
  11.         return Key_no;   
  12. }
  13. void keyin_work(void)
  14. {
  15.         switch (Get_Keyno())
  16.         {
  17.                 case 0xbc:P2=~0x01;break;//1011 1100
  18.                 case 0xec:P2=~0x02;break;//1110 1100
  19.                 case 0xea:P2=~0x03;break;//1110 1010
  20.                 case 0xba:P2=~0x04;break;//1011 1010
  21.                 case 0xda:P2=~0x05;break;//1101 1010
  22.                 case 0xd6:P2=~0x06;break;//1101 0110
  23.                 case 0xb6:P2=~0x07;break;//1011 0110
  24.         }
  25. }
  26. void main()
  27. {
  28.         while(1)
  29.         {
  30.                 keyin_work();
  31.         }
  32. }
復制代碼

回復

使用道具 舉報

15#
ID:450037 發表于 2021-10-15 08:11 | 只看該作者
wulin 發表于 2021-10-14 17:21
從樓主給的現有條件來看,這個矩陣鍵盤用了6個端口組成3*3,只使用了7個按鍵。并且P0.0是被接地,P0.7空。 ...

厲害,原程序就是使用了7個按鍵。并且P0.0接地,但是P0.7是不是空的我就不太清楚了。
回復

使用道具 舉報

16#
ID:213173 發表于 2021-10-15 13:25 | 只看該作者
zhangzhao2423 發表于 2021-10-15 08:11
厲害,原程序就是使用了7個按鍵。并且P0.0接地,但是P0.7是不是空的我就不太清楚了。

P0.7就算不是懸空,其所接電路也必須在掃描按鍵時保持高電平。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年网站在线观看 | 精品国产欧美在线 | 国产精品日本一区二区在线播放 | 中文字幕在线观看一区 | 欧美福利影院 | 96国产精品久久久久aⅴ四区 | 久久久欧洲 | 亚洲欧美日本在线 | 国产综合第一页 | 91热爆在线观看 | 欧美日韩精品区 | 中文字幕的av | www.中文字幕.com | 欧美精品在线一区二区三区 | 久草视 | 国产精品看片 | 丁香五月缴情综合网 | 中文字幕人成乱码在线观看 | 黄色片视频网站 | www.免费看片.com | 在线区 | 欧美高清视频 | 激情欧美日韩一区二区 | 每日更新av| 国产免费一区二区三区 | 亚洲欧美在线观看 | hitomi一区二区三区精品 | 婷婷久久五月天 | 久久久亚洲精品视频 | 午夜精品久久久久久久 | 亚洲最色视频 | 毛片com | av一级| 国产精品自拍视频 | 99自拍视频 | 欧美视频免费在线 | 精品免费视频 | 欧美大片久久久 | www.中文字幕.com | 国产成人亚洲精品自产在线 | 91视频三区 |