新型鍵盤程序編程課件_第1頁
新型鍵盤程序編程課件_第2頁
新型鍵盤程序編程課件_第3頁
新型鍵盤程序編程課件_第4頁
新型鍵盤程序編程課件_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

獨立鍵盤電路基本編程方法要求:通過按下一次按鍵INT0,使小燈D1亮滅交替變換。實驗原理:只要判斷P3.2的電平就可以知道按鍵是否被按下;而在按鍵按下的過程中,由于機械抖動,將產(chǎn)生干擾,電平高低變化??梢圆捎密浖V波的方法去除這些干擾信號,在程序設(shè)計時,一旦發(fā)現(xiàn)P3.2為低電平,進(jìn)入按鍵判斷狀態(tài),軟件延時10-20ms,從而避開了干擾信號區(qū)域,再重新檢測P3.2狀態(tài),看按鍵是否真的已經(jīng)按下。獨立鍵盤電路基本編程方法要求:通過按下一次按鍵INT0,使小參考程序(傳統(tǒng)的延時消抖按鍵程序)include<AT89X52.H>sbitINT_0=P3^2;//定義按鍵的輸入端sbitD1=P3^0;

//D1小燈定義voiddelay10ms(void)//延時程序{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);}key(

)

//按鍵判斷程序{ if(INT_0==0)//判斷是否按下鍵盤 { delay10ms(

);//延時,軟件去干擾 if(INT_0==0)//確認(rèn)按鍵按下 {

D1=!D1;//D1亮滅交替變化 }

while(INT_0==0);//按鍵鎖定,每按一次D1只變化一次 }參考程序(傳統(tǒng)的延時消抖按鍵程序)續(xù)前頁:}main(){while(1)

//永遠(yuǎn)循環(huán),掃描判斷按鍵是否按下 { key();

//對于此處CPU只按鍵判斷一直掃描; }}

課后請實踐:1.用兩個按鍵來控制D1的亮滅;2.使用一個按鍵,控制小燈亮的順序D1→D2→D3→D4→┅→D8→D7→→┅D0亮重復(fù)循環(huán);續(xù)前頁:課后請實踐:4X4矩陣鍵盤基本編程方法要求:用AT89S51的并行口P2接4×4矩陣鍵盤,以P3.0-P3.3作輸入線,以P3.4-P3.7作輸出線;在每一個數(shù)碼管上顯示每個按鍵的“0-F”序號。[實驗原理]每個按鍵有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。4X4矩陣鍵盤基本編程方法要求:用AT89S51的并行口P鍵盤識別的兩種方法逐行掃描法:(1)首先判斷有無鍵按下:令矩陣行線輸出全0信號,檢測列線狀態(tài),若有一列電平為低,則有鍵按下。(2)確定閉合鍵位置:依次將各行線置為低電平,逐行檢測各列線的電平狀態(tài),若某列為低,則該行線和列線交叉處按鍵就是閉合鍵。線反轉(zhuǎn)法:(1)令矩陣鍵盤列線輸出全0信號,行線作為輸入接口接收信號,可判斷按鍵處于哪一行。(2)令矩陣鍵盤行線輸出全0信號,列線作為輸入接口接收信號,可判斷按鍵處于哪一列。(3)將輸入信號相或后形成鍵盤的唯一鍵碼。鍵盤識別的兩種方法逐行掃描法:程序:(線反轉(zhuǎn)法)#include<reg52.h>unsignedcharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchark;voiddelay10ms(void)//延時程序{ unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--);}voidGetch(){ unsignedcharX,Y,Z;

P2=0xff;

P2=0x0f;

//先對P2置數(shù)行掃描 if(P2!=0x0f)//判斷是否有鍵按下 {

delay10ms();//延時,軟件去干擾

if(P2!=0x0f)

//確認(rèn)按鍵按下X=P2;

