51單片機、獨立按鍵的認識與編程

一、基本知識

1. 按鍵分類與輸入原理

按鍵按照結構原理科分為兩類枢劝,一類是觸點式開關按鍵井联,如機械式開關、導電橡膠式開關燈您旁;另一類是無觸點式開關按鍵烙常,如電氣式按鍵,磁感應按鍵等鹤盒。前者造價低蚕脏,后者壽命長。目前侦锯,微機系統(tǒng)中最常見的是觸點式開關按鍵驼鞭。

在單片機應用系統(tǒng)中,除了復位按鍵有專門的復位電路及專一的復位功能外率触,其他按鍵都是以開關狀態(tài)來設置控制功能或輸入數(shù)據(jù)的终议。當所設置的功能鍵或數(shù)字鍵按下時,計算機應用系統(tǒng)應完成該按鍵所設定的功能葱蝗,鍵信息輸入時與軟件結構密切相關的過程穴张。

對于一組鍵或一個鍵盤,總有一個接口電路與CPU相連两曼。CPU可以采用查詢或中斷方式了解有無將按鍵輸入皂甘,并檢查是哪一個按鍵按下,將該鍵號送入累加器悼凑,然后通過跳轉指令轉入執(zhí)行該鍵的功能程序偿枕,執(zhí)行完成后再返回主程序。

2. 按鍵結構與特點

微機鍵盤通常使用機械觸點式按鍵開關户辫,其主要功能式把機械上的通斷轉換為電氣上的邏輯關系渐夸。也就是說,它能提供標準的TTL邏輯電平渔欢,以便于通用數(shù)字系統(tǒng)的邏輯電平相容墓塌。機械式按鍵再按下或釋放時,由于機械彈性作用的影響奥额,通常伴隨有一定的時間觸點機械抖動苫幢,然后其觸點才穩(wěn)定下來。

圖1-按鍵抖動

其抖動過程如圖1所示垫挨,抖動時間的長短與開關的機械特性有關韩肝,一般為5-10ms。在觸點抖動期間檢測按鍵的通與斷九榔,可能導致判斷出錯哀峻,即按鍵一次按下或釋放錯誤的被認為是多次操作涡相,這種情況是不允許出現(xiàn)的。為了克服按鍵觸點機械抖動所致的檢測誤判谜诫,必須采取消抖措施漾峡。按鍵較少時,可采用硬件消抖喻旷;按鍵較多式生逸,采用軟件消抖。

3. 獨立按鍵與矩陣鍵盤

(1)獨立按鍵

單片機控制系統(tǒng)中且预,如果只需要幾個功能鍵槽袄,此時,可采用獨立式按鍵結構锋谐。

獨立按鍵式直接用I/O口線構成的單個按鍵電路遍尺,其特點式每個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其他I/O口線的狀態(tài)涮拗。獨立按鍵的典型應用如圖所示乾戏。獨立式按鍵電路配置靈活,軟件結構簡單三热,但每個按鍵必須占用一個I/O口線鼓择,因此,在按鍵較多時就漾,I/O口線浪費較大呐能,不宜采用。獨立按鍵如圖2所示抑堡。

圖2-獨立按鍵

獨立按鍵的軟件常采用查詢式結構摆出。先逐位查詢與I/O口線的輸入狀態(tài),如某一根I/O口線輸入為低電平首妖,則可確認該I/O口線所對應的按鍵已按下偎漫,然后,再轉向該鍵的功能處理程序有缆。

(2) 關于上拉電阻

單片機按鍵一般通過配備上拉電阻來實現(xiàn)輸入端高低電平的切換骑丸。

圖3-上拉電阻

4條輸入線接到單片機的IO口上,當按鍵K1按下時妒貌,+5V通過電阻R1然后再通過按鍵K1最終進入GND形成一條通路,那么這條線路的全部電壓都加到了R1這個電阻上铸豁,KeyIn1這個引腳就是個低電平灌曙。當松開按鍵后,線路斷開节芥,就不會有電流通過在刺,那么KeyIn1和+5V就應該是等電位逆害,是一個高電平。我們就可以通過KeyIn1這個IO口的高低電平來判斷是否有按鍵按下蚣驼。

三魄幕、獨立按鍵實例編程

1.說明

以普中科技51單片機開發(fā)板為例

圖4為獨立按鍵電路圖 8個按鍵分別對應JP5的八個引腳,所有按鍵統(tǒng)一接地颖杏,按鍵之間互不影響纯陨,JP5中包含上拉電阻。當按鍵松開時留储,對應引腳輸入1翼抠;當按鍵按下時,對應引腳輸入0获讳。

圖5為流水燈電路圖 8個LED燈接地共陰阴颖,當引腳輸出1時,LED燈亮丐膝;當引腳輸出0時量愧,LED燈滅。

