第8章-鍵盤輸入_第1頁
第8章-鍵盤輸入_第2頁
第8章-鍵盤輸入_第3頁
第8章-鍵盤輸入_第4頁
第8章-鍵盤輸入_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第8章鍵盤輸入鍵盤:單片機系統(tǒng)中完成控制參數(shù)輸入及修改的基本輸入設(shè)備,是人工干預(yù)系統(tǒng)的重要手段。鍵盤的分類:

獨立連接式鍵盤矩陣連接式鍵盤鍵盤結(jié)構(gòu)⑴獨立式按鍵

獨立式按鍵是每個按鍵占用一根I/O端線。鍵盤結(jié)構(gòu)⑵行列式(矩陣式)鍵盤

I/O端線分為行線和列線,按鍵跨接在行線和列線上,按鍵按下時,行線與列線發(fā)生短路。9.1.2鍵盤結(jié)構(gòu)及處理程序

行列式鍵盤

為了減少鍵盤與單片機接口時所占用I/O線的數(shù)目,在鍵數(shù)較多時,常將鍵盤排列成行列矩陣形式。在水平線(行線)與垂直線(列線)的交叉處放置按鍵來連通。N條行線和M條列線,可組成N×M個按鍵的鍵盤89C52P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7+5v01234567BAD98CEF10kΩ×4矩陣式鍵盤接口設(shè)計矩陣式鍵盤適用于按鍵數(shù)量較多的場合,由行線和列線組成,按鍵位于行列的交叉點上??梢怨?jié)省I/O口。行線通過上拉電阻接到+5V上,并將行線所接的單片機I/O口作為輸入端,而列線所接的I/O作為輸出端。使用鍵盤時必須解決的問題

鍵盤去抖動問題:

鍵盤的抖動時間一般為5~10ms,抖動現(xiàn)象會引起CPU對一次鍵操作進行多次處理,從而可能產(chǎn)生錯誤。鍵盤接口鍵掃描輸入程序的設(shè)計方法:

(1)判斷鍵盤上是否有鍵閉合;(2)消除鍵的機械抖動;(3)確定閉合鍵的物理位置;(4)得到閉合鍵的編號;(5)確保CPU對鍵的一次閉合只做一次處理獨立式按鍵應(yīng)用1要求使用變量類型sbit定義每個開關(guān)和二極管。#include<reg51.h>sbitled0=P1^0;sbitled1=P1^1;sbitled2=P1^2;sbitled3=P1^3;sbitkey0=P1^4;sbitkey1=P1^5;sbitkey2=P1^6;sbitkey3=P1^7;voidmain(){while(1){led0=key0;led1=key1;led2=key2;led3=key3;}}實例2鍵控流水燈【要求】K1為“啟動鍵”,首次按壓K1可產(chǎn)生“自下向上”的流水燈運動;K2為“停止鍵”,按壓K2可終止流水燈的運動;

K3和K4為“方向鍵”,分別產(chǎn)生“自上向下”和“自下向上”運動。(鍵值函數(shù))思路分析:根據(jù)鍵值修改標志位,根據(jù)標志位控制燈狀態(tài)鍵值:按壓K1——1110xxxxB按壓K2——1101xxxxB按壓K3——1011xxxxB按壓K4——0111xxxxB無按鍵——1111xxxxB按鍵動作判斷——(P0&0xf0)是否等于0xf0?若是,說明無按鍵動作,反之則有按鍵動作→0xe0→0xd0→0xb0→0x70→0xf0判鍵流程亮燈P1輸出:11111110111111011111101111110111LED循環(huán)流程charled[]={0xfe,0xfd,0xfb,0xf7};for(i=0;i<=3;i++){P2=led[i];}//↓for(i=3;i>=0;i--){P2=led[i];}//↑#include"reg51.h"charled[]={0xfe,0xfd,0xfb,0xf7};voiddelay(unsignedinttime){unsignedintj=0;for(;time>0;time--) for(j=0;j<125;j++);}charkey(){unsignedcharx; x=P1&0xf0;returnx;}voidmain(){bitdir=0,run=0;chari;while(1){switch(key()){ case0xe0:run=1;break; case0xd0:run=0;break; case0xb0:dir=1;break; case0x70:dir=0;break;} if(run) {if(dir) //自上而下流動

for(i=0;i<=3;i++){P1=led[i];delay(200); } else //自下而上流動

