娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月14日(星期六)

2020年06月14日 | 51單片機(jī)入門教程(4)——按鍵控制

發(fā)布者:科技創(chuàng)造者 來源: eefocus關(guān)鍵字:51單片機(jī)  按鍵控制  按鍵消抖 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

單片機(jī)與外界的信息交互主要有兩大類,輸入信息和輸出信息。


之前的博客介紹了通過單片機(jī)控制LED燈和數(shù)碼管向外界輸出信息,該教程介紹單片機(jī)常用的輸入設(shè)備——獨(dú)立按鍵和矩陣鍵盤


一、獨(dú)立按鍵

1.1 獨(dú)立按鍵的原理

獨(dú)立按鍵一共有四個(gè)針腳,兩個(gè)短針腳之間默認(rèn)不導(dǎo)通,兩個(gè)長針腳之間默認(rèn)導(dǎo)通。實(shí)物圖如圖:

在這里插入圖片描述

1.2 獨(dú)立按鍵的仿真電路

在Proteus中對(duì)按鍵進(jìn)行了簡化,只有兩個(gè)接線針腳。按鍵的一端接到單片機(jī)的IO口上,另一端與GND連接。當(dāng)按鍵按下時(shí),單片機(jī)的IO口與GND連接,端口電平被拉低。因此通過讀取端口電平即可獲知按鍵狀態(tài)。


仿真電路如圖:

在這里插入圖片描述

1.3 按鍵消抖

關(guān)于按鍵抖動(dòng):

通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。即單片機(jī)在按鍵被按下的一瞬間檢測到的信號(hào)是很多次的忽高忽低的電平信號(hào),如圖:

在這里插入圖片描述

這種信號(hào)是不穩(wěn)定的。因此,我們需要使用按鍵消抖的算法使單片機(jī)獲取到正常穩(wěn)定的信號(hào)。


為了避免在最不穩(wěn)定的時(shí)候采集信號(hào),常用的操作是延時(shí),即當(dāng)檢測到低電平輸入時(shí),延時(shí)若干時(shí)間(常用20ms),再次采集信號(hào),如果仍是低電平,則為按鍵被按下。

示例程序如下:


/**************************

* 說明: 按鍵被按下時(shí)led燈滅

**************************/

#include

#define uint unsigned int 

#define uchar unsigned char

//定義按鍵端口

sbit key = P1^0;

//定義LED燈端口

sbit led = P2^0;

//延時(shí)函數(shù)聲明

void delay(uint xms);

//程序入口

void main(){

  while(1){

    //第一次判斷

    if(key == 0){

  //延時(shí)20ms 消除抖動(dòng)

  delay(20);

  //第二次判斷

  if(key == 0){

    led = 0;   //燈滅

  }

  else {

    led = 1;   //燈亮

  }

  //等待按鍵被松開

  while(!key);  //當(dāng)按鍵未松開時(shí),key為0,執(zhí)行該死循環(huán)。

}

  }

}

void delay(uint xms)

