《單片機(jī)原理及接口技術(shù)》項(xiàng)目5 鍵盤接口技術(shù)_第1頁(yè)
《單片機(jī)原理及接口技術(shù)》項(xiàng)目5 鍵盤接口技術(shù)_第2頁(yè)
《單片機(jī)原理及接口技術(shù)》項(xiàng)目5 鍵盤接口技術(shù)_第3頁(yè)
《單片機(jī)原理及接口技術(shù)》項(xiàng)目5 鍵盤接口技術(shù)_第4頁(yè)
《單片機(jī)原理及接口技術(shù)》項(xiàng)目5 鍵盤接口技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(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)介

單片機(jī)及接口技術(shù)項(xiàng)目教程項(xiàng)目5

鍵盤接口技術(shù)獨(dú)立式鍵盤矩陣式鍵盤訓(xùn)練項(xiàng)目鍵盤由一組規(guī)則排列的按鍵組成,一個(gè)按鍵實(shí)際上是一個(gè)開關(guān)元件。在單片機(jī)外圍電路中,通常用到的按鍵是機(jī)械觸點(diǎn)式彈性開關(guān),其主要功能是把機(jī)械上的通斷轉(zhuǎn)換為電氣上的邏輯關(guān)系

(1和0),當(dāng)開關(guān)閉合(0)時(shí),線路導(dǎo)通,開關(guān)斷開(1)時(shí),線路斷開。常見的鍵盤種類有獨(dú)立式鍵盤和矩陣式鍵盤。一、獨(dú)立式鍵盤1、獨(dú)立式鍵盤結(jié)構(gòu)鍵盤實(shí)際上是一組按鍵開關(guān)的集合,平時(shí)按

鍵開關(guān)總是處于斷開狀態(tài),當(dāng)按下鍵時(shí)它才閉合。每個(gè)按鍵單獨(dú)

占用一根I/O口線,每個(gè)按鍵工作不會(huì)影響其他I/O口線

的狀態(tài)。多用于所需鍵盤不多的場(chǎng)合。2、按鍵觸點(diǎn)的機(jī)械抖動(dòng)機(jī)械式按鍵在按下或釋放時(shí),由于機(jī)械彈性作用的影響,通常伴隨有一定時(shí)間的觸點(diǎn)機(jī)械抖動(dòng),然后其觸點(diǎn)才穩(wěn)定下來(lái)。抖動(dòng)時(shí)間的長(zhǎng)短與開關(guān)的機(jī)械特性有關(guān),一般為5—10ms。3、消抖方法為了克服按鍵觸點(diǎn)機(jī)械抖動(dòng)所致的檢測(cè)誤判,必

須采取去抖動(dòng)措施,可從硬件、軟件兩方面予以考慮。在鍵數(shù)較少時(shí),可采用硬件消抖;而當(dāng)鍵數(shù)較多時(shí),

采用軟件消抖。①

硬件消抖②

軟件消抖軟件上采取的措施是在檢測(cè)到有按鍵按下時(shí),

執(zhí)行一個(gè)10—20ms左右(具體時(shí)間應(yīng)視所使用的按

鍵進(jìn)行調(diào)整)的延時(shí)程序,再確認(rèn)該鍵電平是否仍

保持閉合狀態(tài)電平,若仍保持閉合狀態(tài)電平,則確

認(rèn)該鍵處于閉合狀態(tài);同理,在檢測(cè)到該鍵釋放后,也應(yīng)采用相同的步驟進(jìn)行確認(rèn),從而消除抖動(dòng)的影

響。二、矩陣式鍵盤1、矩陣式鍵盤結(jié)構(gòu)2、鍵碼識(shí)別矩陣式鍵盤結(jié)構(gòu)比獨(dú)立式鍵盤要復(fù)雜,識(shí)別也要復(fù)雜一些。最常用的識(shí)別方法是鍵盤掃描法。它的控制方式是先判斷是否有鍵按下。如有,再判斷哪一鍵按下,并得到鍵碼值,然后根據(jù)鍵碼值轉(zhuǎn)向不同的功能程序。①判別鍵盤上有無(wú)鍵閉合②去除鍵的機(jī)械抖動(dòng)③判別閉合鍵的鍵號(hào)④等待按鍵釋放三、訓(xùn)練項(xiàng)目1、簡(jiǎn)易數(shù)字調(diào)節(jié)器(1)訓(xùn)練目的①了解獨(dú)立式鍵盤的結(jié)構(gòu)與工作原理。②掌握按鍵的檢測(cè)與軟件消抖方法。③學(xué)會(huì)通過(guò)獨(dú)立式按鍵操作設(shè)置參數(shù)的編程方法。訓(xùn)練任務(wù)本項(xiàng)目要完成的任務(wù)是設(shè)計(jì)一個(gè)簡(jiǎn)易數(shù)字調(diào)節(jié)器。用兩位數(shù)碼管顯示數(shù)值,變化范圍00—59。開始時(shí)