for(i=4;i>=1;i--){P1=led[i-1];delay(200);}} elseP1=0xff;//燈全滅

}}獨立式鍵盤接口掃描方式獨立式按鍵獨立式鍵盤接口

各鍵相互獨立,每個按鍵各接一根輸入線,通過檢測輸入線的電平狀態(tài)可很容易判斷那個鍵被按下。此種接口適于鍵數(shù)較少或操作速度較高的場合。下頁圖(a)為中斷方式的獨立式鍵盤工作電路。下頁圖(b)為查詢方式的獨立式鍵盤工作電路。下圖為8255A擴展I/O口的獨立式按鍵接口電路。下圖用三態(tài)緩沖器擴展的I/O口的按鍵接口電路。

例:仿真電路如下圖,軟件消抖,查詢方式檢測鍵的狀態(tài)。每按下一次按鍵,會使計數(shù)標志加1,以二進制形式會使計數(shù)標志加1,以二進制形式送入P1口點亮二極管。獨立式鍵盤仿真電路#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint#definep3P3intxx=0; //設(shè)計數(shù)標志sbitkey=P1^7; //設(shè)鍵盤voiddelay(intk) //延時函數(shù){inti;for(i=0;i<k;i++);}voidmain(){P3=0x3F;while(1){while(key==1) //鍵盤沒有按下,循環(huán)等待

{;}if(key==0) //有鍵盤按下,延時10ms去抖動

delay(10);

*23

if(key==0) { xx=xx+1; //計數(shù)標志加1 switch(xx) { case0:P3=0x3F;break; case1:P3=0x06;break; case2:P3=0x5B;break; case3:P3=0x4F;break; case4:P3=0x66;break; case5:P3=0x6D;break; case6:P3=0x7D;break; case7:P3=0x07;break; case8:P3=0x7F;break; case9:P3=0x6F;break; case10:P3=0x77;break; case11:P3=0x7C;break; case12:P3=0x39;break; case13:P3=0x5E;break; case14:P3=0x79;break; default:P3=0x71;xx=0;break; } }

while(key==0) //鍵盤是否松開

{;} }}

例8-3

設(shè)計一個獨立式按鍵的鍵盤接口,并編寫鍵掃描程序,電路原理圖略,鍵號從上到下分別為0~7。

C語言程序清單:#include<reg52.h>voidkey(){ unsignedchark; P1=0xff; //輸入前P1口輸出全1 k=P1; //讀取按鍵狀態(tài)

if(k==0xff) return; //無鍵按下,返回

delay10xms(2); //有鍵按下,延時去抖鍵盤防抖動 k=P1; if(k==0xff) //確認鍵按下

return; //抖動引起,返回

while(P1!=0xff); //等待鍵釋放

switch(k) //識別、執(zhí)行按下的鍵

{ case0xfe:

… //0號鍵按下時執(zhí)行程序段

break; case0xfd:

… //1號鍵按下時執(zhí)行程序段

break;

case0x7f:

… //7號鍵按下時執(zhí)行程序段

break;} }矩陣式鍵盤接口—行反轉(zhuǎn)法00001011矩陣式鍵盤接口—行反轉(zhuǎn)法10110000讀P1:若P1低4位為f或(P1&0x0f)=0x0f→無鍵壓下若P1低4位≠f或(P1&0x0f)≠0x0f→有鍵壓下

其中0#:11101110B——0xee1#:

11011110B——0xde……F#:

01110111B——0x77ucharcodeKEY_TABLE[]={0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};//鍵盤表矩陣式鍵盤接口—行動態(tài)掃描方法00001111矩陣式鍵盤接口—行動態(tài)掃描方法00001011矩陣式鍵盤接口—行動態(tài)掃描方法01111111矩陣式鍵盤接口—行動態(tài)掃描方法10111011鍵號=行號*每行鍵數(shù)+列號例4矩陣式鍵盤舉例#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharucharcodeKEY_TABLE[]={0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};//鍵盤表ucharcodeTABLE[]={0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7D,0x07, x7F,0x6F,0x77,0x7c, 0x39,0x5e,0x79,0x71};//共陰數(shù)碼管編碼表voiddelayl()//長延時,作點亮數(shù)碼管用{uintn=50000;while(n--);}voiddelays()//短延時,作消振用{uintn=10000;while(n--);}main(){uchartemp,key,num,i;while(1){P3=0xf0;//置行為0,列為1,讀列值。

if(P3!=0xf0)//判斷有,無鍵盤按下

