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

51單片機(jī)之按鍵實(shí)驗(yàn)

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

  名稱:51單片機(jī)之按鍵實(shí)驗(yàn)

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

  (1)、按鍵識(shí)別。即判斷有無(wú)按鍵按下。

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

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

  在這里,實(shí)驗(yàn)所用到的鍵盤為獨(dú)立鍵盤和矩陣鍵盤。

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

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

  The last but not least, 對(duì)于按鍵實(shí)驗(yàn)來(lái)說(shuō),消抖一般來(lái)說(shuō)是避免不了的。對(duì)于機(jī)械按鍵,在按下按鍵的過(guò)程中,會(huì)產(chǎn)生前沿抖動(dòng)(按下)和后沿抖動(dòng)(釋放)。在具體使用時(shí),一般有兩種方式可以消抖,一個(gè)是硬件電路進(jìn)行消抖,另一個(gè)則是使用軟件消抖。在本實(shí)驗(yàn)中使用的軟件消抖的方式。

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

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

  */

  #include

  #define keyboard P0

  #define digitaltube P2

  #define keyboard1  P1

  #define uchar unsigned char

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

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

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

  };

  //延時(shí)函數(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];

  }

  //消除抖動(dòng),判斷按鍵是否按下

  int Debounce()

  {

  uchar temp = keyboard1;

  int res = -1;                       //初始化

  delay_ms(10);                       //延時(shí)10ms

  if(temp == keyboard1)

  res = 0;

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

  }

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

  void IndButton()

  {

  char num = 0;

  while(1)

  {

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

  {

  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)

  {

  //選定行,即對(duì)應(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);                       //消除前沿抖動(dòng)

  if(temp1 != keyboard & 0x0F)

  {

  //判斷是哪一列

  switch(keyboard & 0x0F)

  {

  case 0x07:

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

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

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  case 0x0B:

  res = i*4+1;

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

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  case 0x0D:

  res = i*4+2;

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

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  case 0x0E:

  res = i*4+3;

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

  {

  temp1 = keyboard & 0x0F;

  }

  break;

  }

  return res;

  }

  }

  }

  return res;

  }

  //矩陣鍵盤實(shí)驗(yàn):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單片機(jī),按鍵實(shí)驗(yàn)

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

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

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

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

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

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

在線人工客服

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

0571-85317607

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

13606545031

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

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

建議反饋

聯(lián)系人:

聯(lián)系方式:

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