版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、鍵盤(pán)程序設(shè)計(jì),按鍵是一種開(kāi)關(guān),通過(guò)外界作用力,導(dǎo)電金屬或?qū)щ姺墙饘俳佑|與分離實(shí)現(xiàn)電路通斷的控制是按鍵的基本機(jī)械原理,如計(jì)算機(jī)鍵盤(pán)、手機(jī)、MP3以及電子表按鍵。按鍵是計(jì)算機(jī)系統(tǒng)輸入設(shè)備,也是人機(jī)信息交換的主要途徑。 按鍵按下會(huì)產(chǎn)生抖動(dòng)現(xiàn)象,不能安全有效的對(duì)系統(tǒng)控制,本節(jié)根據(jù)按鍵產(chǎn)生的抖動(dòng)機(jī)理,提出以中斷、延時(shí)等措施消除鍵盤(pán)輸入過(guò)程中的不穩(wěn)定因素,實(shí)現(xiàn)單片機(jī)系統(tǒng)鍵盤(pán)的穩(wěn)定輸入。,3.3.1 鍵盤(pán)抖動(dòng)現(xiàn)象,按鍵按下都會(huì)發(fā)出一聲響,誰(shuí)然有的按鍵聲音很輕微,但這都是導(dǎo)體碰撞產(chǎn)生的震動(dòng)。這種現(xiàn)象稱(chēng)為鍵盤(pán)抖動(dòng)。如果不對(duì)鍵盤(pán)的抖動(dòng)進(jìn)行處理,按鍵會(huì)對(duì)系統(tǒng)電路或程序產(chǎn)生意外的干擾。為了觀(guān)察按鍵的抖動(dòng)現(xiàn)象,我們先做
2、一個(gè)小實(shí)驗(yàn),分析一下一個(gè)微觸按鍵產(chǎn)生抖動(dòng)對(duì)系統(tǒng)的影響。,加數(shù)計(jì)數(shù)小系統(tǒng),圖3.3.1,圖3.3.2,在圖3-3-1所示的一個(gè)加數(shù)計(jì)數(shù)小系統(tǒng)中,設(shè)計(jì)數(shù)器的脈沖輸入端CP為上升沿有效,加計(jì)數(shù)器初始顯示為0。按鍵不按時(shí),CP = 0,計(jì)數(shù)器不加1計(jì)數(shù)。一般認(rèn)為:按鍵按下,CP端由低電平變?yōu)楦唠娖?,含有電平上升沿,?jì)數(shù)器加1計(jì)數(shù),并且按下1次,計(jì)數(shù)器加1。實(shí)際實(shí)驗(yàn)時(shí)會(huì)發(fā)現(xiàn),按鍵按下1次,計(jì)數(shù)器不是加1,而是跳躍一次性增加3或4。原因是按鍵按下在導(dǎo)體接觸的瞬間產(chǎn)生了震動(dòng)。圖3-3-2是按鍵按下過(guò)程中CP端實(shí)際電平改變情況。T1為不按按鍵時(shí)刻,T2為按鍵按下瞬間的抖動(dòng),T3為按鍵按下穩(wěn)定時(shí)刻,T4為按鍵放
3、開(kāi)時(shí)刻瞬間,T5為按鍵放開(kāi)時(shí)刻。,從圖中可以了解到,按鍵按下的瞬間由于震動(dòng)會(huì)是按鍵內(nèi)部的導(dǎo)體穩(wěn)定接觸,而是在導(dǎo)通和不導(dǎo)通之間來(lái)回彈跳,雖然時(shí)間一瞬間,但使CP端獲得了多個(gè)電平的上升沿。按鍵抖動(dòng)時(shí)間的長(zhǎng)短由按鍵的機(jī)械特性決定,一般為5ms10ms。因此不能直接把按鍵作為1個(gè)脈沖的輸入。 在數(shù)字電路中,常利用觸發(fā)器消除鍵盤(pán)抖動(dòng),但在單片機(jī)系統(tǒng)中,按鍵可以直接接在單片機(jī)的I/O口上,常利用鍵盤(pán)程序來(lái)消除鍵盤(pán)的抖動(dòng)現(xiàn)象。,3.3.2 利用外部中斷INT0實(shí)現(xiàn)鍵盤(pán)輸入,本案列利用外部中斷INT0作為鍵盤(pán)輸入端,當(dāng)按鍵按下時(shí),讓單片機(jī)執(zhí)行外部中斷服務(wù)程序,在中斷服務(wù)中完成鍵盤(pán)控制。 一、參考電路 在最小系
4、統(tǒng)基礎(chǔ)上,單片機(jī)的P0.0口接一只LED,鍵盤(pán)接在P3.2端口,按鍵不按時(shí),由于P3.2接有上啦電阻R3,所以P3.2此時(shí)為高電平+5V,如果按鍵按下,P3.2電源地短路,P3.2為低電平。為了消除鍵盤(pán)抖動(dòng)現(xiàn)象,鍵盤(pán)兩端并聯(lián)濾波電容器C4。,圖3-3-3 利用外部中斷INT0實(shí)現(xiàn)鍵盤(pán)輸入電路,二、程序設(shè)計(jì),#include sbit LED = P00; void int0_isr(void) interrrupt 0 /INT0中斷服務(wù)函數(shù),INT0的中斷號(hào)為0 unsigned char i = 0; i = i; /INT0中斷1次,i值改變1次 LED = i; /INT0中斷1次,L
5、ED工作狀態(tài)變化1次 delay(); /調(diào)用延時(shí)函數(shù) void main(void) LED = 0; /芯片初始化時(shí),LED滅 EA = 0; EX0 = 1; /開(kāi)啟INT0中斷 PX0 = 1; /INT0中斷優(yōu)先,可以省去 EA = 1; /開(kāi)啟總中斷開(kāi)關(guān) while(1); /等待按鍵按下,中斷發(fā)生 ,三、程序說(shuō)明,這里沒(méi)有設(shè)置INT0是下降沿觸發(fā)中斷或是低電平觸發(fā)中斷,原因是按鍵按下,不管產(chǎn)生不產(chǎn)生鍵抖現(xiàn)象,總能使INT0引腳產(chǎn)生1個(gè)下降沿和低電平。如果設(shè)置只有下降沿才觸發(fā)INT0中斷,需要利用設(shè)置計(jì)時(shí)器控制寄存器TCON的IT0 = 1位,按鍵按下是否產(chǎn)生中斷,可以利用程序檢測(cè)
6、TCON的IE0位。利用外部中斷觸發(fā)作為按鍵輸入很好的解決了鍵盤(pán)抖動(dòng)問(wèn)題。如果需要多個(gè)鍵盤(pán),把INT0口與I/O口之間用鍵盤(pán)連接,I/O輸出低電平掃面信號(hào)即可。在數(shù)碼管動(dòng)態(tài)顯示電路中,為了節(jié)省硬件資源,可以在INT0口和P2口之間接入鍵盤(pán),實(shí)現(xiàn)8只按鍵輸入。,二、中斷請(qǐng)求標(biāo)志 1、TCON的中斷標(biāo)志,IT0(TCON.0),外部中斷0觸發(fā)方式控制位。 當(dāng)IT0=0時(shí),為電平觸發(fā)方式。 當(dāng)IT0=1時(shí),為邊沿觸發(fā)方式(下降沿有效)。 IE0(TCON.1),外部中斷0中斷請(qǐng)求標(biāo)志位。 IT1(TCON.2),外部中斷1觸發(fā)方式控制位。 IE1(TCON.3),外部中斷1中斷請(qǐng)求標(biāo)志位。 TF0(
7、TCON.5),定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位。 TF1(TCON.7),定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位。,3.3.3 利用延時(shí)程序防止鍵盤(pán)抖動(dòng),實(shí)現(xiàn)鍵盤(pán)輸入,按鍵按下產(chǎn)生的抖動(dòng)現(xiàn)象持續(xù)的時(shí)間不會(huì)很久,因此在按鍵按下后,可延時(shí)一段時(shí)間跳過(guò)抖動(dòng),再對(duì)按鍵的狀態(tài)檢測(cè),從而實(shí)現(xiàn)鍵盤(pán)輸入。本案例完成通過(guò)兩個(gè)鍵盤(pán)設(shè)計(jì),實(shí)現(xiàn)對(duì)數(shù)碼管顯示數(shù)據(jù)的調(diào)整。 一、電路原理 在單片機(jī)最系統(tǒng)的基礎(chǔ)上,KEY1、KEY2兩個(gè)鍵盤(pán)一端分別接P3.0、P3.1,另一端接地,見(jiàn)圖3-3-2所示。數(shù)碼管仍使用共陽(yáng)型。在Proteuse軟件中,按鍵的英文名字為BUTTON,在Switches sbit key1 = P3.
8、0; sbit key2 = P3.1; uchar key1_state,key2_state; /按鍵按下的狀態(tài)變量 void delay(uchar i) while (i) i-; void key_scan (void) /鍵盤(pán)掃描函數(shù) if(key1 = 0) /如果按鍵按下 delay(200); /延時(shí)一段時(shí)間,消除鍵抖 while(key1 = 0) key1_state = 1; /再對(duì)按鍵檢測(cè),如果確實(shí)按下,按鍵狀態(tài)變量為1 if(key2 = 0) delay(200); while(key2 = 0) key2_state = 1; ,void main(void)
9、char i; while(1) key_scan(); /調(diào)用鍵盤(pán)掃描函數(shù) if(key1_state = 1) /判斷鍵盤(pán)狀態(tài)變量,如1,說(shuō)明有按鍵按下 i+; /顯示數(shù)據(jù)增加 key1_state = 0; /數(shù)據(jù)增加后,鍵盤(pán)狀態(tài)變量清零 if(i9) i = 0; /數(shù)據(jù)增加超過(guò)9后,回到0 if(key2_state = 1) i-; key2_state = 0; if(i 0) i = 9; P0 = seven_segi; /顯示鍵盤(pán)調(diào)整數(shù)據(jù) ,三、程序說(shuō)明,1如果按鍵按下不放開(kāi),程序一直執(zhí)行語(yǔ)句while(key1 = 0),這時(shí)程序在此處死循環(huán),不能執(zhí)行其它程序,所以本案例
10、按鍵抬起后數(shù)據(jù)才能得到調(diào)整。此種編程方法并不影響單片機(jī)驅(qū)動(dòng)1個(gè)數(shù)碼管工作,但動(dòng)態(tài)顯示電路在此種情況下不能正常工作。如果把while改換成if,按鍵只要按下數(shù)據(jù)就能調(diào)整,但如果按下不放開(kāi)按鍵,數(shù)據(jù)自動(dòng)快速增加或減小。如果按鍵按下既不讓程序死循環(huán),也不讓由于按鍵按的時(shí)間過(guò)長(zhǎng)而數(shù)據(jù)調(diào)整失控,最可靠的辦法是利用變量記憶按鍵按下和放開(kāi)的兩種狀態(tài),根據(jù)判斷實(shí)現(xiàn)鍵盤(pán)輸入。程序如下;,uchar key1_down_state, key1_up_state, /變量聲明,初始值為0 if(key1= 0) delay(200) if(key1= 0)keydownstate = 1; /如果按鍵按下,按下?tīng)顟B(tài)
11、變量為1 if(key1 = 1 /按鍵抬起狀態(tài)變量為1 if(keyupstate = 1) keyupstate = 0; /按鍵按下抬起時(shí),數(shù)據(jù)調(diào)整 i+; ,我們也可以使用定時(shí)器中斷對(duì)鍵盤(pán)掃描,實(shí)現(xiàn)鍵盤(pán)輸入,下面時(shí)利用Timer0中斷實(shí)現(xiàn)的鍵盤(pán)輸入,其中鍵盤(pán)key1接單片機(jī)I/O口P3.0,Timer0工作在模式1。 #include #define timer0_count 0 xee18 #define times 20 sbit key = P30; char key_count; static void timer0_isr(void) interrupt 1 TR0 = 0;
12、 TL0 = (timer0_count ,2利用按鍵調(diào)整數(shù)據(jù)時(shí),有時(shí)會(huì)調(diào)整過(guò)量,需要進(jìn)行判斷重置。本案例i為char型變量, 數(shù)值在128127之間,語(yǔ)句if(i9) i = 0是向上增加過(guò)量復(fù)位。 3把鍵盤(pán)掃描key_scan()函數(shù)放在主函數(shù)的while循環(huán)體中,程序執(zhí)行時(shí)會(huì)斷調(diào)用key_scan(),如果沒(méi)有按鍵按下,執(zhí)行key_scan()的時(shí)間很短,如果有按鍵按下,用于按鍵掃面函數(shù)又調(diào)用了延時(shí)函數(shù),程序執(zhí)行時(shí)間會(huì)變長(zhǎng)。,3.3.4 44鍵盤(pán)程序設(shè)計(jì),44鍵盤(pán)16鍵盤(pán)陣列,本案例采用P1口完成,見(jiàn)圖3-3-5所示,把P18條I/O口分成4條列線(xiàn)4條行線(xiàn)交叉但不接觸,16個(gè)按鍵放置交叉
13、位置,在單片機(jī)復(fù)雜系統(tǒng)需要較多按鍵時(shí),這種接法可以節(jié)省單片機(jī)的硬件資源。鍵盤(pán)和P1口之間采用總線(xiàn)連接布局,在電路原理設(shè)計(jì)過(guò)程中,總線(xiàn)只是圖示引腳之間的相連接關(guān)系,但不具有電氣連接特性,相連引腳之間需要標(biāo)注相同的網(wǎng)絡(luò)標(biāo)號(hào)采用電氣連接特性,如圖3-3-5中,單片機(jī)的P1.0與鍵盤(pán)陣列上的P1.0相連。在設(shè)計(jì)單片機(jī)系統(tǒng)或其它電子系統(tǒng)時(shí),由于器件引腳較多,器件與器件之間會(huì)經(jīng)常采用總線(xiàn)連接,并且把電路模塊化設(shè)計(jì)。,二、程序設(shè)計(jì),#include #define uchar unsigned char code uchar P_scan = 0 x01,0 x02,0 x04,0 x08; /鍵盤(pán)行掃描臨
14、時(shí)數(shù)值 code uchar key_temp = 0 x11,0 x12,0 x14,0 x18 /鍵盤(pán)按下得到的臨時(shí)數(shù)據(jù) 0 x21,0 x22,0 x24,0 x28 0 x41,0 x42,0 x44,0 x48 0 x81,0 x82,0 x84,0 x88; code uchar seven_seg10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; void delay(uchar i) while(i) i-;,uchar key_temp(void) /鍵盤(pán)掃描函數(shù) uchar i,j; for(i
15、 = 0; i 4;i+) /讓鍵盤(pán)行線(xiàn)輸出掃描數(shù)據(jù) P1 = P_scani; if(P1 != P_scani) delay(200); /如果有按鍵按下,P1口不是掃描數(shù)據(jù) if(P1 != P_scani) /延時(shí)一段時(shí)間后,分析一下P1口是什么數(shù)據(jù) for(j = 0;j16;j+) /如果P1口上的數(shù)據(jù)與鍵盤(pán)臨時(shí)數(shù)據(jù)相同,輸出臨時(shí)鍵值 if(P1 = key_tempj) return(j); eles /如果沒(méi)有按鍵按下,輸出沒(méi)有按鍵按下標(biāo)志“88” return(88); ,Void main(void) uchar i,j; while(1) i = key_temp(); if(i = 88) P0 = 0 xff; /如果沒(méi)有按鍵按下,P0 = 0 xff,不顯示 else P0 = seven_segi%10; P2 = 0 xbf; /顯示按鍵值個(gè)位數(shù) delay(200); /讓個(gè)位顯示一段時(shí)間再跳過(guò) P0 = seven_segi/10; P2 = 0 x7f; /顯示鍵值十位數(shù) delay(200); /讓十位顯示一段時(shí)間再跳過(guò) ,三、程序說(shuō)明,1在鍵盤(pán)掃描函數(shù)中,執(zhí)行P1 = P_scani,鍵盤(pán)的行線(xiàn)會(huì)依次出現(xiàn)高電平,當(dāng)P1 = 0 x08,只有P1.3 = 1,如果此時(shí)有1個(gè)按鍵按下,比如K7按下,P1.3和P1.5接觸,這是再
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國(guó)旅游集團(tuán)招聘1人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年陜西西咸新區(qū)涇河新城管委會(huì)招聘62人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年貴州安順市西秀區(qū)事業(yè)單位招聘99人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年湖北隨州事業(yè)單位聯(lián)考筆試高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年江蘇南京市級(jí)機(jī)關(guān)事務(wù)管理局所屬事業(yè)單位招考6人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年安徽合肥高新區(qū)管委會(huì)招聘工作人員筆試高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年四川省涼山州民政局考調(diào)直屬事業(yè)單位人員8人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025上半年福建寧德事業(yè)單位歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025上半年江蘇省無(wú)錫事業(yè)單位招聘156人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025上半年安徽蚌埠固鎮(zhèn)縣事業(yè)單位投資集團(tuán)民政信訪(fǎng)招聘及高頻重點(diǎn)提升(共500題)附帶答案詳解
- 中山醫(yī)院報(bào)告查詢(xún)app
- 云南大理州諾鄧古村旅游
- 2023上海初三語(yǔ)文一模試題記敘文閱讀匯編(15區(qū)含答案)
- 山東大學(xué)《高級(jí)語(yǔ)言程序設(shè)計(jì)》2022-2023學(xué)年期末試卷
- 《微機(jī)系統(tǒng)與匯編語(yǔ)言》-課程設(shè)計(jì)-實(shí)時(shí)時(shí)鐘的設(shè)計(jì)與實(shí)現(xiàn)
- 廣東省深圳市龍崗區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末數(shù)學(xué)試卷+
- 安全標(biāo)準(zhǔn)化示范班組建設(shè)匯報(bào)
- 智能電網(wǎng)建設(shè)與發(fā)展趨勢(shì)
- 華為公司管理層選拔機(jī)制解析
- 005獨(dú)立避雷針基礎(chǔ)施工方案
- 第三方代付工程款協(xié)議書(shū)范本
評(píng)論
0/150
提交評(píng)論