單片機(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 } 二、矩陣鍵盤 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 } 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; }
上一篇:51單片機(jī)入門教程(5)——定時(shí)器中斷
下一篇:51單片機(jī)入門教程(6)——外部中斷
推薦閱讀
史海拾趣
Bourns公司一直以來都注重技術(shù)研發(fā)與創(chuàng)新。不論是自行研發(fā)的產(chǎn)品,還是通過并購或特許所取得的技術(shù),Bourns都持續(xù)投入于開發(fā)新產(chǎn)品。例如,Bourns推出的最新型旋轉(zhuǎn)式電位器,具備絕緣塑料軸、高額定旋轉(zhuǎn)周期以及寬泛的工作溫度范圍等特性,這些創(chuàng)新產(chǎn)品在市場上取得了良好的反響。
為了進(jìn)一步擴(kuò)大市場份額,CML Microcircuits公司開始積極拓展全球市場。通過與當(dāng)?shù)卮砩毯头咒N商建立合作關(guān)系,CML的產(chǎn)品逐漸進(jìn)入了全球各地的電子市場。同時(shí),公司還設(shè)立了多個(gè)海外研發(fā)中心和銷售中心,以便更好地服務(wù)全球客戶。這些舉措不僅提升了CML的品牌知名度,也為其帶來了更多的商業(yè)機(jī)會(huì)。
隨著全球?qū)Νh(huán)境保護(hù)意識(shí)的增強(qiáng),ddm hopt + schuler公司開始關(guān)注綠色制造和可持續(xù)發(fā)展。公司投入大量資源進(jìn)行綠色生產(chǎn)技術(shù)的研發(fā),成功開發(fā)出一系列節(jié)能、環(huán)保的電子生產(chǎn)設(shè)備。這些設(shè)備在保障生產(chǎn)效率和產(chǎn)品質(zhì)量的同時(shí),顯著降低了能源消耗和廢棄物排放。這一舉措不僅提升了公司的品牌形象,也贏得了客戶和市場的廣泛贊譽(yù)。
在國內(nèi)市場取得一定成績后,F(xiàn)erriShield開始將目光投向國際市場。公司積極參加國際電子展,展示其先進(jìn)的技術(shù)和產(chǎn)品。同時(shí),F(xiàn)erriShield還與國際知名電子品牌建立了合作關(guān)系,為其提供定制化的電磁屏蔽解決方案。通過這些努力,F(xiàn)erriShield的產(chǎn)品逐漸打入國際市場,并贏得了良好的口碑。
隨著技術(shù)的成熟和市場的認(rèn)可,F(xiàn)erriShield開始拓展產(chǎn)品線。公司研發(fā)團(tuán)隊(duì)不斷改進(jìn)和優(yōu)化原始的鐵磁屏蔽材料,并推出了針對(duì)不同應(yīng)用場景的系列產(chǎn)品。例如,針對(duì)智能手機(jī)和平板電腦的輕薄型電磁屏蔽膜,以及針對(duì)大型數(shù)據(jù)中心的高效電磁屏蔽板。這些新產(chǎn)品的推出,使得FerriShield的市場份額逐步擴(kuò)大。
隨著技術(shù)的不斷進(jìn)步,Dresden Elektronik公司不斷加大對(duì)研發(fā)的投入,致力于推動(dòng)技術(shù)的創(chuàng)新和突破。一次偶然的實(shí)驗(yàn)中,公司的研發(fā)團(tuán)隊(duì)發(fā)現(xiàn)了一種新的材料,能夠顯著提高電子元件的性能和穩(wěn)定性。這一發(fā)現(xiàn)被迅速轉(zhuǎn)化為產(chǎn)品,并成功推向市場,使公司的產(chǎn)品在競爭中脫穎而出。
《基本電路分析(全美經(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)國家的一個(gè)大學(xué)生創(chuàng)新項(xiàng)目,但是現(xiàn)在還沒有好一點(diǎn)的想法,難就難在要有創(chuàng)新點(diǎn),做別人之前沒做的或是在別人的基礎(chǔ)上改進(jìn),偏硬件方面的,比如ARM嵌入式,F(xiàn)PGA之類的,便要涉及一些算法,大家有沒有好的想法可以提供一下啊,我是計(jì)信 ...… 查看全部問答∨ |
各位大俠,小弟有點(diǎn)不明白,32位地址總線的CPU,最大可以讀到2@32,也就是4G的地址,那么160G的硬盤,它怎么讀到的呢?直接訪問好像訪問不到吧?謝謝了… 查看全部問答∨ |
|
毫無疑問,【最愛TI M3 - Stellaris!】板塊是論壇最火、活動(dòng)也最多的板塊,這里面體現(xiàn)了論壇管理層的重視、TI的大力支持和壇友的熱情參與。當(dāng)前板塊成員結(jié)構(gòu)大致是:資深電子工程師和在校學(xué)生,這當(dāng)中在校學(xué)生占比重更大,他們對(duì)嵌入式應(yīng)用的編程 ...… 查看全部問答∨ |
|
是這樣的一個(gè)結(jié)構(gòu)我先給大家簡單的說下,在地表打一個(gè)20多米深的孔,孔口直徑在110毫米以上的,在這個(gè)孔的下面有可能有一些積水,我想問問大家有什么方法殼儀在孔口位置可以透過水面測到孔底。雖然這個(gè)用笨方法很簡單,用繩子側(cè)就行了,但是我想知 ...… 查看全部問答∨ |
在做電力線載波通信的部分,想自己配一套ST7538的FSK調(diào)制解調(diào)模塊,最好主控芯片是ATmega系列,最好能有較全的外圍接口和較多的功能,如撥碼按鍵、+-12V電源輸出、RS232/485接口等。 等待用過的或有了解的 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- 座椅、天窗、電動(dòng)尾門應(yīng)用 國產(chǎn)車規(guī)級(jí)高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車企車機(jī)“崩了”
- 寧德時(shí)代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎(jiǎng)”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會(huì)重點(diǎn)
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國產(chǎn)突圍并存
- 國內(nèi)飛行汽車無線通信測試成功,通信安全新突破
- SPAD席卷車載激光雷達(dá)市場
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬級(jí)像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術(shù) 提升車輛安全性和用戶體驗(yàn)
- 羅姆有獎(jiǎng)直播|從0到1,帶你了解電機(jī)及其驅(qū)動(dòng) 開始報(bào)名啦~
- 省錢、省心的購買租賃方案,讓您不再為預(yù)算煩惱!
- Discover mmWave 走進(jìn) TI 毫米波雷達(dá)世界 快速獲得設(shè)計(jì)技能
- 嵌入式Rust修煉營:動(dòng)手寫串口燒錄工具和MCU例程,Rust達(dá)人Hunter直播帶你入門Rust
- EEWorld 芯積分兌換年度回饋來襲~多種賺積分捷徑曝光+禮品兌換劇透
- 有獎(jiǎng)直播:艾邁斯歐司朗智慧農(nóng)業(yè)與植物照明
- ADI有獎(jiǎng)下載活動(dòng)之7 可編程邏輯控制器(PLCs)解決方案
- 開發(fā)板芯幣競拍,每日一款!今日競拍開發(fā)板:大黃蜂開發(fā)板
- ADI有獎(jiǎng)下載活動(dòng)之13升級(jí)版ADI電機(jī)控制解決方案—伺服控制
- 或因合同,亞翔集成把杭州中芯晶圓告上法庭
- 三次蛻變后,捷捷微電坐上晶閘管領(lǐng)域頭把交椅
- 解密Flash如何應(yīng)對(duì)物聯(lián)網(wǎng)應(yīng)用多樣化的挑戰(zhàn)?
- 湖南常德擬建先進(jìn)的晶圓生產(chǎn)線
- 奮達(dá)科技增資協(xié)議爭議一案裁決 或致今年業(yè)績?cè)鲩L近930萬元
- 臺(tái)積電內(nèi)部評(píng)估比特幣未來兩年需求還是很可觀
- 打破“老外”壟斷 中國機(jī)器人產(chǎn)業(yè)的“突圍”
- 北方最大工業(yè)機(jī)器人生產(chǎn)基地即將上線
- 中美矽晶環(huán)球晶圓 1月營收再創(chuàng)歷史新猷
- 一定有外星人、人工智能會(huì)終結(jié)人類……歷數(shù)霍金的預(yù)言