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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2351|回復(fù): 15
收起左側(cè)

關(guān)于單片機(jī)矩陣按鍵讀取的程序理解

[復(fù)制鏈接]
ID:450037 發(fā)表于 2021-10-14 11:26 | 顯示全部樓層 |閱讀模式
這個是某設(shè)備上的程序,我有一些不明白的地方把它復(fù)制過來了,就是按鍵值的范圍我不太理解

單片機(jī)源程序如下:
#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,應(yīng)該是P0口的實際狀態(tài)。
   _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的值低四位永遠(yuǎn)是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:
}
這是應(yīng)用鍵盤值判斷是哪個按鍵被按下的應(yīng)用程序。
51hei圖片_20211014105813.jpg
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2021-10-14 13:09 | 顯示全部樓層
結(jié)合硬件接線圖,就一目了然了。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 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, 隨便找一個,轉(zhuǎn)換成 二進(jìn)制:
比如: 0xbc  =>   1011 1100      居然 三個0??  

看不懂了………… 你自己捉摸吧……
回復(fù)

使用道具 舉報

ID:450037 發(fā)表于 2021-10-14 14:52 | 顯示全部樓層
188610329 發(fā)表于 2021-10-14 14:22
基于, #define Keybus  P0   , 所以,Keybus 就是  P0 的意思,是任何時候,而不是僅僅“此時”

所以 ...

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

使用道具 舉報

ID:959346 發(fā)表于 2021-10-14 15:04 | 顯示全部樓層
Key_l=Keybus;                  //我的理解:此時Key_l=0x0f   
回復(fù)

使用道具 舉報

ID:959346 發(fā)表于 2021-10-14 15:07 | 顯示全部樓層
上一句沒回復(fù)完,按錯發(fā)送了。
Key_l=Keybus;                  //我的理解:此時Key_l=0x0f
這一句,輸出“1”的位就是輸入了,如果有按鍵按下,讀回來的就不是“1”了。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-10-14 15:07 | 顯示全部樓層
zhangzhao2423 發(fā)表于 2021-10-14 14:52
keybus 在任何時候都是P0,那么keybus=0x0f;然后給key_l 這個結(jié)果是0x0f,還是P0啊?
然后它按位或的時 ...

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

使用道具 舉報

ID:959346 發(fā)表于 2021-10-14 15:15 | 顯示全部樓層
估計樓主用直接設(shè)置IO輸入輸出方向的MCU比較多,用傳統(tǒng)51比較少,對這種轉(zhuǎn)換輸入方式不太理解。或者是一下沒反應(yīng)過來?
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-10-14 15:31 | 顯示全部樓層
Jiang_YY 發(fā)表于 2021-10-14 15:15
估計樓主用直接設(shè)置IO輸入輸出方向的MCU比較多,用傳統(tǒng)51比較少,對這種轉(zhuǎn)換輸入方式不太理解。或者是一下 ...

看看我之前的回復(fù)。

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

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

使用道具 舉報

ID:450037 發(fā)表于 2021-10-14 15:31 | 顯示全部樓層
188610329 發(fā)表于 2021-10-14 15:07
沒有鍵按下,就是0x0f, 有鍵按下就是 0x07,0x0b 之類的

不能理解,在3x4的矩陣?yán)铮僭O(shè)P0^0是0,我隨便按下哪個按鈕,也是其中的另外兩個位為0,應(yīng)該不會有0X07的情況吧
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2021-10-14 15:42 | 顯示全部樓層
zhangzhao2423 發(fā)表于 2021-10-14 15:31
不能理解,在3x4的矩陣?yán)铮僭O(shè)P0^0是0,我隨便按下哪個按鈕,也是其中的另外兩個位為0,應(yīng)該不會有0X07 ...

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

使用道具 舉報

ID:450037 發(fā)表于 2021-10-14 16:06 | 顯示全部樓層
188610329 發(fā)表于 2021-10-14 15:42
所以,這個時候,就需要電路圖了, 你設(shè)置的  P0 = 0x0f;  誰會知道你的 P0^0 會被拉低呢? 而且如果你的 ...

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

使用道具 舉報

ID:624769 發(fā)表于 2021-10-14 16:17 來自觸屏版 | 顯示全部樓層
zhangzhao2423 發(fā)表于 2021-10-14 16:06
假設(shè)0.0到0.3是行,0.4到0.7是列,那么按理說可以區(qū)分16個按鍵的值。因為P0^0一直拉低,所以也可以區(qū)分12 ...

這樣的話,你兩次對p0的設(shè)置,應(yīng)該分別是 0x0e和0xf0,確保p0.0始終為低,而不是你代碼里的0x0f和0xf1。因為1有不確定性,0有穩(wěn)定性。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-10-14 17:21 | 顯示全部樓層
從樓主給的現(xiàn)有條件來看,這個矩陣鍵盤用了6個端口組成3*3,只使用了7個按鍵。并且P0.0是被接地,P0.7空。否則不可能得到上述7個鍵碼。
給你把按鍵代碼順序調(diào)整了一下,便于你理解鍵碼是怎么產(chǎn)生的。這是驗證程序:
  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位狀態(tài)
  8.         Keybus=0x0f;               
  9.         Key_l=Keybus;           //獲取低4位狀態(tài)
  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. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:450037 發(fā)表于 2021-10-15 08:11 | 顯示全部樓層
wulin 發(fā)表于 2021-10-14 17:21
從樓主給的現(xiàn)有條件來看,這個矩陣鍵盤用了6個端口組成3*3,只使用了7個按鍵。并且P0.0是被接地,P0.7空。 ...

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

使用道具 舉報

ID:213173 發(fā)表于 2021-10-15 13:25 | 顯示全部樓層
zhangzhao2423 發(fā)表于 2021-10-15 08:11
厲害,原程序就是使用了7個按鍵。并且P0.0接地,但是P0.7是不是空的我就不太清楚了。

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日日夜夜精品视频 | 国产亚洲欧美在线视频 | 青青久草| 国产一级视屏 | 精品国产乱码久久久久久88av | 日本视频中文字幕 | 国产成年人小视频 | 免费看一区二区三区 | 日韩欧美在线观看 | 免费在线观看av片 | 男女羞羞视频免费 | 国产日产久久高清欧美一区 | 九七午夜剧场福利写真 | 国产成人精品免费视频大全最热 | 国产99久久久国产精品 | 女人毛片a毛片久久人人 | av网址在线| 91文字幕巨乱亚洲香蕉 | 欧美一级片在线观看 | 日韩精品三区 | 国产成人免费视频网站视频社区 | 国产精品国产精品国产专区不片 | 国产在线精品一区 | 国产99精品 | 久久久高清 | 日韩一区二区三区在线 | 日韩精品一区二区三区四区 | 国产日韩欧美二区 | 国产欧美日韩在线播放 | 精品乱人伦一区二区三区 | 天天噜天天干 | 欧美日韩亚洲一区 | 91在线免费视频 | 91一区二区三区在线观看 | 国产成人精品久久二区二区 | 视频1区2区| 麻豆精品国产免费 | 免费国产视频在线观看 | 乱码av午夜噜噜噜噜动漫 | 新疆少妇videos高潮 | 一区二区三区四区免费视频 |