{

程序:(線反轉(zhuǎn)法)續(xù)前頁:

X=P2;//保存行掃描時有鍵按下時狀態(tài) P2=0xf0;//列掃描 Y=P2;//保存列掃描時有鍵按下時狀態(tài) Z=X|Y;//取出鍵值 switch(Z)//判斷鍵值(那一個鍵按下) { case0x77:k=0;break;//對鍵值賦值 case0x7b:k=1;break; case0x7d:k=2;break; case0x7e:k=3;break; case0xb7:k=4;break; case0xbb:k=5;break; case0xbd:k=6;break; case0xbe:k=7;break; case0xd7:k=8;break; case0xdb:k=9;break; case0xdd:k=10;break; case0xde:k=11;break; case0xe7:k=12;break; case0xeb:k=13;break; 續(xù)前頁:續(xù)前頁:

case0xed:k=14;break;

case0xee:

k=15;break; } } }}voidmain(void){while(1){P2=0xff;Getch(

);P0=seg7code[k];//查表LED輸出P1=0xf0;//輸出相同的四位數(shù)據(jù)。}}

續(xù)前頁:該程序的缺陷:1、雖然線反轉(zhuǎn)法識別鍵盤的思路正確,但本程序按鍵掃描中消除按鍵抖動采用了傳統(tǒng)的延時方法,這種辦法會使CPU陷入無謂的等待,在延時的過程中CPU無法并行處理其它事件。采用定時掃描法(比如采用定時中斷每隔100ms掃描1次鍵盤),可以解決這一問題;2、如果要求實現(xiàn)“短促”按鍵和“長按”按鍵的區(qū)分,使程序能應(yīng)用在功能要求更為復(fù)雜的場合,繼續(xù)編制該程序則有繁瑣和可讀性變差的缺點。因此有必要采用更為便捷和高效的鍵值識別算法以實現(xiàn)本程序的功能。

該程序的缺陷:新型鍵盤識別程序基本思想:unsignedcharTrg;unsignedcharCont;voidKeyRead(void){unsignedcharReadData=P3^0xff;//1

Trg=ReadData&(ReadData^Cont);//2

Cont=ReadData;//3

}分析:(1)沒有按鍵的時候ReadData=0x00;Trg=0x00;Cont=0x00;(2)第一次按下按鍵的情況

(假設(shè)按鍵接在P3.0上面)ReadData=0x01;Trg=0x01;Cont=0x01;(3)按鍵按著不松(長按鍵)的情況ReadData=0x01;Trg=0x00;Cont=0x01;

(4)按鍵松開的情況ReadData=0x00;Trg=0x00;Cont=0x00;

Trg表示的就是觸發(fā)的意思,也就是跳變,只要有按鍵按下,Trg在對應(yīng)按鍵的位上面會置1;最關(guān)鍵的地方,Trg的值每次按下只會出現(xiàn)一次,然后立刻被清除,完全不需要人工去干預(yù)。所以按鍵功能處理程序不會重復(fù)執(zhí)行,省下了一大堆的條件判斷,所謂精粹即此?。ont代表的是長按鍵,如果按鍵按著不放,那么Cont的值就為0x01。新型鍵盤識別程序基本思想:Trg表示的就是觸發(fā)的意思,也就應(yīng)用一:一次觸發(fā)的按鍵處理——假設(shè)為蜂鳴器按鍵,按一下,蜂鳴器beep的響一聲

#defineKEY_BEEP0x01voidKeyProc(void){if(Trg&KEY_BEEP)//如果按下的是KEY_BEEP

{Beep();//執(zhí)行蜂鳴器處理函數(shù)

}}應(yīng)用一:一次觸發(fā)的按鍵處理——假設(shè)為蜂鳴器按鍵,按一下,蜂鳴應(yīng)用二:長按鍵的處理

#defineKEY_MODE0x01//此模式按鍵也

#defineKEY_PLUS0x02//此加鍵也

voidKeyProc(void){if(Trg&KEY_MODE)//若KEY_MODE鍵按之,雖常按亦無益

{//無執(zhí)行再,必先松再按可矣

Mode++;//模式寄存器加1

}if(Cont&KEY_PLUS)//若“加”鍵按之不放

{cnt_plus++;//則計時

if(cnt_plus>100)//20ms*100=2S若計時到

{Func();//則執(zhí)行所需執(zhí)行之功能程序也

}}}應(yīng)用二:長按鍵的處理#defineKEY_MODE0x延時消抖問題?真正的單片機入門,是從學(xué)會處理多任務(wù)開始的。

加入延時消抖程序的架構(gòu)如下:volatileunsignedcharIntrcnt;voidInterruptHandle()//中斷服務(wù)程序

{Intrcnt++;}//1ms中斷1次,可變

voidmain(void){SysInit();while(1)//每20ms執(zhí)行一次大循環(huán)

{KeyRead();//將每個子程序都掃描一遍

KeyProc();Func1();Funt2();……while(1){if(Intrcnt>20)//一直在等,直到20ms時間到

{Intrcnt="0";break;}//返回主循環(huán)

}}}延時消抖問題?真正的單片機入門,是從學(xué)會處理多任務(wù)開始的。怎么判斷按鍵釋放?再增加一個按鍵釋放檢測功能,程序如下:

volatileunsignedcharTrg;volatileunsignedcharCont;volatileunsignedcharRelease;//再增加新功能!

voidKeyRead(void){unsignedcharReadData=PINB^0xff;//1讀鍵值

Trg=ReadData&(ReadData^Cont);//2得到按下觸發(fā)值

Release=(ReadData^Trg^Cont);//3得到釋放觸發(fā)值

Cont=ReadData;//4得到所有未釋放的鍵值

}怎么判斷按鍵釋放?再增加一個按鍵釋放檢測功能,程序如下:v獨立鍵盤電路基本編程方法要求:通過按下一次按鍵INT0,使小燈D1亮滅交替變換。實驗原理:只要判斷P3.2的電平就可以知道按鍵是否被按下;而在按鍵按下的過程中,由于機械抖動,將產(chǎn)生干擾,電平高低變化??梢圆捎密浖V波的方法去除這些干擾信號,在程序設(shè)計時,一旦發(fā)現(xiàn)P3.2為低電平,進(jìn)入按鍵判斷狀態(tài),軟件延時10-20ms,從而避開了干擾信號區(qū)域,再重新檢測P3.2狀態(tài),看按鍵是否真的已經(jīng)按下。獨立鍵盤電路基本編程方法要求:通過按下一次按鍵INT0,使小參考程序(傳統(tǒng)的延時消抖按鍵程序)include<AT89X52.H>sbitINT_0=P3^2;//定義按鍵的輸入端sbitD1=P3^0;

//D1小燈定義voiddelay10ms(void)//延時程序{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);}key(

)

