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

下載本文檔

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

文檔簡(jiǎn)介

第8章鍵盤輸入鍵盤:?jiǎn)纹瑱C(jī)系統(tǒng)中完成控制參數(shù)輸入及修改的基本輸入設(shè)備,是人工干預(yù)系統(tǒng)的重要手段。鍵盤的分類:

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

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

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

行列式鍵盤

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

鍵盤去抖動(dòng)問(wèn)題:

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

(1)判斷鍵盤上是否有鍵閉合;(2)消除鍵的機(jī)械抖動(dòng);(3)確定閉合鍵的物理位置;(4)得到閉合鍵的編號(hào);(5)確保CPU對(duì)鍵的一次閉合只做一次處理獨(dú)立式按鍵應(yīng)用1要求使用變量類型sbit定義每個(gè)開關(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;}}實(shí)例2鍵控流水燈【要求】K1為“啟動(dòng)鍵”,首次按壓K1可產(chǎn)生“自下向上”的流水燈運(yùn)動(dòng);K2為“停止鍵”,按壓K2可終止流水燈的運(yùn)動(dòng);

K3和K4為“方向鍵”,分別產(chǎn)生“自上向下”和“自下向上”運(yùn)動(dòng)。(鍵值函數(shù))思路分析:根據(jù)鍵值修改標(biāo)志位,根據(jù)標(biāo)志位控制燈狀態(tài)鍵值:按壓K1——1110xxxxB按壓K2——1101xxxxB按壓K3——1011xxxxB按壓K4——0111xxxxB無(wú)按鍵——1111xxxxB按鍵動(dòng)作判斷——(P0&0xf0)是否等于0xf0?若是,說(shuō)明無(wú)按鍵動(dòng)作,反之則有按鍵動(dòng)作→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) //自上而下流動(dòng)

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

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

}}獨(dú)立式鍵盤接口掃描方式獨(dú)立式按鍵獨(dú)立式鍵盤接口

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

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

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

delay(10);

*23

if(key==0) { xx=xx+1; //計(jì)數(shù)標(biāo)志加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è)計(jì)一個(gè)獨(dú)立式按鍵的鍵盤接口,并編寫鍵掃描程序,電路原理圖略,鍵號(hào)從上到下分別為0~7。

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

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

delay10xms(2); //有鍵按下,延時(shí)去抖鍵盤防抖動(dòng) k=P1; if(k==0xff) //確認(rèn)鍵按下

return; //抖動(dòng)引起,返回

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

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

{ case0xfe:

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

break; case0xfd:

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

break;

case0x7f:

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

break;} }矩陣式鍵盤接口—行反轉(zhuǎn)法00001011矩陣式鍵盤接口—行反轉(zhuǎn)法10110000讀P1:若P1低4位為f或(P1&0x0f)=0x0f→無(wú)鍵壓下若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};//鍵盤表矩陣式鍵盤接口—行動(dòng)態(tài)掃描方法00001111矩陣式鍵盤接口—行動(dòng)態(tài)掃描方法00001011矩陣式鍵盤接口—行動(dòng)態(tài)掃描方法01111111矩陣式鍵盤接口—行動(dòng)態(tài)掃描方法10111011鍵號(hào)=行號(hào)*每行鍵數(shù)+列號(hào)例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()//長(zhǎng)延時(shí),作點(diǎn)亮數(shù)碼管用{uintn=50000;while(n--);}voiddelays()//短延時(shí),作消振用{uintn=10000;while(n--);}main(){uchartemp,key,num,i;while(1){P3=0xf0;//置行為0,列為1,讀列值。

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

{delays();//消振

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

{temp=P3;//存儲(chǔ)列讀入的值

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();}}}}鍵盤的工作方式⑴程序控制掃描方式鍵處理程序固定在主程序的某個(gè)程序段。⑵定時(shí)控制掃描方式利用定時(shí)/計(jì)數(shù)器每隔一段時(shí)間產(chǎn)生定時(shí)中斷,CPU響應(yīng)中斷后對(duì)鍵盤進(jìn)行掃描。⑶中斷方式當(dāng)鍵盤上有鍵閉合時(shí),向CPU申請(qǐng)中斷,CPU響應(yīng)中斷后對(duì)鍵盤進(jìn)行掃描。

單片機(jī)在忙于各項(xiàng)工作任務(wù)時(shí),如何兼顧鍵盤的輸入,取決于鍵盤的工作方式。【例8.5】按照?qǐng)D示的電路,使用行反轉(zhuǎn)掃描法,編寫的鍵掃描程序。有鍵按下,掃描函數(shù)返回值為鍵值,若無(wú)鍵按下,返回值為0xff。要求每10ms定時(shí)檢測(cè)一次按鍵,使用定時(shí)器中斷實(shí)現(xiàn)定時(shí)。按鍵信息由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;/*停止計(jì)數(shù)*/ TH1=-10000>>8;TL1=-10000%256;/*12MHz晶振,定時(shí)時(shí)間10000us*/ TR1=1;/*啟動(dòng)計(jì)數(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);/*無(wú)按鍵,退出*/ KEY_PORT=0xf0; y_temp=KEY_PORT&0xf0; readkey=x_temp|y_temp; time(10); /*延時(shí)10ms后再測(cè)按鍵*/ KEY_PORT=0x0f; x_temp=KEY_PORT&0x0f; if(x_temp==0x0f)return(0xff);/*無(wú)按鍵,退出*/ 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è)置定時(shí)器1為工作方式1*/ TH1=-10000>>8;TL1=-10000%256//定時(shí)時(shí)間10ms TCON=0x40;/*內(nèi)部脈沖計(jì)數(shù)*/ IE=0x88;/*打開定時(shí)器中斷*/ key_Value=0xff; do{ if(key_Value!=0xff){/*如果有按鍵*/ Key_process();/*鍵值處理程序*/ key_Value=0xff;/*重置鍵值*/ } /*可在此處插入其它任務(wù)處理函數(shù)*/}while(TRUE);}

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

解:

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

評(píng)論

0/150

提交評(píng)論