日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

51單片機之按鍵實驗

出處:維庫電子市場網(wǎng) 發(fā)布于:2023-07-17 17:40:49

  名稱:51單片機之按鍵實驗

  說明:鍵盤是計算機基礎(chǔ)、重要的輸入設(shè)備之一。對于鍵盤來說,其工作任務(wù)大體可以分為以下三項:

  (1)、按鍵識別。即判斷有無按鍵按下。

  (2)、求鍵值。判斷哪個鍵被按下。

  (3)、執(zhí)行相應(yīng)的操作。

  在這里,實驗所用到的鍵盤為獨立鍵盤和矩陣鍵盤。

  對于獨立鍵盤,它的每個按鍵需要占用一個IO口。一般來說,按鍵一端接地,另一端接IO口。當按鍵按下時,線路被導(dǎo)通,IO口被拉低,即狀態(tài)為‘0’。所以在使用是我們一般把對應(yīng)IO口置成高電平,然后不斷檢測此IO口是否被拉低,從而判斷按鍵是否按下。

  對于矩陣鍵盤來說,它用較少的IO口完成較多個按鍵的功能。但軟件設(shè)計的復(fù)雜度相應(yīng)增加些。一般來說,矩陣鍵盤是由多個行線和列線交叉在一起組成,每個單獨的鍵盤仍是獨立鍵盤。由于每個按鍵的兩段都不接地,所以使用時需要人為的將對應(yīng)的IO口置低。具體來說,是使用掃描的方式,先固定一行或者一列的按鍵公共端為低,然后在按列檢測每一個按鍵的另一端。如此往復(fù),直到完成整個鍵盤的掃描。

  The last but not least, 對于按鍵實驗來說,消抖一般來說是避免不了的。對于機械按鍵,在按下按鍵的過程中,會產(chǎn)生前沿抖動(按下)和后沿抖動(釋放)。在具體使用時,一般有兩種方式可以消抖,一個是硬件電路進行消抖,另一個則是使用軟件消抖。在本實驗中使用的軟件消抖的方式。

  軟件消抖:說白了就是延時一段時間(一般為5-10ms),看是否確實還是原來的電平。一般來說,沒有經(jīng)過硬件消抖的情況下,都進行軟件消抖。(雖然對于某些具體應(yīng)用來說,不進行軟件消抖也能達到相同的效果,如本實驗中矩陣鍵盤實驗,不涉及到對同一個數(shù)字的連續(xù)操作,所以不消抖也是可以的。但是獨立按鍵實驗則必須要進行消抖,否則num會變化的不穩(wěn)定)。

  哦,還有一點,對于51單片機IO口來說,復(fù)位之后IO默認輸出的都是高電平。舉個P0的例子說明問題,P0在復(fù)位之后輸出的是FF。如果在程序中不進行主動賦值(即P0不出現(xiàn)在=的左邊),那么P0口將一直保持高電平。即使在過程中被某些電路拉成低電平,之后P0也會被自動拉回高電平。這就解釋了獨立按鍵實驗中,后沿消抖用的是while(keyboard1 != 0xFF) ; 對于具體的原因,我也不是很清楚,大概和IO口內(nèi)部的邏輯電路有關(guān)。當然,如果在程序中把對應(yīng)端口進行人為的賦值了,那么那將保持賦值后的電平了。

  */

  #include

  #define keyboard P0

  #define digitaltube P2

  #define keyboard1  P1

  #define uchar unsigned char

  //共陽極段碼(a在低位,dp在高位)

  uchar code _data1[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,

  0x83,0xC6,0xA1,0x86,0x8E

  };

  //延時函數(shù)

  void delay_ms(unsigned int n)

  {

  unsigned int i=0,j=0;

  for(i=0;i

  for(j=0;j<123;j++);

  }

  //一位數(shù)碼管顯示數(shù)字

  void DisplayNum(char num)

  {

  digitaltube = _data1[num];

  }

  //消除抖動,判斷按鍵是否按下

  int Debounce()

  {

  uchar temp = keyboard1;

  int res = -1;                       //初始化

  delay_ms(10);                       //延時10ms

  if(temp == keyboard1)

  res = 0;

  return res;                 //返回結(jié)果

  }

  //獨立按鍵實驗:通過兩個獨立按鍵實現(xiàn)數(shù)字加1減1,然后用數(shù)碼管顯示

  void IndButton()

  {

  char num = 0;

  while(1)

  {

  if(Debounce() >= 0)                 //通過軟件消抖判斷是否按下按鍵

  {

  switch(keyboard1)

  {

  case 0xFE:          //+1按鍵

  ++num;

  if(10 == num)

  num = 0;

  break;

  case 0xEF:          //-1按鍵

  --num;

  if(-1 == num)

  num = 9;

  break;

  }

  while(keyboard1 != 0xFF)    ;               //等待按鍵釋放

  }

  DisplayNum(num);        //數(shù)碼管顯示數(shù)字

  }

  }

  //矩陣鍵盤掃描

  int KeyScan()

  {

  uchar i = 0,temp = 0,temp1 = 0;

  uchar res = 0;              //返回終的結(jié)果

  for(i = 0;i < 4;++i)

  {

  //選定行,即對應(yīng)行輸出低電平

  if(0 == i)

  temp = 0x80;

  //temp = 0x40;

  else

  temp = temp>>1;

  temp1 = (~temp)&0x0F;      //保留低四位,用作判斷列

  keyboard = ~temp;        //選中第i行

  if(temp1 !=(keyboard & 0x0F))       //判斷是否按下按鍵,比較判斷列

  {

  delay_ms(10);                       //消除前沿抖動

  if(temp1 != keyboard & 0x0F)

  {

  //判斷是哪一列

  switch(keyboard & 0x0F)

  {

  case 0x07:

  res = i*4+0;                    //計算返回結(jié)果,i行0列

  while(temp1 != 0x0F)            //消除后沿抖動

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  case 0x0B:

  res = i*4+1;

  while(temp1 != 0x0F)            //消除后沿抖動

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  case 0x0D:

  res = i*4+2;

  while(temp1 != 0x0F)            //消除后沿抖動

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  case 0x0E:

  res = i*4+3;

  while(temp1 != 0x0F)            //消除后沿抖動

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  }

  return res;

  }

  }

  }

  return res;

  }

  //矩陣鍵盤實驗:4*4的矩陣,數(shù)碼管顯示所按的按鍵鍵值

  void MatrixButton()

  {

  uchar res = 0;

  while(1)

  {

  res = KeyScan();

  DisplayNum(res);

  }

  }

  int main()

  {

  //      IndButton();

  //      MatrixButton();

  while(1)

  {

  P0 = keyboard1;

  }

  return 0;

  }


關(guān)鍵詞:51單片機,按鍵實驗

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!