顯示00,每按下key1鍵一次,數(shù)值加1;每按下

key2鍵一次,數(shù)值減1;每按下key3鍵一次,數(shù)值

歸零;按下key4鍵一次,利用定時(shí)器功能使數(shù)值開

始自動(dòng)每秒加1,再次按下key4鍵,數(shù)值停止自動(dòng)

加1,保持原來(lái)的數(shù)。Key1—key4鍵均采用獨(dú)立式按鍵。任務(wù)引導(dǎo)由獨(dú)立式鍵盤工作原理知,要通過(guò)四個(gè)按鍵實(shí)現(xiàn)不同的數(shù)字顯示,只需要依次檢測(cè)key1—key4鍵是否有鍵按下,若有,延時(shí)10—20ms消抖后再判斷是否有鍵按下,若確認(rèn)有,再轉(zhuǎn)去執(zhí)行相應(yīng)的按鍵動(dòng)作即可。(4)任務(wù)實(shí)施①硬件電路設(shè)計(jì)②軟件設(shè)計(jì)#include<reg52.h>#include

<stdio.h>//52系列單片機(jī)頭文件//標(biāo)準(zhǔn)I/O庫(kù)函數(shù)頭文件#define

uchar

unsigned

char //宏定義#define

uint

unsigned

intuchar

code

BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};//8字位選碼uchar

code

table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};//共陽(yáng)極0~F字段碼//定義按鍵sbit

key1=P3^2;sbit

key2=P3^3;sbit

key3=P3^4;sbit

key4=P3^5;uchar

numt0,num;//xms延時(shí)函數(shù)void

delayms(uint

xms){uint

i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}//顯示子函數(shù)void

