實驗5-獨立鍵盤和矩陣鍵盤_第1頁
實驗5-獨立鍵盤和矩陣鍵盤_第2頁
實驗5-獨立鍵盤和矩陣鍵盤_第3頁
實驗5-獨立鍵盤和矩陣鍵盤_第4頁
實驗5-獨立鍵盤和矩陣鍵盤_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實用文檔實驗5獨立鍵盤和矩陣鍵盤一、實驗目的1、學會用C語言進行獨立按鍵應用程序的設計。2、學會用C語言進行矩陣按鍵應用程序的設計。二、實驗內容1、獨立按鍵:對四個獨立按鍵編寫程序:當按k1時,8個LED同時100ms閃爍;當按k2時,8個LED從左到右流水燈顯示;當按k3時,8個LED從右到左流水燈顯示;當按k4時,8各LED同時從兩側向中間逐步點亮,之后再從中間向兩側逐漸熄滅;2、矩陣按鍵:采用鍵盤掃描方式,順序按下矩陣鍵盤后,在一個數(shù)碼管上順序顯示0~F,采用靜態(tài)顯示即可。3、提高部分(獨立按鍵、定時器、數(shù)碼管動態(tài)掃描):編寫程序,實現(xiàn)下面的功能。用數(shù)碼管的兩位顯示一個十進制數(shù),變化范圍為00~59,開始時顯示00,每按一次k1,數(shù)值加1;每按一次k2,數(shù)值減1;每按一次k3,數(shù)值歸零;按下k4,利用定時器功能使數(shù)值開始自動每秒加1;再按一次k4,數(shù)值停止自動加1,保持顯示原數(shù)。三、實驗步驟1、硬件連接(1)使用MicroUSB數(shù)據(jù)線,將實驗開發(fā)板與微型計算機連接起來;(2)在實驗開發(fā)板上,用數(shù)據(jù)線將相應接口連接起來;2、程序燒入軟件的使用使用普中ISP軟件將HEX文件下載至單片機芯片內。查看結果是否正確。四、實驗結果——源代碼1.#include"reg52.h"typedefunsignedcharu8;typedefunsignedintu16;#defineLEDP2sbitkey1=P3^1;sbitkey2=P3^0;sbitkey3=P3^2;sbitkey4=P3^3;constchartab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};u8codebegMid[]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};voidDelay(u16i){while(i--);}voidKeyDown(){ u8i; if(key2==0) { Delay(1000); if(key2==0) { for(i=0;i<8;i++) { LED=tab[i]; Delay(50000); } while(!key2); } LED=0xff; } elseif(key1==0) { Delay(1000); if(key1==0) { for(i=0;i<3;i++) { LED=0x00; Delay(10000); LED=0xff; Delay(10000); } } }}voidInt0Init(){IT0=1;EX0=1;EA=1;}voidInt1Init(){IT1=1;EX1=1;EA=1;}voidmain(){ Int0Init(); Int1Init(); while(1) { KeyDown(); }}voidInt0()interrupt0{ u8i; if(key3==0) { Delay(1000); if(key3==0) { for(i=7;i>=0;i--) { LED=tab[i]; Delay(50000); } } }} voidInt1()interrupt2{ u8i; if(key4==0) { Delay(1000); if(key4==0) { for(i=0;i<=6;i++) { LED=begMid[i]; Delay(50000); } } }}#include"reg52.h" typedefunsignedintu16; typedefunsignedcharu8;#defineGPIO_DIGP0#defineGPIO_KEYP1sbitLSA=P2^2;sbitLSB=P2^3;sbitLSC=P2^4;u8KeyValue; u8codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//??0~F??voiddelay(u16i){ while(i--); }voidKeyDown(void){ chara=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f) { delay(1000); if(GPIO_KEY!=0x0f) { GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d):KeyValue=2;break; case(0X0e): KeyValue=3;break; } GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0):KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } while((a<50)&&(GPIO_KEY!=0xf0)) { delay(1000); a++; } } }}voidmain(){ LSA=0; LSB=0; LSC=0; while(1) { KeyDown(); GPIO_DIG=smgduan[KeyValue]; } }3.#include<reg52.h>typedefunsignedintu16;typedefunsignedcharu8;#defineKEYPORTP3sbitLSA=P2^2;sbitLSB=P2^3;sbitLSC=P2^4;sbitkey1=P3^1;sbitkey2=P3^0;sbitkey3=P3^2;sbitkey4=P3^3;u16t;u8sec;u8DisplayData[2];u8codesmgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voidTime1Init(){TMOD|=0x10; TH1=0Xd8; TL1=0Xf0; EA=1; ET1=1;}voiddelay(u16i){while(i--); }voidDigDisplay(){ u8i; for(i=0;i<2;i++) { switch(i) { case0:LSA=0;LSB=0;LSC=0;break; case1:LSA=1;LSB=0;LSC=0;break; } P0=DisplayData[i]; delay(100); P0=0x00; }}voiddatapros(){ DisplayData[0]=smgduan[sec%10]; DisplayData[1]=smgduan[sec/10];}voidmain(){ Time1Init(); while(1) { if(key4==0) { delay(1000); if(key4==0) { TR1=!TR1; while(key4==0); } } if(key3==0) { delay(1000); if(key3==0) { sec=0; while(key3==0); } } if(key2==0) { delay(1000); if(key2==0) { sec--; while(key2==0); } } if(key1==0) { delay(1000); if(key1==0) { sec++; while(key1==0); } } }}voidTime1()interrupt2{ TH1=0Xd8; TL1=0Xf0; t++; if(t==100) { t=0; sec++; if(sec>=60) { sec=0; } } datapros(); DigDisplay();}五、實驗體會——結果分析1、獨立按鍵:位定義四個按鍵key1、key2、key3、key4,宏定義LED為P2口,tab數(shù)組保存流水燈D0-D7依次點亮的數(shù)值,begMid數(shù)組保存流水燈同時從兩側向中間逐步點亮,之后再從中間向兩側逐漸熄滅的賦值方式?,F(xiàn)象:按下key1,8個LED同時100ms閃爍;按下key2,8個LED從左到右流水燈顯示;按下key3,觸發(fā)外部中斷0,8個LED從右到左流水燈顯示;按下key4,觸發(fā)外部中斷1,8各LED同時從兩側向中間逐步點亮,之后再從中間向兩側逐漸熄滅。矩陣按鍵:宏定義GPIO_DIG為P0口、GPIO_KEY為P1口,位定義LSA\LSB\LSC分別為P2.2/P2.3/P2.4口,用來進行數(shù)碼管位選,定義全局變量KeyValue,smgduan數(shù)組保存數(shù)碼管段選數(shù)據(jù),打開第一個數(shù)碼管(LSA=LSB=LSC=0),執(zhí)行按鍵處理函數(shù),這里采用行列掃描方法,即先讓P1口高四位為0、低四位為1,判斷有那一列為0;再讓P1口高四位為1、低四位為0,判斷哪一行被為0;這樣由行和列可以確定出具體哪一個按鍵被按下,按鍵函數(shù)里的while循環(huán)是處理當按鍵持續(xù)按下并且超過5000ms時,強制退出按鍵處理函數(shù)。之后給P0口發(fā)送數(shù)碼管段選數(shù)據(jù)。實驗現(xiàn)象為:16個矩陣按鍵S1-S16,假設按下S1,第一個數(shù)碼管顯示0,后面依次類推,到按下S16,顯示F。提高部分(獨立按鍵、定時器、數(shù)碼管動態(tài)掃描):初始化定時器1,選擇工作方式1,也就是16位定時/計數(shù)器,賦初值為10ms,位定義獨立按鍵key1、key2、key3、key4,定義全局變量t自動初始化為0,當t自增到100即計數(shù)100次每次

溫馨提示

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

評論

0/150

提交評論