//按鍵判斷程序{ if(INT_0==0)//判斷是否按下鍵盤 { delay10ms(

);//延時,軟件去干擾 if(INT_0==0)//確認(rèn)按鍵按下 {

D1=!D1;//D1亮滅交替變化 }

while(INT_0==0);//按鍵鎖定,每按一次D1只變化一次 }參考程序(傳統(tǒng)的延時消抖按鍵程序)續(xù)前頁:}main(){while(1)

//永遠(yuǎn)循環(huán),掃描判斷按鍵是否按下 { key();

//對于此處CPU只按鍵判斷一直掃描; }}

課后請實踐:1.用兩個按鍵來控制D1的亮滅;2.使用一個按鍵,控制小燈亮的順序D1→D2→D3→D4→┅→D8→D7→→┅D0亮重復(fù)循環(huán);續(xù)前頁:課后請實踐:4X4矩陣鍵盤基本編程方法要求:用AT89S51的并行口P2接4×4矩陣鍵盤,以P3.0-P3.3作輸入線,以P3.4-P3.7作輸出線;在每一個數(shù)碼管上顯示每個按鍵的“0-F”序號。[實驗原理]每個按鍵有它的行值和列值,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。4X4矩陣鍵盤基本編程方法要求:用AT89S51的并行口P鍵盤識別的兩種方法逐行掃描法:(1)首先判斷有無鍵按下:令矩陣行線輸出全0信號,檢測列線狀態(tài),若有一列電平為低,則有鍵按下。(2)確定閉合鍵位置:依次將各行線置為低電平,逐行檢測各列線的電平狀態(tài),若某列為低,則該行線和列線交叉處按鍵就是閉合鍵。線反轉(zhuǎn)法:(1)令矩陣鍵盤列線輸出全0信號,行線作為輸入接口接收信號,可判斷按鍵處于哪一行。(2)令矩陣鍵盤行線輸出全0信號,列線作為輸入接口接收信號,可判斷按鍵處于哪一列。(3)將輸入信號相或后形成鍵盤的唯一鍵碼。鍵盤識別的兩種方法逐行掃描法:程序:(線反轉(zhuǎn)法)#include<reg52.h>unsignedcharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchark;voiddelay10ms(void)//延時程序{ unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--);}voidGetch(){ unsignedcharX,Y,Z;

P2=0xff;

P2=0x0f;

//先對P2置數(shù)行掃描 if(P2!=0x0f)//判斷是否有鍵按下 {

delay10ms();//延時,軟件去干擾

