資源描述:
《查詢方式按鍵》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、【013】查詢方式按鍵?[51]點(diǎn)擊數(shù):684????發(fā)布日期:2006-6-250:57:00??【收藏】?【評(píng)論】?【打印】?【編程愛(ài)好者論壇】?【關(guān)閉】?實(shí)驗(yàn)參考:笨笨工作室-實(shí)驗(yàn)六、查詢方式按鍵。(查看)實(shí)驗(yàn)板:??FB51A。(查看)實(shí)驗(yàn)?zāi)康?<1>掌握讀取外部按鍵時(shí)候應(yīng)該注意的事項(xiàng),掌握查詢方式響應(yīng)按鍵的方法。 <2>掌握讀取按鍵去抖動(dòng)的方法。 ?<3>掌握判直接尋址位轉(zhuǎn)移指令jb,jnb的用法。實(shí)驗(yàn)現(xiàn)象:最右面的數(shù)碼管初始顯示0,每次按下外部按鍵K1執(zhí)行加一,計(jì)數(shù)到9時(shí)重新回0。單片機(jī)響應(yīng)外部按鍵的方式有兩種,一種是查詢方式,一種是中斷方式。查詢
2、方式:?jiǎn)纹瑱C(jī)不斷的查詢是否有按鍵按下,如果有按鍵按下的話,就執(zhí)行相應(yīng)的程序,否則繼續(xù)查詢。中斷方式:?jiǎn)纹瑱C(jī)處理自己的工作,如果有按鍵按下,向單片機(jī)發(fā)出中斷請(qǐng)求。單片機(jī)停下現(xiàn)在正在處理的工作,轉(zhuǎn)去執(zhí)行中斷程序,執(zhí)行之后回來(lái)繼續(xù)剛才的工作。本實(shí)驗(yàn)是用查詢方式完成,只用到一個(gè)鍵K1,每次按下,使第一位數(shù)碼管加1顯示,計(jì)數(shù)到9里重新回0。顯示部分電路及查表顯示方法參考:【005】數(shù)碼管顯示數(shù)字?和【006】多位數(shù)碼管動(dòng)態(tài)顯示。本來(lái)想重畫(huà)個(gè)電路圖,在原來(lái)顯示部分的基礎(chǔ)上再把按鍵部分加上,但一來(lái)放在Blog上寬度有問(wèn)題,再者還是不想畫(huà)了,所以偷個(gè)懶,鍵盤部分單獨(dú)拿出來(lái)吧。顯示部分:按鍵
3、部分:由原理圖知:當(dāng)按鍵k1按下的時(shí)候,對(duì)應(yīng)P1.0輸入低電平。因此,我們要查詢k1是否按下,只要檢測(cè)到p1.0是低電平即可。在查詢鍵是否按下時(shí),要注意按鍵的去抖動(dòng)問(wèn)題,關(guān)于鍵的消抖,見(jiàn)【012】按鍵消抖。按上述方法編寫程序:???????org??0000hstart:?mov??p0,#48h??????;段碼-顯示0???????mov??p2,#01h??????;位碼-選通第一位數(shù)碼管main:??mov??r7,#0ffh?????;查表時(shí)偏移量,用來(lái)實(shí)現(xiàn)由0到9循環(huán)顯示key:???jb???p1.0,key?????;如果P1.0為高電平,則繼續(xù)執(zhí)行此句查詢
4、。???????call?del10ms???????;否則調(diào)用延時(shí)程序?qū)崿F(xiàn)軟件去抖???????jb???p1.0,key?????;再次查詢P1.0,如果是高電平,表示是抖動(dòng),繼續(xù)查詢???????dis:????????????????????????;確定按鍵按下,開(kāi)始執(zhí)行顯示程序???????inc??r7????????????;偏移量自加(第一次值為0)???????mov??a,r7???????mov??dptr,#tab????;取表首址???????movc?a,@a+dptr????;用查表指令獲取要顯示的數(shù)字???????mov??p0,a????
5、?????;得到該字段碼送入P0口顯示???????cjne?a,#48h,key??;未顯示到最后一個(gè)數(shù),繼續(xù)查詢按鍵狀態(tài)???????ljmp?main??????????;顯示到最后一個(gè)數(shù)字則重新開(kāi)始???????tab:???db???0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h;段碼表del10ms:????????????????????;10ms延時(shí)子程序(12M)????????mov?r6,#20???????;2機(jī)器周期temp:???mov?r5,#248??????;2機(jī)器周期????????djnzr5,$?
6、????????;2機(jī)器周期2+2×248=498????????djnzr6,temp??????;2機(jī)器周期2×20=40????????ret????????????????;2+20×498+40=10002即10msend★將該程序下載到板上驗(yàn)證發(fā)現(xiàn)很不穩(wěn)定,按一次鍵時(shí)顯示可能會(huì)變幾次,如果按住鍵不放,將會(huì)顯示“8”,且不停在閃爍,用Porteus仿真了一下也是這個(gè)問(wèn)題。這是由于顯示了一個(gè)數(shù)字之后,單片機(jī)會(huì)返回重新查詢P1.0的狀態(tài),如果按下的時(shí)間很長(zhǎng),就會(huì)導(dǎo)致單片機(jī)又檢測(cè)到低電平,所以就繼續(xù)顯示下一個(gè)數(shù)字,常按住的話就會(huì)循環(huán)此過(guò)程,所以看到的閃爍的“8”實(shí)際上是
7、快速動(dòng)態(tài)顯示“0”到“9”時(shí)人眼的視覺(jué)暫留產(chǎn)生的。那如何使按下一次按鍵,無(wú)論時(shí)間長(zhǎng)短,只作一次按鍵處理呢?可以在顯示完一個(gè)數(shù)字后即檢測(cè)P1.0是否回到高電平(鍵放開(kāi)),若是,表示按鍵一次,繼續(xù)執(zhí)行顯示下一個(gè)數(shù);若不是則原地等待直到P1.0返回高電平。按此思路在程序中將一個(gè)段碼送入P0口顯示之后,加一判斷語(yǔ)句(紅色):???????org??0000hstart:?mov??p0,#48h??????;段碼-顯示0???????mov??p2,#01h??????;位碼-選通第一位數(shù)碼管main:??mov??r7,