圖4-獨立按鍵
圖5-流水燈

2.代碼實現(xiàn)

(1) 無消抖的8個引腳控制8個LED燈
#include <reg51.h>
#define Key P0    //P0接獨立按鍵電路引腳
#define Led P2    //P2接LED流水燈電路引腳
int main()
{
    unsigned char i;
    P2=0x00;    //初始化流水燈全滅
    
    while(1)
    {
        //動態(tài)掃描八個按鍵
        for(i=0;i<8;i++)
        {
            if( 0 == (Key&(1<<i)) ) Led|=1<<i;    //按鍵按下
            else Led&=~(1<<i);    //按鍵彈起
        }
    }
    return 0;
}

(2) 通過按鍵控制單個數(shù)碼管計數(shù)并作消抖處理

具體要求:
  • 數(shù)碼管初始化為0帅矗,按下按鍵增加對應的數(shù)偎肃,例如按下Key1則增加1,按下Key2則增加2
  • Key8用于清零
  • 超出9時损晤,要做越界處理
  • 消抖
  • 按鍵抬起檢測 按一次只加一次
//printNum.h頭文件
#define Led P2     //P2口控制單個數(shù)碼管
#define state 1    //此處是共陽數(shù)碼管 所以置1
void printNum(int i)
{
    //0123456789AbCDEF
    unsigned char num[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
    if(state==1) Led=num[i];        //Common yang
    else Led=~num[i];       //Common yin
}
void delay_ms(unsigned int i)
{
    unsigned int temp=i*100;
    while(temp--) ;
}
#include <reg51.h>
#include "printNum.h"
#define Key P0

int main()
{
    unsigned char i;
    unsigned char count=0;
    while(1)
    {
        printNum(count);
        for(i=0;i<7;i++)    //動態(tài)檢測8個按鍵
        {
            if( 0==(Key&(1<<i)) )       //判斷按鍵是否按下 
            {
                delay_ms(150);          //消抖
                if( 0==(Key&(1<<i)) )   
                    count+=i+1;         //累加上對應的數(shù)
                
                if(count>9) count%=10;  //防止越界
                
                printNum(count);        //實時更新數(shù)字
                while( !(Key&(1<<i)) ) ;  //按鍵抬起檢測
            }
        }   
        if( 0 == (Key&(1<<7))) count=0;  //最后一個鍵用于清零
    }
}

(3)通過按鍵控制多個數(shù)碼管計數(shù)

具體要求:
  • 功能:數(shù)碼管初始化為0软棺,按下按鍵增加對應的數(shù),例如按下Key1則增加1尤勋,按下Key2則增加2……但是按下Key8需清零
  • 使用38譯碼器對COM口進行控制 節(jié)省I/O口
  • P1的三個引腳控制38譯碼器喘落,其他引腳上的值不允許被改動
  • P2控制數(shù)碼管段碼端的給值
  • P0控制檢測按鍵的輸入
  • 按鍵要消抖 抬起要檢測 邊界要檢測
#define Led P2
#define state 0
void printNum(int i)
{
    //0123456789AbCDEF
    unsigned char num[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
    if(state==1) Led=num[i];        //Common yang
    else Led=~num[i];       //Common yin
}
void delay_ms(unsigned int i)
{
    unsigned int temp=i*100;
    while(temp--) ;
}
#include <reg51.h>
#include "printNum.h"
#define Key P0
#define LED_PLACE P1

unsigned char screenNum[8]={0,0,0,0,0,0,0,0};

int main()
{
    
    unsigned char i;
    unsigned char j;
    unsigned long count=0;
    unsigned long temp=0;
    while(1)
    {
        LED_PLACE &= 0xf8;  //Clear PLACE.0-2
        if(count>99999999) count=0;     //deal with the range
        temp=count;
        for(i=0;i<8;i++)    //transfer long to arr
        {
            screenNum[7-i]=temp%10;
            temp/=10;
        }       
        for(i=0;i<8;i++)    //give nums to screen
        {
            printNum(screenNum[i]);
            j=100; 
            while(j--) ;
            Led = 0x0;      //remove the double image
            LED_PLACE+=1;   //control the place
        }
        
        for(i=0;i<7;i++)      //scan the press keys
        {
            if( 0==(Key&(1<<i)) ) 
            {
                delay_ms(150);
                if( 0==(Key&(1<<i)) )   
                    count+=i+1;
                
                while( !(Key&(1<<i)) ) ;
            }
        }   
        if( 0 == (Key&(1<<7))) count=0;    //key8 to clear all
        
    }
}

不足:按下按鍵時,數(shù)碼管全部熄滅最冰,這是由于掉進按鍵檢測的死循環(huán)中瘦棋,無法掃描動態(tài)數(shù)碼管。改進方法暖哨,等待學習中斷和定時器赌朋。

實驗現(xiàn)象

更新:

(3) 通過中斷來控制按鈕增加數(shù)碼管顯示

連線方式:

  • P2接J12控制動態(tài)數(shù)碼管段碼端
  • P1.0-2接J6-三八譯碼器 控制動態(tài)數(shù)碼管COM端
  • P3.2接JP5-K1 INT0控制按鍵1
#define Led P2
#define state 0
void printNum(int i)
{
    //0123456789AbCDEF
    unsigned char num[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
    if(state==1) Led=num[i];        //Common yang
    else Led=~num[i];       //Common yin
}
void delay_ms(unsigned int i)
{
    unsigned int temp=i*100;
    while(temp--) ;
}
#include <reg51.h>
#include "printNum.h"
#define LED_PLACE P1

unsigned char screenNum[8]={0,0,0,0,0,0,0,0};
unsigned long count=0;

void exint0() interrupt 0   // P3.2
{
    count++;
}

void initDevice()
{
    IT0=1;
    EX0=1;
    EA=1;
}
int main()
{
    
    unsigned char i;
    unsigned char j;
    
    unsigned long temp=0;
    
    initDevice();
    
    while(1)
    {
        LED_PLACE &= 0xf8;  //Clear PLACE.0-2
        if(count>99999999) count=0;     //deal with the range of dital
        temp=count;
        for(i=0;i<8;i++)    //transfer long to arr
        {
            screenNum[7-i]=temp%10;
            temp/=10;
        }       
        for(i=0;i<8;i++)    //give nums to screen
        {
            printNum(screenNum[i]);
            j=100; 
            while(j--) ;
            Led = 0x0;      //remove the double image
            LED_PLACE+=1;   //control the place
        }
    }
}
實驗接線

參考資料:

http://www.51hei.com/bbs/dpj-19896-1.html ——單片機論壇
http://blog.csdn.net/fanyuqa/article/details/48036529 ——CSDN fanyuqa博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篇裁,隨后出現(xiàn)的幾起案子沛慢,更是在濱河造成了極大的恐慌,老刑警劉巖达布,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件团甲,死亡現(xiàn)場離奇詭異,居然都是意外死亡黍聂,警方通過查閱死者的電腦和手機躺苦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門身腻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匹厘,你說我怎么就攤上這事嘀趟。” “怎么了愈诚?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵她按,是天一觀的道長。 經(jīng)常有香客問我扰路,道長尤溜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任汗唱,我火速辦了婚禮宫莱,結果婚禮上,老公的妹妹穿的比我還像新娘哩罪。我一直安慰自己授霸,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布际插。 她就那樣靜靜地躺著碘耳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪框弛。 梳的紋絲不亂的頭發(fā)上辛辨,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音瑟枫,去河邊找鬼斗搞。 笑死,一個胖子當著我的面吹牛慷妙,可吹牛的內容都是我干的僻焚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼膝擂,長吁一口氣:“原來是場噩夢啊……” “哼虑啤!你這毒婦竟也來了?” 一聲冷哼從身側響起架馋,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狞山,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叉寂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铣墨,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年办绝,在試婚紗的時候發(fā)現(xiàn)自己被綠了伊约。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡孕蝉,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情穿剖,我是刑警寧澤哲思,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站佳鳖,受9級特大地震影響霍殴,放射性物質發(fā)生泄漏。R本人自食惡果不足惜系吩,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一来庭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穿挨,春花似錦月弛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贞绵,卻和暖如春厉萝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榨崩。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工谴垫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜡饵。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓弹渔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溯祸。 傳聞我的和親對象是個殘疾皇子肢专,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容

  • 前言 拋開工作,以電子愛好者的身份焦辅,單片機玩多了都會想著在單片機的外圍設備玩出一些花樣來博杖。這其中首先想到的就是“升...
    淡定的H羊閱讀 66,535評論 16 57
  • Arduino Due有14個數(shù)字I/O,6個模擬I/O筷登,一個復位開關剃根,一個ICSP下載口,7-12v電源供電前方。 ...
    麥牛2013閱讀 3,340評論 0 8
  • 1狈醉、嵌入式系統(tǒng)的定義 (1)定義:以應用為中心廉油,以計算機技術為基礎,軟硬件可裁剪苗傅,適應應用系統(tǒng)對功能抒线、可靠性、成本...
    榮卓然閱讀 1,823評論 0 5
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo閱讀 3,711評論 1 20
  • 一直盼著會下雨渣慕、淅淅瀝瀝嘶炭、點點擊落、本來逊桦、應當是很有情懷的眨猎、可想到雨漬花落、紅散香凋强经、就有幾份凄迷睡陪、更有幾份感傷了...
    陳琳琳閱讀 166評論 0 0