if(P2!=0x0f)

//確認(rèn)按鍵按下X=P2;

{

程序:(線反轉(zhuǎn)法)續(xù)前頁:

X=P2;//保存行掃描時有鍵按下時狀態(tài) P2=0xf0;//列掃描 Y=P2;//保存列掃描時有鍵按下時狀態(tài) Z=X|Y;//取出鍵值 switch(Z)//判斷鍵值(那一個鍵按下) { case0x77:k=0;break;//對鍵值賦值 case0x7b:k=1;break; case0x7d:k=2;break; case0x7e:k=3;break; case0xb7:k=4;break; case0xbb:k=5;break; case0xbd:k=6;break; case0xbe:k=7;break; case0xd7:k=8;break; case0xdb:k=9;break; case0xdd:k=10;break; case0xde:k=11;break; case0xe7:k=12;break; case0xeb:k=13;break; 續(xù)前頁:續(xù)前頁:

case0xed:k=14;break;

case0xee:

k=15;break; } } }}voidmain(void){while(1){P2=0xff;Getch(

);P0=seg7code[k];//查表LED輸出P1=0xf0;//輸出相同的四位數(shù)據(jù)。}}

續(xù)前頁:該程序的缺陷:1、雖然線反轉(zhuǎn)法識別鍵盤的思路正確,但本程序按鍵掃描中消除按鍵抖動采用了傳統(tǒng)的延時方法,這種辦法會使CPU陷入無謂的等待,在延時的過程中CPU無法并行處理其它事件。采用定時掃描法(比如采用定時中斷每隔100ms掃描1次鍵盤),可以解決這一問題;2、如果要求實現(xiàn)“短促”按鍵和“長按”按鍵的區(qū)分,使程序能應(yīng)用在功能要求更為復(fù)雜的場合,繼續(xù)編制該程序則有繁瑣和可讀性變差的缺點。因此有必要采用更為便捷和高效的鍵值識別算法以實現(xiàn)本程序的功能。

該程序的缺陷:新型鍵盤識別程序基本思想:unsignedcharTrg;unsignedcharCont;voidKeyRead(void){unsignedcharReadData=P3^0xff;//1

Trg=ReadData&(ReadData^Cont);//2

Cont=ReadData;//3

}分析:(1)沒有按鍵的時候ReadData=0x00;Trg=0x00;Cont=0x00;(2)第一次按下按鍵的情況

(假設(shè)按鍵接在P3.0上面)ReadData=0x01;Trg=0x01;Cont=0x01;(3)按鍵按著不松(長按鍵)的情況ReadData=0x01;Trg=0x00;Cont=0x01;

(4)按鍵松開的情況ReadData=0x00;Trg=0x00;Cont=0x00;

Trg表示的就是觸發(fā)的意思,也就是跳變,只要有按鍵按下,Trg在對應(yīng)按鍵的位上面會置1;最關(guān)鍵的地方,Trg的值每次按下只會出現(xiàn)一次,然后立刻被清除,完全不需要人工去干預(yù)。所以按鍵功能處理程序不會重復(fù)執(zhí)行,省下了一大堆的條件判斷,所謂精粹即此??!Cont代表的是長按鍵,如果按鍵按著不放,那么Cont的值就為0x01。新型鍵盤識別程序基本思想:Trg表示的就是觸發(fā)的意思,也就應(yīng)用一:一次觸發(fā)的按鍵處理——假設(shè)為蜂鳴器按鍵,按一下,蜂鳴器beep的響一聲

#defineKEY_BEEP0x01voidKeyProc(void){if(Trg&KEY_BEEP)//如果按下的是KEY_BEEP

{Beep();//執(zhí)行蜂鳴器處理函數(shù)

}}應(yīng)用一:一次觸發(fā)的按鍵處理——假設(shè)為蜂鳴器按鍵,按一下,蜂鳴應(yīng)用二:長按鍵的處理

#defineKEY_MODE0x01//此模式按鍵也

#defineKEY_PLUS0x02//此加鍵也

voidKeyProc(void){if(Trg&KEY_MODE)//若KEY_MODE鍵按之,雖常按亦無益

{//無執(zhí)行再,必先松再按可矣

Mode++;//模式寄存器加1

}if(Cont&KEY_PLUS)//若“加”鍵按之不放

{cnt_plus++;//則計時

if(cnt_plus>100)//20ms*100=2S若計時到

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論