色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)矩陣按鍵的掃描、消抖及動作分離編程

2oON_changxuemc ? 來源:未知 ? 作者:佚名 ? 2017-12-31 09:13 ? 次閱讀

矩陣按鍵相當(dāng)于4 組每組各4 個按鍵,一共是16個按鍵。那我們?nèi)绾螀^(qū)分這些按鍵呢?想一下我們生活所在的地球,要想確定我們所在的位置,就要借助經(jīng)緯線,而矩陣按鍵就是通過行線和列線來確定哪個按鍵被按下的。那么在程序中我們又如何進(jìn)行這項(xiàng)操作呢?

前邊講過,按鍵按下通常都會保持 100ms 以上,如果在按鍵掃描中斷中,我們每次讓矩陣按鍵的一個 KeyOut 輸出低電平,其它三個輸出高電平,判斷當(dāng)前所有 KeyIn 的狀態(tài),下次中斷時再讓下一個 KeyOut 輸出低電平,其它三個輸出高電平,再次判斷所有 KeyIn,通過快速的中斷不停的循環(huán)進(jìn)行判斷,就可以最終確定哪個按鍵按下了,這個原理是不是跟數(shù)碼管動態(tài)掃描有點(diǎn)類似?數(shù)碼管我們在動態(tài)賦值,而按鍵這里我們在動態(tài)讀取狀態(tài)。至于掃描間隔時間和消抖時間,因?yàn)楝F(xiàn)在有 4 個 KeyOut 輸出,要中斷 4 次才能完成一次全部按鍵的掃描,顯然再采用 2ms 中斷判斷 8 次掃描值的方式時間就太長了(2*4*8=64ms),那么我們就改用 1ms 中斷判斷 4 次采樣值,這樣消抖時間還是 16ms(1*4*4)。下面就用程序?qū)崿F(xiàn)出來,程序循環(huán)掃描板子上的 K1~K16 這 16 個矩陣按鍵,分離出按鍵動作并在按鍵按下時把當(dāng)前按鍵的編號顯示在一位數(shù)碼管上(用 0~F 表示,顯示值=按鍵編號-1)。

#include

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

sbit KEY_IN_1 = P2^4;

sbit KEY_IN_2 = P2^5;

sbit KEY_IN_3 = P2^6;

sbit KEY_IN_4 = P2^7;

sbit KEY_OUT_1 = P2^3;

sbit KEY_OUT_2 = P2^2;

sbit KEY_OUT_3 = P2^1;

sbit KEY_OUT_4 = P2^0;

unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

unsigned char KeySta[4][4] = { //全部矩陣按鍵的當(dāng)前狀態(tài)

{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}

};

void main(){

unsigned char i, j;

unsigned char backup[4][4] = { //按鍵值備份,保存前一次的值

{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}

};

EA = 1; //使能總中斷

ENLED = 0; //選擇數(shù)碼管 DS1 進(jìn)行顯示

ADDR3 = 1;

ADDR2 = 0;

ADDR1 = 0;

ADDR0 = 0;

TMOD = 0x01; //設(shè)置 T0 為模式 1

TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1ms

TL0 = 0x67;

ET0 = 1; //使能 T0 中斷

TR0 = 1; //啟動 T0

P0 = LedChar[0]; //默認(rèn)顯示 0

while (1){

for (i=0; i<4; i++){ //循環(huán)檢測 4*4 的矩陣按鍵

for (j=0; j<4; j++){

if (backup[i][j] != KeySta[i][j]){ //檢測按鍵動作

if (backup[i][j] != 0){ //按鍵按下時執(zhí)行動作

P0 = LedChar[i*4+j]; //將編號顯示到數(shù)碼管

}

backup[i][j] = KeySta[i][j]; //更新前一次的備份值

}

}

}

}

}

/* T0 中斷服務(wù)函數(shù),掃描矩陣按鍵狀態(tài)并消抖 */

void InterruptTimer0() interrupt 1{

unsigned char i;

static unsigned char keyout = 0; //矩陣按鍵掃描輸出索引

static unsigned char keybuf[4][4] = { //矩陣按鍵掃描緩沖區(qū)

{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},

{0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}

};

TH0 = 0xFC; //重新加載初值

TL0 = 0x67;

//將一行的 4 個按鍵值移入緩沖區(qū)

keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;

keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;

keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;

keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;

//消抖后更新按鍵狀態(tài)

for (i=0; i<4; i++){ //每行 4 個按鍵,所以循環(huán) 4 次

//連續(xù) 4 次掃描值為 0,即 4*4ms 內(nèi)都是按下狀態(tài)時,可認(rèn)為按鍵已穩(wěn)定的按下

if ((keybuf[keyout][i] & 0x0F) == 0x00){

KeySta[keyout][i] = 0;

//連續(xù) 4 次掃描值為 1,即 4*4ms 內(nèi)都是彈起狀態(tài)時,可認(rèn)為按鍵已穩(wěn)定的彈起

}else if ((keybuf[keyout][i] & 0x0F) == 0x0F){

KeySta[keyout][i] = 1;

}

}

//執(zhí)行下一次的掃描輸出

keyout++; //輸出索引遞增

keyout = keyout & 0x03; //索引值加到 4 即歸零

//根據(jù)索引,釋放當(dāng)前輸出引腳,拉低下次的輸出引腳

switch (keyout){

case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;

case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;

case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;

case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;

default: break;

}

}這個程序完成了矩陣按鍵的掃描、消抖、動作分離的全部內(nèi)容,希望大家認(rèn)真研究一下,徹底掌握矩陣按鍵的原理和應(yīng)用方法。在程序中還有兩點(diǎn)值得說明一下。