display(uchar

numdis){uchar

shi,ge;//將要顯示的2位數(shù)分離成十位、個(gè)位shi=numdis/10;//十位數(shù)ge=numdis%10;//個(gè)位數(shù)P0

=table[shi];//送十位數(shù)段選碼P2=0x02;//送位選delayms(5);//延時(shí)P2=0x00;//消隱P0=table[ge];//送個(gè)位數(shù)段選碼P2=0x01;//送位選delayms(5);//延時(shí)P2=0x00;//消隱}//定時(shí)器T0初始化函數(shù)void

T0_init(){TMOD=0x01;//設(shè)置定時(shí)器T0為工作方式1(0000

0001)//裝初值50ms中斷一次TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;//開總中斷//開定時(shí)器0中斷}//鍵盤掃描子函數(shù)void

keyscan(){if(key1==0){//消抖delayms(10);if(key1==0){num++;//數(shù)值加1if(num==60)//當(dāng)?shù)?0時(shí)重新歸0num=0;while(!key1); //等待按鍵釋放}//消抖//當(dāng)?shù)?時(shí)重新歸60}if(key2==0){delayms(10);if(key2==0){if(num==0)num=60;num--;//數(shù)值減1while(!key2);}//消抖}if(key3==0){delayms(10);if(key3==0){num=0;//數(shù)值歸0while(!key3);}//消抖}if(key4==0){delayms(10);if(key4==0){while(!key4);TR0=~TR0;//等待按鍵釋放//啟動(dòng)或停止定時(shí)器T0}}}//T0中斷服務(wù)函數(shù)void

main(){T0_init();while(1){keyscan();display(num);}}void

T0_time()

interrupt

1{//重裝初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;numt0++;//如果中斷次數(shù)到20次,說(shuō)明1s時(shí)間到//numt0清0,重新再計(jì)20次if(numt0==20){numt0=0;num++;if(num==60)num=0;}}(5)效果演示2、一鍵多功能控制(1)訓(xùn)練目的①進(jìn)一步掌握按鍵的檢測(cè)與軟件消抖方法。②學(xué)會(huì)一鍵多功能控制程序流程的編程方法。(2)訓(xùn)練任務(wù)本項(xiàng)目要完成的任務(wù)是采用一個(gè)按鍵實(shí)現(xiàn)

LED燈多花樣顯示。按下按鍵一次:左移,按下按鍵二次:右移,按下按鍵三次:閃爍,按下按鍵四次:跑馬燈。任務(wù)引導(dǎo)由獨(dú)立式鍵盤工作原理知,要通過(guò)一個(gè)按鍵實(shí)現(xiàn)LED燈不同的顯示效果,只需不斷檢測(cè)是否有

鍵按下,若有,延時(shí)消抖后再判斷是否有鍵按下,若確認(rèn)有,記下按鍵按下次數(shù),根據(jù)記錄下的按鍵次數(shù)轉(zhuǎn)去執(zhí)行相應(yīng)的功能程序段即可。任務(wù)實(shí)施①硬件電路設(shè)計(jì)②軟件設(shè)計(jì)A、程序流程圖B、控制源程序#include<reg52.h>#include

<stdio.h>//52系列單片機(jī)頭文件//標(biāo)準(zhǔn)I/O庫(kù)函數(shù)頭文件#define

uchar

unsigned

char#define

uint

unsigned

intsbit

Key=P3^2; //定義按鍵/* 定義顯示花樣*///Leftuchar

codeleft[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF};uchar

coderight[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xFf};//Rightuchar

code

shining[]={0xFF,0x00,0x0FF,0x00,0x0FF,0x00,0x0FF,0x00,0x0F//Shininguchar

code

running[]={0xFE,0xFD,0xF9,0xF7,0xEF,0xDF,0x9F,0x7F,0xFf};//Runninguchar

ID;//xms延時(shí)函數(shù)void

delayms(uint

xms){uint

i,j;for(i=xms;i>0;i--)for(j=125;j>0;j--);void

ModeCode(uchar

*Datamode,uchar

DataLen)//取花樣數(shù)據(jù)送單片機(jī)端口顯示函數(shù){uchar

CopyLen;for(CopyLen

=

0;CopyLen

<

DataLen;CopyLen++){P1=*Datamode++;//取花樣數(shù)據(jù)碼送P1口并顯示delayms(1000);}}void

main(){while(1){if(Key==0)delayms(10);if(Key==0){ID++;if(ID==5){ID=0; //ID歸0再次循環(huán)}while(Key==0);//等待按鍵釋放,相當(dāng)于while(!Key);}switch(ID){case

1:ModeCode(&left,sizeof(left));break;case

2:ModeCode(&right,sizeof(right));break;case

3:ModeCode(&shining,sizeof(shining));breacase

4:ModeCode(&running,sizeof(running));breadefault:P1=0xff;}//滅燈}}//數(shù)據(jù)移位//數(shù)據(jù)鎖存LS595DS

=*pointer_Hangdata++;//上8行數(shù)據(jù)有效LS595DatasShift

=

0;LS595DatasShift

=

1;LS595DatasShift

=

0;LS595DatasLock

=

0;LS595DatasLock

=

1;LS595DatasLock

=

0;delayms(1); //每列保持時(shí)間}}}}(5)效果演示3、矩陣式鍵盤操作訓(xùn)練目的①了解鍵盤的結(jié)構(gòu)與工作原理。②掌握識(shí)別鍵盤編碼的方法。③學(xué)會(huì)矩陣式鍵盤鍵盤掃描編程方法。訓(xùn)練任務(wù)本項(xiàng)目要完成的任務(wù)是設(shè)計(jì)并仿真一個(gè)矩陣式鍵盤,分別按下矩陣鍵盤上的任意按鍵0~F,數(shù)碼管上即顯示出相應(yīng)的數(shù)碼。(3)任務(wù)引導(dǎo)由矩陣式鍵盤工作原理知,本項(xiàng)目可采用如前所述的鍵盤掃描法得到鍵碼值。(4)任務(wù)實(shí)施①硬件電路設(shè)計(jì)②軟件設(shè)計(jì)#include<reg52.h>#include

<stdio.h>//52系列單片機(jī)頭文件//標(biāo)準(zhǔn)I/O庫(kù)函數(shù)頭文件#define

uchar

unsigned

char#define

uint

unsigned

int//uchar

code

BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};//8位選碼uchar

code

table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};//0~F字段碼(共陽(yáng)極)//xms延時(shí)子函數(shù)void

delayms(uint

xms){uint

i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}//顯示子函數(shù)void

display(uchar

num){P0=table[num];//送字段碼P2=0x01; //送位選碼//矩陣式鍵盤掃描子函數(shù)}void

matrixkeyscan(){uchar

temp,key=0xFF;static

uchar

data

lastKey;P3=0x7F; //掃描第一列if((P3&0x0F)!=0x0f){delayms(10);//延時(shí)消抖if((P3&0x0F)!=0x0f){temp=P3;switch(temp){case

0x7E:

key=12;break;case

0x7D:

key=13;break;case

0x7B:

key=14;break;case

0x77:

key=15;break;default:key=0;}}}P3=0xBF; //掃描第二列if((P3&0x0F)!=0x0f){delayms(10);//延時(shí)消抖if((P3&0x0F)!=0x0f){temp=P3;switch(temp){case

0xBE:

key=8;break;case

0xBD:

key=9;break;

溫馨提示

  • 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)論