❶ 誰能詳細說下單片機按鍵掃描呀
#include"regx52.h"
sbit KeyOne = P1^0 ;
sbit KeyTwo = P1^1 ;
sbit KeyThree = P1^2 ;
sbit KeyFour = P1^3 ;
#define uint16 unsigned int
#define uint8 unsigned char
#define NOKEY 0xff
#define KEY_WOBBLE_TIME 500 //去抖動時間(待定)
#define KEY_OVER_TIME 15000
//等待進入連擊時間(待定),該常數要比正常
//按鍵時間要長,防止非目的性進入連擊模式
#define KEY_QUICK_TIME 1000 //等待按鍵抬起的連擊時間(待定)
void v_KeyInit_f( void )
{ KeyOne = 1 ; //按鍵初始化(相應埠寫1)
KeyTwo = 1 ;
KeyThree = 1 ;
KeyFour = 1 ;
}
uint8 u8_ReadKey_f(void)
{ static uint8 LastKey = NOKEY ; //保存上一次的鍵值
static uint16 KeyCount = 0 ; //按鍵延時計數器
static uint16 KeyOverTime = KEY_OVER_TIME ; //按鍵抬起時間
uint8 KeyTemp = NOKEY ; //臨時保存讀到的鍵值
KeyTemp = P1 & 0x0f ; //讀鍵值
if ( KeyTemp == 0x0f )
{ KeyCount = 0 ;
KeyOverTime = KEY_OVER_TIME ;
return NOKEY ; //無鍵按下返回NOKEY
}
else
{
If ( KeyTemp == LastKey ) //是否第一次按下
{
if( ++KeyCount == Y_WOBBLE_TIME )
//不是第一次按下則判斷//抖動是否結束
{
return KeyTemp ;
//去抖動結束,返回鍵值
}
else
{
if( KeyCount > KeyOverTime )
{
KeyCount = 0 ;
KeyOverTime = KEY_QUICK_TIME ;
}
return NOKEY ;
}
}
else
//是第一次按下則保存鍵值,以便下次執行此函數時與讀到的鍵值作比較
{
LastKey = KeyTemp ; //保存第一次讀到的鍵值
KeyCount = 0 ; //延時計數器清零
KeyOverTime = KEY_OVER_TIME ;
return NOKEY ;
}
}
}
❷ C51單片機按鍵掃描
1.設置一個狀態變數,如flag,定義flag=0為開狀態,flag=1為關狀態。
2.因為是按鍵(不是開關),所以實際上單片機讀取的應該是脈沖形式的輸入。設按鍵接單片機P01引腳,故可採用以下程序實現按鍵掃描
if(P01==0)//按下按鍵,進入下降沿
{
delay2();//20ms延時去按鍵前抖動
while(P01==0);//等待上升沿到
來,即按鍵彈起
flag=~flag;//flag取反,實現狀態切換
}
void
delay2()//20ms延時子程序
{
unsigned
char
i,k;
for(i=0;i<100;i++)
for(k=0;k<100;k++);
}
註:根據按鍵的具體接法,若按下按鍵向單片機輸入低電平,則採用以上程序;若按下按鍵向單片機輸入高電平,則將兩處P01==0均改為P01==1。
❸ 單片機控制的LED動態掃描顯示原理
現已DS8為個位來討論,十、百、千為分別為DS7、DS6、DS5。 1、首先要了解的是此數碼管為共陰極數碼管,即三極體Q16、Q15、Q14、Q13導通時數碼管才能點亮,亦即相應的單片機P23、P22、P21、P20為低電平。 2、動態掃描顯示原理如下: (1)P23、P22、P21、P20輸出高電平,關閉所有數碼管; (2)顯示個位——把要顯示的數據送到P10~P17,P23送低電平,延時5豪秒(時間不能太長,否則數碼管會閃爍),P23送高電平; (3)顯示十位——把要顯示的數據送到P10~P17,P22送低電平,延時5豪秒(時間不能太長,否則數碼管會閃爍),P22送高電平; (4)顯示百位——把要顯示的數據送到P10~P17,P21送低電平,延時5豪秒(時間不能太長,否則數碼管會閃爍),P21送高電平; (5)顯示千位——把要顯示的數據送到P10~P17,P20送低電平,延時5豪秒(時間不能太長,否則數碼管會閃爍),P20送高電平。 (6)以此順序循環,把它做成子程序,在主循環中調用。
❹ 單片機中 掃描周期是什麼啊
單片機的掃描周期就是單片機開機後進入運行狀態後,單片機運行主程序所需的時間,因為主程序是一個「死循環」,循環完成一次所需要的時間就是該單片機系統的掃描周期。一般在ms級別。
❺ 單片機實現一個鍵盤掃描的過程中要注意哪些事項
摘要 鍵盤由行線列線交叉而成。列線接有上拉電阻。對第一行的行線置0,然後讀取列線碼,如果所有列線都是1說明買有被按下的鍵,繼續掃描下一行。直到能讀到0為止,讀到0時所掃描的行就是該鍵的行碼,而0所在的位是列碼。一般的鍵盤掃描都做成中斷形式,把列線所有線相與,只要有一個0就輸出0,將這個信號送給中斷,就可以實現在有鍵被按下時開啟掃描了。
❻ 單片機 按鍵掃描,下面完成什麼功能求注釋一下,一定採納
getk: clr p2.4 ;將P2.4口 清0(置0)
mov p0,#0ffh;給P0口傳遞數據FFH,1111 1111 即把P0口全部置1,用於掃描按鍵因為51 單片機的IO只能檢測低電平,所以要先將IO置為1,才能檢測按鍵按下後對0導通
nop ;這個不用解釋了吧,空操作佔用1個機器周期,用於簡單的延時一下,以便讓P0口電平
nop ;穩定
mov a,p0 ;將P0口的狀態傳遞給A寄存器。這期間如果P0口有按鍵按下他的狀態會變成0比
如P0.0的按鍵按下,那傳給A的狀態就是1111 1110,16進制的#0FEH
cpl a ;將A寄存器取反原來為1的現在為0 如上行所示就變成了0000 0001,16進制的#01H
anl a,#1fh;與操作,用於保留A寄存器的低5位數據,防止別的信號影響到結果(同時也說 明按鍵接在P0口的低5位。另外結果實際保存在了A寄存器中)
setb p2.4 ;在將P2.4置位,即讓P2.4口輸出1高電平
ret ;子程序返回
這段程序用於掃描P0的低5位的按鍵,哪個按下,最後變為那個位為1輸出。結果保存在A寄存器中,另外A寄存器的高3位即位7,6,5這3位恆為0.因為 這句anl a,#1fh;已經把高位清零了。
至於P2.4口應該如樓上所說的用於控制244,373等鎖存器用途。因為P0口的低5位應該同時還接又別的器件。用鎖存器防止干擾
❼ 單片機掃描電路原理
單片機行列式鍵盤掃描原理如下:
1、行線P10~P13為輸出線,列線P14~P17為輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全為高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。
2、延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。
3、單片機將P10輸出為低電平,其它P11~P13輸出高電平,此時讀取列線的數據全為高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍為高電平。
4、此時再來讀取列線數據,發現列線讀到的數據有低電平,數值為1011(0x0B),如果我們的鍵盤布局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。
(7)單片機掃描擴展閱讀
單片機學習方法
1、基礎理論知識學習
基礎理論知識包括模擬電路、數字電路和C語言知識。。在學習單片機之前,覺得模擬電路和數字電路基礎不好的話,不要急著學習單片機,應該先回顧所學過的模擬電路和數字電路知識,為學習單片機加強基礎。
2、單片機實踐
准備一台電腦、一塊單片機開發板、一套視頻教程、一本單片機教材和一本C語言教材。電腦是用來編寫和編譯程序,並將程序代碼下載到單片機上;開發板來運行單片機程序,驗證實際效果。
❽ 單片機在掃描是否有鍵按下時,為什麼要做這么多次的判斷有什麼作用,尋找大俠~我是菜鳥~
是為了防止鍵盤抖動,鍵盤抖動的時間是很短的,通過延時一段時間後,如果再判斷鍵盤是按下的,這是才真正能說明鍵盤按下了,相反,則是抖動,不能說明鍵盤按下!
所以,軟體中一般都需要兩次判斷鍵盤按下!
第一次之後,加段延時,之後再判斷
❾ 單片機掃描程序
你把key的初始化(第一行 unsigned char key=0)不要放在循環裡面,因為每次都要執行這條語句,所以key的值始終未0,所以只能顯示第一位
你把 unsigned char key=0;這條語句放到 while(1)循環外邊就可以了
❿ 單片機行列式鍵盤掃描原理
單片機行列式鍵盤掃描原理如下:
1、行線P10~P13為輸出線,列線P14~P17為輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全為高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。
2、延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。
3、單片機將P10輸出為低電平,其它P11~P13輸出高電平,此時讀取列線的數據全為高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍為高電平。
4、此時再來讀取列線數據,發現列線讀到的數據有低電平,數值為1011(0x0B),如果我們的鍵盤布局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。
(10)單片機掃描擴展閱讀
單片機學習方法
1、基礎理論知識學習
基礎理論知識包括模擬電路、數字電路和C語言知識。。在學習單片機之前,覺得模擬電路和數字電路基礎不好的話,不要急著學習單片機,應該先回顧所學過的模擬電路和數字電路知識,為學習單片機加強基礎。
2、單片機實踐
准備一台電腦、一塊單片機開發板、一套視頻教程、一本單片機教材和一本C語言教材。電腦是用來編寫和編譯程序,並將程序代碼下載到單片機上;開發板來運行單片機程序,驗證實際效果。