51單片機之獨立鍵盤,準雙向IO口

獨立鍵盤工作原理

編程思路:
將獨立按鍵連接的IO口設(shè)為高電平鲫惶,持續(xù)檢查該IO口電平蜈首。若按鍵按下,IO口電平會被拉低剑按。檢查到IO口低電平即可判斷按鍵被按下疾就。

以下是沒有按鍵消抖的程序

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;  //數(shù)碼管段選
sbit WE = P2^7;  //數(shù)碼管位選
sbit key_s2 = P3^0;  //獨立按鍵s2
uchar num = 0;  //數(shù)碼管顯示的值

uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;

void main() 
{
    WE = 1;  //打開位選鎖存器
    P0 = 0xfe;  //1111 1110
    WE = 0;  //鎖存位選數(shù)據(jù)

    while(1)
    {
        if(key_s2 == 0)
        {
            num++;  //當(dāng)按鍵按下,數(shù)字+1
            if(num == 10)
                num = 0;  //數(shù)字超過10則歸0
        }
        DU = 1;  //打開段選鎖存器
        P0 = table[num];  //顯示對應(yīng)數(shù)字
        DU = 0;  //鎖存段選數(shù)據(jù)
    }
}

以上程序中艺蝴,當(dāng)按下按鍵時猬腰,可能會改變好幾次數(shù)字,松開按鍵的時候也可能改變幾次數(shù)字猜敢。
這是因為按鍵在按下和松開的過程中存在機械抖動姑荷,按鍵在抖動過程中會反復(fù)多次地“閉合”盒延、“斷開”、“閉合”鼠冕、“斷開”......單片機抓取了這些抖動信號添寺,以為按鍵快速地被“按下”、“松開”懈费、“按下”计露、“松開”......

加入軟件消抖。當(dāng)按鍵按下后憎乙,數(shù)字持續(xù)增加

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;  //數(shù)碼管段選
sbit WE = P2^7;  //數(shù)碼管位選
sbit key_s2 = P3^0;  //獨立按鍵s2
uchar num = 0;  //數(shù)碼管顯示的值

uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;

void delay(unsigned int z)
{
    unsigned int x, y;
    for(x = z; x > 0; x--)
        for(y = 114; y >0; y--);
}

void main() 
{
    WE = 1;  //打開位選鎖存器
    P0 = 0xfe;  //1111 1110
    WE = 0;  //鎖存位選數(shù)據(jù)

    while(1)
    {
        if(key_s2 == 0)
        {
            delay(20);  //延時20ms票罐,在延時期間按鍵在抖動,延時結(jié)束后按鍵狀態(tài)已經(jīng)平穩(wěn)
            if(key_s2 == 0)  //確認按鍵確實是被按下的
            {
                num++;  //當(dāng)按鍵按下泞边,數(shù)字+1
                if(num == 10)
                    num = 0;  //數(shù)字超過10則歸0
            }
        }
        DU = 1;  //打開段選鎖存器
        P0 = table[num];  //顯示對應(yīng)數(shù)字
        DU = 0;  //鎖存段選數(shù)據(jù)
    }
}

加入松手檢測该押。按鍵按下并松手后才顯示加一

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;  //數(shù)碼管段選
sbit WE = P2^7;  //數(shù)碼管位選
sbit key_s2 = P3^0;  //獨立按鍵s2
uchar num = 0;  //數(shù)碼管顯示的值

uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} ;

void delay(unsigned int z)
{
    unsigned int x, y;
    for(x = z; x > 0; x--)
        for(y = 114; y >0; y--);
}

void main() 
{
    WE = 1;  //打開位選鎖存器
    P0 = 0xfe;  //1111 1110
    WE = 0;  //鎖存位選數(shù)據(jù)

    while(1)
    {
        if(key_s2 == 0)
        {
            delay(20);  //延時20ms,在延時期間按鍵在抖動阵谚,延時結(jié)束后按鍵狀態(tài)已經(jīng)平穩(wěn)
            if(key_s2 == 0)  //確認按鍵確實是被按下的
            {
                num++;  //當(dāng)按鍵按下蚕礼,數(shù)字+1
                if(num == 10)
                    num = 0;  //數(shù)字超過10則歸0
                while(!key_s2);  //如果按鍵還沒松開,key_s2==0梢什,!key_s2就是非零奠蹬,程序停留在while循環(huán)內(nèi),不往下進行
            }
        }
        DU = 1;  //打開段選鎖存器
        P0 = table[num];  //顯示對應(yīng)數(shù)字
        DU = 0;  //鎖存段選數(shù)據(jù)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗡午,一起剝皮案震驚了整個濱河市罩润,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翼馆,老刑警劉巖割以,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異应媚,居然都是意外死亡严沥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門中姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來消玄,“玉大人,你說我怎么就攤上這事丢胚◆婀希” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵携龟,是天一觀的道長兔跌。 經(jīng)常有香客問我,道長峡蟋,這世上最難降的妖魔是什么坟桅? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任华望,我火速辦了婚禮,結(jié)果婚禮上仅乓,老公的妹妹穿的比我還像新娘赖舟。我一直安慰自己,他們只是感情好夸楣,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布宾抓。 她就那樣靜靜地躺著,像睡著了一般豫喧。 火紅的嫁衣襯著肌膚如雪洞慎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天嘿棘,我揣著相機與錄音,去河邊找鬼旭绒。 笑死鸟妙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挥吵。 我是一名探鬼主播重父,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忽匈!你這毒婦竟也來了房午?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丹允,失蹤者是張志新(化名)和其女友劉穎郭厌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雕蔽,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡折柠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了批狐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扇售。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嚣艇,靈堂內(nèi)的尸體忽然破棺而出承冰,到底是詐尸還是另有隱情,我是刑警寧澤食零,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布困乒,位于F島的核電站,受9級特大地震影響贰谣,放射性物質(zhì)發(fā)生泄漏顶燕。R本人自食惡果不足惜凑保,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涌攻。 院中可真熱鬧欧引,春花似錦、人聲如沸恳谎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽因痛。三九已至婚苹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸵膏,已是汗流浹背膊升。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谭企,地道東北人廓译。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像债查,于是被迫代替她去往敵國和親非区。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 按鍵介紹 按鍵種類繁多盹廷,功能有簡有繁征绸,極大的充斥著我們的生活。但是無論如何俄占,所有的按鍵其實都有一個原型管怠,來源于同...
    夢凡塵閱讀 5,597評論 0 0
  • 一排惨、基本知識 1. 按鍵分類與輸入原理 按鍵按照結(jié)構(gòu)原理科分為兩類,一類是觸點式開關(guān)按鍵碰凶,如機械式開關(guān)暮芭、導(dǎo)電橡膠式...
    Murrey_Xiao閱讀 14,100評論 1 8
  • 一、原理簡介 鍵盤接口電路是單片機系統(tǒng)設(shè)計非常重要的一環(huán)欲低,作為人機交互界面里最常用的輸入設(shè)備辕宏。我們可以通過鍵盤輸入...
    創(chuàng)客烏托邦閱讀 4,644評論 0 1
  • 前言 拋開工作,以電子愛好者的身份砾莱,單片機玩多了都會想著在單片機的外圍設(shè)備玩出一些花樣來瑞筐。這其中首先想到的就是“升...
    淡定的H羊閱讀 66,488評論 16 57
  • 之前我們簡單介紹了Arduino 內(nèi)置示例結(jié)構(gòu)及其簡單框架,這里我們繼續(xù)介紹其基本原理中的基本示例腊瑟。 基本原理 模...
    飛揚code閱讀 5,622評論 1 2