首先,可能你已經(jīng)發(fā)現(xiàn)了,中斷函數(shù)中掃描 KeyIn 輸入和切換 KeyOut 輸出的順序與前面提到的順序不同,程序中我首先對所有的 KeyIn 輸入做了掃描、消抖,然后才切換到了下一次的 KeyOut 輸出,也就是說我們中斷每次掃描的實(shí)際是上一次輸出選擇的那行按鍵,這是為什么呢?因?yàn)槿魏?a target="_blank">信號從輸出到穩(wěn)定都需要一個時間,有時它足夠快而有時卻不夠快,這取決于具體的電路設(shè)計,我們這里的輸入輸出順序的顛倒就是為了讓輸出信號有足夠的時間(一次中斷間隔)來穩(wěn)定,并有足夠的時間來完成它對輸入的影響,當(dāng)你的按鍵電路中還有硬件電容消抖時,這樣處理就是絕對必要的了,雖然這樣使得程序理解起來有點(diǎn)繞,但它的適應(yīng)性是最好的,換個說法就是,這段程序足夠“健壯”,足以應(yīng)對各種惡劣情況。

其次,是一點(diǎn)小小的編程技巧。注意看 keyout = keyout & 0x03;這一行,在這里我是要讓keyout 在 0~3 之間變化,加到 4 就自動歸零,按照常規(guī)你可以用前面講過的 if 語句輕松實(shí)現(xiàn),但是你現(xiàn)在看一下這樣程序是不是同樣可以做到這一點(diǎn)呢?因?yàn)?0、1、2、3 這四個數(shù)值正好占用 2 個二進(jìn)制的位,所以我們把一個字節(jié)的高 6 位一直清零的話,這個字節(jié)的值自然就是一種到 4 歸零的效果了。看一下,這樣一句代碼比 if 語句要更為簡潔吧,而效果完全一樣。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44568

    瀏覽量

    636042
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3621

    瀏覽量

    93785
  • 矩陣按鍵
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    8375

原文標(biāo)題:單片機(jī)矩陣按鍵掃描程序