{delays();//消振

if(P3!=0xf0)//確定有鍵盤按下

{temp=P3;//存儲列讀入的值

P3=0x0f;//置列為0,行為1,讀行值。

key=temp|P3;//將行/列值綜合,賦給key。

for(i=0;i<16;i++) {if(key==KEY_TABLE[i]) {num=i;break;}} P2=TABLE[num];//顯示按鍵值。

delayl();}}}}鍵盤的工作方式⑴程序控制掃描方式鍵處理程序固定在主程序的某個程序段。⑵定時控制掃描方式利用定時/計數(shù)器每隔一段時間產(chǎn)生定時中斷,CPU響應(yīng)中斷后對鍵盤進行掃描。⑶中斷方式當鍵盤上有鍵閉合時,向CPU申請中斷,CPU響應(yīng)中斷后對鍵盤進行掃描。

單片機在忙于各項工作任務(wù)時,如何兼顧鍵盤的輸入,取決于鍵盤的工作方式?!纠?.5】按照圖示的電路,使用行反轉(zhuǎn)掃描法,編寫的鍵掃描程序。有鍵按下,掃描函數(shù)返回值為鍵值,若無鍵按下,返回值為0xff。要求每10ms定時檢測一次按鍵,使用定時器中斷實現(xiàn)定時。按鍵信息由printf輸出到串口。#include“REG51.h"#defineKEY_PORTP1/*按鍵接在KEY_PORT口*/ucharkey_Value=0xff; /*存放鍵值*/ucharkeyscan(void);//掃描按鍵函數(shù)-行反轉(zhuǎn)法**/voidKey_process(void);/*鍵值處理程序*/voidtimer1int(void)interrupt3{ EA=0;/*關(guān)總中斷*/ TR1=0;/*停止計數(shù)*/ TH1=-10000>>8;TL1=-10000%256;/*12MHz晶振,定時時間10000us*/ TR1=1;/*啟動計數(shù)*/ key_Value=keyscan(); EA=1;/*開總中斷*/}ucharkeyscan(void)/**掃描按鍵函數(shù)**/{ucharreadkey,rereadkey,x_temp,y_temp; KEY_PORT=0x0f; x_temp=KEY_PORT&0x0f; if(x_temp==0x0f)return(0xff);/*無按鍵,退出*/ KEY_PORT=0xf0; y_temp=KEY_PORT&0xf0; readkey=x_temp|y_temp; time(10); /*延時10ms后再測按鍵*/ KEY_PORT=0x0f; x_temp=KEY_PORT&0x0f; if(x_temp==0x0f)return(0xff);/*無按鍵,退出*/ KEY_PORT=0xf0; y_temp=KEY_PORT&0xf0; rereadkey=x_temp+y_temp; if(readkey==rereadkey){return(~rereadkey); } return(0xff);}voidmain(void){ initUart();/*初始化串口*/ TMOD=0x10;/*設(shè)置定時器1為工作方式1*/ TH1=-10000>>8;TL1=-10000%256//定時時間10ms TCON=0x40;/*內(nèi)部脈沖計數(shù)*/ IE=0x88;/*打開定時器中斷*/ key_Value=0xff; do{ if(key_Value!=0xff){/*如果有按鍵*/ Key_process();/*鍵值處理程序*/ key_Value=0xff;/*重置鍵值*/ } /*可在此處插入其它任務(wù)處理函數(shù)*/}while(TRUE);}

鍵盤所做的工作分為三個層次,如圖所示。第1層:單片機監(jiān)視鍵盤輸入的工作方式:①編程掃描②定時掃描③中斷掃描。第2層:確定具體按鍵的鍵號。體現(xiàn)在按鍵的識別方法上就是:①掃描法;②線反轉(zhuǎn)法。第3層:執(zhí)行鍵處理程序。例:仿真電路如下圖所示,P2口低四位接行列式鍵盤的行,高四位接行列式鍵盤的列,P3口接一只共陰極數(shù)碼管,數(shù)碼管的公共端接地,試編程將按下的建號在數(shù)碼管上顯示出來。

解:

#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3^7;ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};ucharPre_KeyNO=16,KeyNO=16;

voidDelayMS(uintms){ uchart; while(ms--) { for(t=0;t<120;t++); }}

voidKeys_Scan(){ ucharTmp; P1=0x0f; DelayMS(1); Tmp=P1^0x0f; switch(Tmp) { case1:KeyNO=0;break; case2:KeyNO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論