{

  uint i,j;

  for(i = 0; i    for(j = 0; j<110; ++j);

}

在這里插入圖片描述
在這里插入圖片描述

二、矩陣鍵盤

2.1 矩陣鍵盤原理

矩陣鍵盤是單片機(jī)外部設(shè)備中所使用的排布類似于矩陣的鍵盤組。在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式。其實(shí)物圖如圖:

在這里插入圖片描述

2.2 矩陣鍵盤掃描原理

在Proteus上搭建矩陣鍵盤仿真電路如圖:

在這里插入圖片描述

首先搞清楚電路是怎樣接的:

4×4的矩陣鍵盤,對(duì)于每一行,左端連在一起,四行按鍵因此引出四組線,接在P2_0 - P2_3上。如圖:

在這里插入圖片描述

同理,對(duì)于每一列,右端連在一起,四列按鍵因此引出四組線,接在P2_4 - P2_7上。如圖:

在這里插入圖片描述

組合起來就得到了第一張圖片。


因此可以通過讀取按鍵輸入哪一行,哪一列從而確定按鍵的位置。


首先得到被按下的按鍵屬于哪一行:

把P2_0 - P2_3 端口置為高電平,P2_4 - P2_7置為低電平,如果其中一行的某一個(gè)按鍵被按下,那么對(duì)應(yīng)的P2_0 - P2_3 端口就會(huì)有一個(gè)端口被拉低,通過判斷即可確定被按下按鍵屬于哪一行。


如圖,第一行有按鈕被按下(端口紅色為高電平,藍(lán)色為低電平)

在這里插入圖片描述

代碼段如下:


P2 = 0x0f;       //P2_0 - P2_3 端口置為高電平,P2_4 - P2_7置為低電平

if (P2 != 0x0f)  //如果不為0x0f,說明有按鍵被按下

{

delay(20);

//讀出端口從讀出值來判斷是哪一行

switch (P2)

{

  case 0x0e: x = 0; break;   //0000 1110

  case 0x0d: x = 1; break;   //0000 1101

  case 0x0b: x = 2; break;   //0000 1011

  case 0x07: x = 3; break;   //0000 0111

  default: break;

}


讀取被按下的按鍵屬于哪一列:

類似地:把P2_0 - P2_3 端口置為低電平,P2_4 - P2_7置為高電平,如果其中一列的某一個(gè)按鍵被按下,那么對(duì)應(yīng)的P2_4 - P2_7 端口就會(huì)有一個(gè)端口被拉低,通過判斷即可確定被按下按鍵屬于哪一列。


如圖,第三列有按鈕被按下

在這里插入圖片描述

代碼段如下:


P2 = 0xf0;     //P2_0 - P2_3 端口置為低電平,P2_4 - P2_7置為高電平

if (P2 != 0xf0){  //如果不為0xf0,說明有按鍵被按下

  switch (P2)

  {

    case 0xe0: y = 0; break;

    case 0xd0: y = 1; break;

    case 0xb0: y = 2; break;

    case 0x70: y = 3; break;

    default: break;

  } 

}


2.3 矩陣鍵盤掃描程序

將讀取到的矩陣鍵盤值(0 - F)顯示在數(shù)碼管上:

仿真電路如圖:

在這里插入圖片描述

代碼如下:


/**************************

* 讀取矩陣鍵盤值并顯示至數(shù)碼管上

**************************/

#include

#define uint unsigned int 

#define uchar unsigned char


//共陽數(shù)碼管編碼表

uchar code table[] =

{0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};


//函數(shù)聲明

void delay(uint xms);   //延時(shí)函數(shù)

void display(uchar x);  //數(shù)碼管顯示函數(shù),輸入0-15,在數(shù)碼管上顯示0-F

uchar getKey(); //讀取矩陣鍵盤函數(shù),返回0-15


//程序入口

void main(){

  uchar keyValue;

  while(1){

keyValue = getKey();  //讀取鍵盤值

display(keyValue);    //數(shù)碼管顯示

  }

}


void delay(uint xms){

  uint i,j;

  for(i = 0; i    for(j = 0; j<110; ++j);

}


void display(uchar x){

  P0 = table[x];

}


uchar getKey(){

  uchar x = 0, y = 0;

  uchar result = 0;

  // 第1回合第1步

  P2 = 0x0f; // 從IO口輸出,寫IO口

  if (P2 != 0x0f)// 從IO口輸入,讀IO口

  {

  // 讀出的不是0x0f說明有按鍵被按下

  delay(20);

  // 第1回合第2步:讀出端口從讀出值來判斷是哪一行

  switch (P2)

  {

    case 0x0e: x = 0; break;

    case 0x0d: x = 1; break;

    case 0x0b: x = 2; break;

    case 0x07: x = 3; break;

    default: break;

  }

  delay(10);

  // 第2回合第1步

  P2 = 0xf0;

  if (P2 != 0xf0){

    switch (P2)

    {

      case 0xe0:y = 0; break;

      case 0xd0: y = 1; break;

      case 0xb0: y = 2; break;

      case 0x70: y = 3; break;

      default: break;

    }

    // 經(jīng)過2個(gè)回合后行x和列y都知道了,然后根據(jù)x和y去計(jì)算鍵值即可  

    }

  }

  result = x * 4 + y;

  return result;

}

關(guān)鍵字:51單片機(jī)  按鍵控制  按鍵消抖 引用地址:51單片機(jī)入門教程(4)——按鍵控制

上一篇:51單片機(jī)入門教程(5)——定時(shí)器中斷
下一篇:51單片機(jī)入門教程(6)——外部中斷

推薦閱讀

我國安防行業(yè)市場持續(xù)增長,從2012年的3280億元增長到2017年的6200億元,年復(fù)合增長率達(dá)到14%。根據(jù)中安協(xié)發(fā)布《中國安防行業(yè)“十三五”(2016-2020年)發(fā)展規(guī)劃》指出,“十三五”期間,安防行業(yè)將向規(guī)模化、自動(dòng)化、智能化轉(zhuǎn)型升級(jí),到2020年,安防企業(yè)總收入達(dá)到8000億元左右,年增長率達(dá)到10%以上。前瞻產(chǎn)業(yè)研究院發(fā)布的《2018-2023年中國安防行業(yè)市場前...
日前,Uber自動(dòng)駕駛部門Advanced Technologies Group的負(fù)責(zé)人埃里克·邁霍費(fèi)爾(EricMeyhofer)在第三屆Elevate峰會(huì)上表示,他們的自動(dòng)駕駛測試車經(jīng)常在路上遭受“欺負(fù)”,而實(shí)施者則是行人和其他道路參與者。“我們經(jīng)常遇到人們欺負(fù)這些車輛的情況。他們對(duì)待自動(dòng)駕駛汽車的方式更有攻擊性,由于我們不會(huì)采取行動(dòng),因此他們覺得我們?cè)试S這種行為。盡管有視...
UART(Universal Asynchronous Receiver/Transmitter),通用異步收發(fā)器,是常用于開發(fā)調(diào)試的RS-232C串口的核心器件。在百度百科(http://baike.baidu.com/view/245027.htm)上可以找到對(duì)它的詳細(xì)介紹。 雖然這段時(shí)間實(shí)驗(yàn)定時(shí)器、鍵盤、LED操作時(shí)都使用了UART串口輸出功能,但那是用開發(fā)板提供的示例程序中已有的代碼的,想要自己寫代碼正確實(shí)現(xiàn)...
從蒸汽到內(nèi)燃機(jī),再到電動(dòng)機(jī),幾百年的歷史進(jìn)程中,世界驅(qū)動(dòng)力的升級(jí)讓城市運(yùn)轉(zhuǎn)的節(jié)奏更快更強(qiáng),而汽車可以說是城市動(dòng)力的親歷者和見證者。不過,正如曾經(jīng)每一次變革都會(huì)受到來自技術(shù)或能源上的阻力一樣,汽車在即將告別化石能源全力擁抱新能源技術(shù),駛向未來駕駛的過程中也面臨著不小的挑戰(zhàn)。“一代正極材料,一代動(dòng)力電池”,從錳酸鋰到磷酸鐵鋰,再到三...

史海拾趣

問答坊 | AI 解惑

《電磁兼容使用手冊(cè)》

關(guān)于EMC方面的經(jīng)典書籍。作者:陳偉華 必須2部分下載后,再解壓…

查看全部問答∨

《基本電路分析(全美經(jīng)典學(xué)習(xí)指導(dǎo)系列)》

簡介: 內(nèi)容簡介:   本書涵蓋了電路分析的基本內(nèi)容,包括各種直流和交流電路,特別是運(yùn)算放大器電路的分析方法,并介紹了計(jì)算機(jī)電路分析程序PSpice。書中對(duì)精選的700道習(xí)題,詳細(xì)介紹了解題步驟;另外提供了幾百道補(bǔ)充練習(xí)題,并附有答案。 ...…

查看全部問答∨

采用FPGA的可編程電壓源系統(tǒng)原理及設(shè)計(jì)2

程序中,duty為控制占空比的參數(shù);count為控制分頻的參數(shù)。通過改變duty和count兩個(gè)參數(shù),得到占空比及分頻數(shù)可調(diào)的時(shí)鐘信號(hào),極為方便。 2.2 其他模塊的實(shí)現(xiàn)     其他控制模塊包括地址發(fā)生器、DAC控制電路、并/串轉(zhuǎn)換電路。存儲(chǔ)數(shù)據(jù) ...…

查看全部問答∨

請(qǐng)大家?guī)兔ο雮€(gè)方案,謝謝

本人最近要申請(qǐng)國家的一個(gè)大學(xué)生創(chuàng)新項(xiàng)目,但是現(xiàn)在還沒有好一點(diǎn)的想法,難就難在要有創(chuàng)新點(diǎn),做別人之前沒做的或是在別人的基礎(chǔ)上改進(jìn),偏硬件方面的,比如ARM嵌入式,F(xiàn)PGA之類的,便要涉及一些算法,大家有沒有好的想法可以提供一下啊,我是計(jì)信 ...…

查看全部問答∨

cpu怎么訪問硬盤的

各位大俠,小弟有點(diǎn)不明白,32位地址總線的CPU,最大可以讀到2@32,也就是4G的地址,那么160G的硬盤,它怎么讀到的呢?直接訪問好像訪問不到吧?謝謝了…

查看全部問答∨

msgQreceive返回error,表示什么?

是代表隊(duì)列沒數(shù)據(jù),還是什么錯(cuò)誤啊?一般都是什么引起的?多謝啊…

查看全部問答∨

【TI建議】讓更多的壇友參與

毫無疑問,【最愛TI M3 - Stellaris!】板塊是論壇最火、活動(dòng)也最多的板塊,這里面體現(xiàn)了論壇管理層的重視、TI的大力支持和壇友的熱情參與。當(dāng)前板塊成員結(jié)構(gòu)大致是:資深電子工程師和在校學(xué)生,這當(dāng)中在校學(xué)生占比重更大,他們對(duì)嵌入式應(yīng)用的編程 ...…

查看全部問答∨

大家討論一下這個(gè)條件用什么測距方法比較好

是這樣的一個(gè)結(jié)構(gòu)我先給大家簡單的說下,在地表打一個(gè)20多米深的孔,孔口直徑在110毫米以上的,在這個(gè)孔的下面有可能有一些積水,我想問問大家有什么方法殼儀在孔口位置可以透過水面測到孔底。雖然這個(gè)用笨方法很簡單,用繩子側(cè)就行了,但是我想知 ...…

查看全部問答∨

誰能推薦一個(gè)ST7538電力線載波仿真板

     在做電力線載波通信的部分,想自己配一套ST7538的FSK調(diào)制解調(diào)模塊,最好主控芯片是ATmega系列,最好能有較全的外圍接口和較多的功能,如撥碼按鍵、+-12V電源輸出、RS232/485接口等。     等待用過的或有了解的 ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 曲周县| 鄄城县| 双峰县| 高平市| 壶关县| 石城县| 鞍山市| 平昌县| 万安县| 南宫市| 浦县| 南涧| 铁岭县| 镇赉县| 修武县| 甘南县| 乐平市| 万载县| 云浮市| 金秀| 山东| 漯河市| 阳泉市| 察雅县| 米泉市| 嫩江县| 黎平县| 永吉县| 监利县| 通州区| 苏尼特左旗| 黄平县| 绵竹市| 宽甸| 乌鲁木齐县| 新邵县| 孟州市| 大足县| 江川县| 韶关市| 娄烦县|