文章出處:【微信號:changxuemcu,微信公眾號:暢學(xué)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    單片機(jī)編程語言有哪些選擇

    單片機(jī)(Microcontroller Unit,MCU)編程是指為單片機(jī)編寫程序的過程,這些程序控制單片機(jī)的行為和功能。單片機(jī)廣泛應(yīng)用于嵌
    的頭像 發(fā)表于 11-01 14:13 ?644次閱讀

    基于FPGA實(shí)現(xiàn)按鍵處理

    引言: 按鍵在電子產(chǎn)品中經(jīng)常用到,由于按鍵的機(jī)械特性,按鍵在閉合或松開的瞬間伴隨著一連串的抖動,這樣的抖動將直接影響設(shè)計系統(tǒng)的穩(wěn)定性。因此,必須對抖動進(jìn)行處理。本文介紹如何在FPGA中實(shí)現(xiàn)按鍵
    的頭像 發(fā)表于 10-24 14:54 ?266次閱讀
    基于FPGA實(shí)現(xiàn)<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>處理

    單片機(jī)按鍵中斷配置教程

    一些小伙伴覺得單片機(jī)入門太難了,又要懂原理圖、又要懂寄存器、還要學(xué)編程語言。
    的頭像 發(fā)表于 10-23 16:30 ?696次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>中斷配置教程

    兩種常見的硬件實(shí)現(xiàn)方式

    由于機(jī)械按鍵在操作過程中會產(chǎn)生抖動現(xiàn)象,這種抖動信號如果不加以處理,就可能導(dǎo)致單片機(jī)等電子設(shè)備誤判按鍵狀態(tài),從而引發(fā)錯誤操作。本文將詳細(xì)介紹兩種常見的硬件
    的頭像 發(fā)表于 09-25 16:54 ?1399次閱讀
    兩種常見的硬件<b class='flag-5'>消</b><b class='flag-5'>抖</b>實(shí)現(xiàn)方式

    為什么按鍵那么重要

    按鍵穩(wěn)定性和可靠性對于整個系統(tǒng)的性能至關(guān)重要。然而,由于機(jī)械觸點(diǎn)的彈性作用,按鍵在閉合和斷開時往往伴隨著抖動現(xiàn)象。這種抖動雖然對人類來說微不足道,但對于高速運(yùn)行的單片機(jī)而言,卻可能導(dǎo)致嚴(yán)重的誤判
    的頭像 發(fā)表于 09-25 16:50 ?584次閱讀
    為什么<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>那么重要

    stm32單片機(jī)用什么軟件編程

    STM32單片機(jī)是一種廣泛應(yīng)用于嵌入式系統(tǒng)領(lǐng)域的微控制器,具有高性能、低功耗、豐富的外設(shè)接口等特點(diǎn)。要對STM32單片機(jī)進(jìn)行編程,需要選擇合適的軟件工具。 概述 STM32單片機(jī)
    的頭像 發(fā)表于 09-02 10:16 ?1491次閱讀

    如何在FPGA中實(shí)現(xiàn)按鍵

    在FPGA(現(xiàn)場可編程門陣列)中實(shí)現(xiàn)按鍵是一個重要的設(shè)計環(huán)節(jié),特別是在處理用戶輸入時,由于物理按鍵的機(jī)械特性和電氣特性,
    的頭像 發(fā)表于 08-19 18:15 ?2032次閱讀

    怎么做按鍵

    大家是怎么做按鍵的 我是用一定時器做20ms定時,定時到在中斷里設(shè)專門標(biāo)志(20ms是否到,初始化為0),在主循環(huán)里當(dāng)按鍵按下時在判斷此標(biāo)志,為0,就開啟定時中斷,而后返回主流程,
    發(fā)表于 04-28 07:39

    AVR單片機(jī)外接16M晶振和STM32F103外接8MHZ運(yùn)行速度哪一個更快?

    同樣的程序進(jìn)行比較: AVR單片機(jī)外接16M晶振:運(yùn)行程序是矩陣按鍵掃描采用定時器中斷100ms掃描一次、還有串口接收中斷程序1S接收一次運(yùn)
    發(fā)表于 04-23 07:43

    stm8觸摸感應(yīng)按鍵是怎樣掃描的?

    stm8觸摸感應(yīng) 按鍵是怎樣掃描,和怎樣
    發(fā)表于 04-01 06:17

    fpga編程單片機(jī)編程的區(qū)別

    FPGA編程單片機(jī)編程的主要區(qū)別體現(xiàn)在以下幾個方面。
    的頭像 發(fā)表于 03-14 17:16 ?1020次閱讀

    單片機(jī)編程和plc編程有什么區(qū)別

    單片機(jī)編程和PLC編程是兩種不同的嵌入式系統(tǒng)開發(fā)領(lǐng)域。在這篇文章中,我們將詳細(xì)探討這兩種編程方式的區(qū)別。首先,我們將簡要介紹單片機(jī)和PLC的
    的頭像 發(fā)表于 02-22 10:23 ?2790次閱讀

    為什么要進(jìn)行按鍵按鍵抖動的原理 按鍵的方法

    按鍵通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時,由于機(jī)械觸點(diǎn)的彈性作用,一個按鍵開關(guān)在閉合時不會馬上穩(wěn)定地接通,在斷開時也
    的頭像 發(fā)表于 02-17 17:07 ?1.8w次閱讀
    為什么要進(jìn)行<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>?<b class='flag-5'>按鍵</b>抖動的原理 <b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>的方法

    單片機(jī)編程實(shí)例介紹

    單片機(jī)(Microcontroller)是指內(nèi)部集成了處理器核心、存儲器、輸入輸出接口和外圍設(shè)備接口等功能模塊的集成電路芯片。它具有體積小、功耗低、性能高等優(yōu)點(diǎn),被廣泛應(yīng)用于嵌入式系統(tǒng)中。單片機(jī)編程
    的頭像 發(fā)表于 01-16 09:37 ?2643次閱讀

    單片機(jī)編程實(shí)例總結(jié)

    單片機(jī)編程實(shí)例總結(jié)
    的頭像 發(fā)表于 01-16 09:17 ?1070次閱讀
    主站蜘蛛池模板: 玩高中女同桌肉色短丝袜脚文 | 国内精品七七久久影院| 欧美 日韩 亚洲 在线| 黑人强伦姧人妻日韩那庞大的| 成视频高清| xxnx18日本| a在线观看视频| A级韩国乱理伦片在线观看| 91天堂国产在线 在线播放| 综合亚洲桃色第一影院| 在线亚洲国产日韩欧洲专区| 亚洲在线v观看免费国| 亚洲乱码国产乱码精品精98| 麻豆国产自制在线观看| 久久久无码AV精品亚洲A片软件| 极品内射少妇精品无码视频| 国产中文字幕在线| 好好的曰com久久| 狠狠鲁快播| 久久久久久久免费| 久久一级片| 免费黄色网址在线观看| 蜜桃狠狠色伊人亚洲综合网站| 免费看大黄高清网站视频在线| 男人女人边摸边吃奶边做| 欧美成人一区二免费视频| 欧美四虎精品二区免费| 人人射人人插| 天天拍拍国产在线视频| 亚洲AV 日韩 国产 有码| 亚洲欧洲免费三级网站| 在线观看免费小视频| 99er4久久视频精品首页| YELLOW在线观看高清视频免费 | 国产午夜一级淫片| 精品久久久久久久99热| 久久久无码精品无码国产人妻丝瓜| 伦理片在线线249| 人妻体体内射精一区二区| 特级毛片AAAAAA| 亚洲人精品午夜射精日韩|