




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 眾籌養(yǎng)牛合同范例
- 脂滴出核與有絲分裂中均等分配的分子機制研究
- 鋪植草皮施工方案
- 個人投資公司合同范例
- 基于特征學(xué)習(xí)的差分進(jìn)化算法及其在調(diào)度問題中的研究
- 京東供貨方合同范例
- 依戀與支持-單親留守兒童安全感匱乏干預(yù)的小組工作實務(wù)研究
- 個人獨資加油站合同范例
- 基于多目標(biāo)優(yōu)化的聯(lián)邦學(xué)習(xí)客戶端選擇研究
- 與濕地公園合同范本
- 《空氣動力學(xué)基礎(chǔ)》緒論課件
- 卡通插畫幼兒園國防教育主題班會課程PPT實施課件
- 紅樓夢人物關(guān)系圖譜可A4打印版
- 第一屆全國中學(xué)生地球科學(xué)競賽初賽試題試題含答案
- 石化公司建設(shè)項目竣工文件整理歸檔規(guī)范
- A4線纜標(biāo)簽數(shù)據(jù)模板
- 加油站電器火災(zāi)應(yīng)急預(yù)案演練記錄
- 沖壓件,汽車表面零件缺陷及原因分析
- 電熔旁通鞍型
- 2022八年級下冊道德與法治全冊知識點梳理
- 工程數(shù)學(xué)線性代數(shù)第一章同濟第五版ppt課件
評論
0/150
提交評論