|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請教簡單的單片機(jī)C程序 |
| 作者:szhaochong 欄目:ARM技術(shù) |
硬件電路描述如下:89S52 單片機(jī)的P1 口接有8 個(gè)LED,當(dāng)某一端口輸出為“0”時(shí),相應(yīng)的LED 點(diǎn)亮,P3.2、P3.3、P3.4、P3.5 分別接有四個(gè)按鈕K1~K4,按下按鈕時(shí),相應(yīng)引腳被接地,F(xiàn)要求編寫可鍵控的流水燈程序,當(dāng)K1 按下時(shí),開始流動(dòng),K2 按下時(shí)停止流動(dòng),全部燈滅,K3 使燈由上往下流動(dòng),K4 使燈由下往上流動(dòng)。 鍵控流水燈的程序 #include "reg51.h" #include "intrins.h" #define uCHAR unsigned CHAR void mDelay(unsigned int DelayTime) { unsigned int j=0; for(;DelayTime>0;DelayTime--) { for(j=0;j<125;j++) {;} }} uCHAR Key() { uCHAR KeyV; uCHAR tmp; P3=P3|0x3c; KeyV=P3; if((KeyV|0xc3)==0xff) return(0); mDelay(10); KeyV=P3; if((KeyV|0xc3)==0xff) return(0); else { for(;;){ tmp=P3; if((tmp|0xc3)==0xff) break;} return(KeyV);}} void main() { unsigned CHAR OutData=0xfe; bit UpDown=0; bit Start=0; uCHAR KValue; for(;;) { KValue=Key(); SWITCH (KValue) { case 0xfb: //P3.2=0,Start { Start=1; break; } case 0xf7: //P3.3=0,Stop { Start=0; break; } case 0xef: //P3.4=0 Up { UpDown=1; break; } case 0xdf: //P3.5=0 Down { UpDown=0; break; } } if(Start) { if(UpDown) OutData=_crol_(OutData,1); else OutData=_cror_(OutData,1); P1=OutData; } else P1=0xff; mDelay(1000); } } 其中下面這段程序看不太懂,哪位大哥(大姐)能否幫小弟解釋一下?!最好能注釋每個(gè)語句的功能。 uCHAR Key() { uCHAR KeyV; uCHAR tmp; P3=P3|0x3c; KeyV=P3; if((KeyV|0xc3)==0xff) return(0); mDelay(10); KeyV=P3; if((KeyV|0xc3)==0xff) return(0); else { for(;;){ tmp=P3; if((tmp|0xc3)==0xff) break;} return(KeyV);}} |
| 2樓: | >>參與討論 |
| 作者: szhaochong 于 2005/10/17 19:21:00 發(fā)布:
是不是寫重了? 這是我在網(wǎng)上下載的一個(gè)程序,是不是下面這段程序重復(fù)了? KeyV=P3; if((KeyV|0xc3)==0xff) return(0); |
|
| 3樓: | >>參與討論 |
| 作者: 狐貍 于 2005/10/18 10:06:00 發(fā)布:
這段程序主要是為了消抖 |
|
| 4樓: | >>參與討論 |
| 作者: 陳雙君 于 2005/10/18 10:09:00 發(fā)布:
這是一個(gè)按 鍵功能的小程序吧 這是一個(gè)按鍵功能的小程序吧。 |
|
| 5樓: | >>參與討論 |
| 作者: xingqq1980 于 2005/10/18 12:33:00 發(fā)布:
關(guān)于程序的解釋,只是個(gè)人見解 uchar Key() { uchar KeyV; uchar tmp; P3=P3|0x3c; //將4個(gè)按鍵口置為1 KeyV=P3; //掃描按鍵 if((KeyV|0xc3)==0xff) //如果按鍵沒有變化,各口值為1,即0xff,返回0. return(0); //否則表示有按鍵按下 mDelay(10); //延時(shí)程序,用于軟件消抖 KeyV=P3; //再次讀取按鍵狀態(tài) if((KeyV|0xc3)==0xff) return(0); else //表明有按鍵按下 { for(;;){ tmp=P3; //再次讀取按鍵狀態(tài),用于消抖,個(gè)人感覺沒有必要. if((tmp|0xc3)==0xff) break;} return(KeyV);}} |
|
| 6樓: | >>參與討論 |
| 作者: szhaochong 于 2005/10/18 21:13:00 發(fā)布:
感謝回復(fù) 謝謝各位大蝦指教,小弟不勝感激。。!1 |
|
| 7樓: | >>參與討論 |
| 作者: ipman 于 2005/10/18 23:41:00 發(fā)布:
10ms消抖不太可靠,我一般20ms |
|
| 8樓: | >>參與討論 |
| 作者: 請求權(quán) 于 2008/2/21 12:04:58 發(fā)布:
10MS夠了
|
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |