freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

單片機c語言學習心得doc-資料下載頁

2025-07-17 23:48本頁面
  

【正文】 (七) 這回我們來講講鍵盤,大家肯定見過銀行柜員機吧,取錢輸入密碼就要用到鍵盤,超市購物取回寄存物品要輸入密碼,還有你現(xiàn)在在用的PC機的鍵盤。但是鍵盤的是怎么工作的呢?一般有2種方式:(1)掃描法,不斷掃描鍵盤的狀態(tài),送CPU判斷并處理。如果鍵盤數(shù)目一大的話,顯然不適合(2)線反轉(zhuǎn)法,通過行列狀態(tài)的改變來判斷有無鍵被按下! 現(xiàn)在我們在P1口接個4*4的鍵盤,--,再接4個4K7的上拉電阻至VCC。代碼如下://鍵盤掃描法程序//用數(shù)碼管顯示相應的鍵值//--//includeunsigned char code tab[ ]={0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C, 0x39,0x5E,0x79,0x71}。//0到F的16個鍵植/******************************************************************************/void Delayt(unsigned char t)//延時函數(shù){ unsigned char i。 for(t=0。i=t。t++) for(i=0。i255。i++)。}/******************************************************************************/bit pkey(void)//判斷鍵的否被按下,通過返回值確定{ P1=0xf0。 if(P1!=0xf0) { Delayt(25)。 if(P1!=0xf0) return 1。 else return 0。 } else return 0。}/******************************************************************************/void main(void)//主函數(shù){ unsigned char key,j,k,s。 while(1) { if(pkey()==1) { P1=0xfe。 k=0xfe。 for(j=0。j4。j++) { s=P1amp。0xf0。 switch(s) { case 0xe0: key=4*j+0。 break。 case 0xd0: key=4*j+1。 break。 case 0xb0: key=4*j+2。 break。 case 0x70: key=4*j+3。 break。 default: break。 } k=(k1)|0x01。 P1=k。 }//for }//if //if((P1amp。0xf0)==0xf0) P0=tab[key]。 P2=1。 Delayt(50)。 }//while} 還有一種就是線反轉(zhuǎn)法,實現(xiàn)如下:,把列線置低電平,行置高,讀行狀態(tài),把行置低,列置高,讀列狀態(tài),則為2次所讀狀態(tài)的結(jié)果即為鍵所在的位置,這樣2次輸出和2次讀入可以完成鍵的識別?。?! 子函數(shù)如下:unsigned char key_vscan(void){ unsigned char row, col。 P1 = 0xF0。 row = P1amp。0xF0。 row = rowamp。0xF0。 P1 = 0x0F。 col = P1amp。0x0F。 col = colamp。0x0F。 return(key_val(row|col))。} 下面我們再來介紹介紹一鍵多能的程序,即按下一個鍵,可以執(zhí)行不同的命令!void main (void){ unsigned char b = 0。 while( 1 ) { if(P1_0 == 0) { Delay(10)。 if(P1_0 == 0) { b++。 if( b == N )//N為鍵的功能數(shù)目 { b = 0。 } while(P3_2 == 0)。//等待鍵松開 } } switch( b ) { case 1: P2_0 = 0xFE。 break。 case 2: P2_1 = 0xfd。 //..............add your code here! } }}(八)//以上的文字寫于2005年5月,由于時間關系,一直未能將此完成,最近閑著無聊又接著寫了些文字,以下寫于2006年6月5日! 在這里我想對上面一點,作個簡單的說明,如果你是剛學單片機,那么你寫的代碼是VERY GOOD的,但是如果把上面的代碼應用于產(chǎn)品的話,那么我可以告訴你,上面所寫的按鍵識別代碼全部是垃圾代碼,^_^,這下傻了吧,呵呵。為什么?我的按鍵不是可以正常工作嗎? 請看這里:if(P1_0 == 0) { Delay(10)。//問題就在這里,你讓CPU在這里空轉(zhuǎn)? if(P1_0 == 0) { //...add your code here. }}進入第1個if判斷語句后,就進入了Delay(10)。再看Delay函數(shù),完全讓CPU執(zhí)行(;空語句),所以在做大的產(chǎn)品或者代碼時,這個是非常耗費單片機內(nèi)部資源的。有什么辦法嗎?呵呵,那是肯定的。 解決方法大致有如下2種:,在中斷里查詢延時的標志位。/*不僅僅用于鍵盤識別,亦可以用于其他的延時代碼,見EX1*/.//見EX2。 EX1:unsigned char Delaytime。 void Delay(unsigned char Delaytime)//{while(Delaytime !=0 )。//等在這里,直到Delaytime為0。}void Timer0_interrupt(void) interrupt 1 using 2{if(Delaytime != ) Delaytime。//...add your other code here}Delay函數(shù)具體延時多長時間,就要看你設定的T0定時器中斷和Delaytime的乘積,比如你的定時器中斷為50MS,Delaytime為20的話,那么50MS*20=1S。EX2:define Press_key = P2 ^ 7。//定義按鍵的I/Ovoid P_key(void){char new_value,old_value。new_value = Press_key。if(new_value amp。amp。 !old_value)//識別按鍵。{ Turn_On_LEd( )。 //...add your other code here.}old_value = new_value。}void Timer0_interrupt(void) interrupt 1 using 2{P_key()。 // ...add your other code}當然在實際過程當中,并不是如此簡單簡潔的,還希望大家能夠舉一反三哦... ^_^。(九)寫了這么多了,大家也看了這么多了,感覺怎么樣?大家也覺得不難吧。其實51也就那么簡單,真的很希望大家看完這篇文字以后,很自信的說,51單片機也已經(jīng)入門。這是對我寫怎么多文字最好的回答。時隔13個月之久再來繼續(xù)寫這些東西,沒有以前的激情和熱情,所以就草草了事結(jié)尾,希望大家不要在背地里罵我哦,^_^。當然以上講的只是最簡單的一些東西,單片機的功能非常之強大,只要你能想得到,就一定可以用單片機來實現(xiàn)的。當然單片機和外部其他的芯片還有很多,比如數(shù)字溫度傳感器DS18B20,實時時鐘芯片DS1302,還有比如訪問AT24CXX的EEPROM存儲器等,更多的電路,還要靠大家在平時的學習過程當中,慢慢掌握。
點擊復制文檔內(nèi)容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1