1樓:網友
7個腳作掃瞄輸出(比如0000001做左移或1111110做左移;當然也可以做右移),8個腳做採集輸入。每掃瞄輸出乙個腳,就檢查下采集輸入腳有無變化,有變化,再查出是哪個按鈕按下去了就ok了。
電路網上面有,簡單得很。當然你也可以用4094做輸出,只用乙個4094,佔三個i/o口。用4021做輸入檢測,也只佔三個i/o口。
希望對你有幫助。
51微控制器矩陣鍵盤掃瞄程式分析?
2樓:網友
我給你乙個我自己寫的吧 有註釋。
假設按下的是s1鍵進行如下檢測(4*4鍵盤)先在p3口輸出。
p3 00001111
低四位 行會有變化。
if !=00001111
延時if !=00001111
p3再輸出11111110
p3 =00001110|11110000=11111110輸出高四位。
cord_l=p3&0xf0 //此時p3口就是輸入值01111110 而不是上面的11111110
cord_h+cord_l=00001110+01110000=01111110=0x7e //此編碼即為s1的編碼。
#include //包含標頭檔案。
#define uchar unsigned char#define uint unsigned intunsigned char const table=;//0-fuchar keyscan(void);
void delay(uint i);
void main()}
uchar keyscan(void)//鍵盤掃瞄函式,使用行列反轉掃瞄法。
return(0xff); //返回該值}void delay(uint i)//延時函式在p3口做的鍵盤。
你的去抖檢測沒有做好。
3樓:做而論道
你這函式也沒有寫全,返回值錯誤,看不太明白。
建議看看:
4樓:網友
返回值錯誤時,有多個按鍵同時按下的結果。
多看看書,簡單說,將乙個埠置為高電平,此時按鍵接通,必然另一埠的電平為高,否則按鍵關斷。
51微控制器。4*4矩陣鍵盤掃瞄程式
5樓:情鍾綠茶
首先微控制器引腳預設輸出高電瓶的。令控制某一行(假設第n行)鍵盤的引腳為0,然後按下該行的某一鍵,然後一列一列的檢查低電平(假設檢測出為第m列),由此判斷出按下的為第nm鍵。思路就是令行為低電平,檢查列(當然反之也可以)
6樓:網友
建議看一下行列式鍵盤的使用原理。
51微控制器矩陣鍵盤程式問題求解
7樓:網友
這個我知道有個類似的,你的意思就是按1下,執行函式1;按第2下,執行函式2你在檢測按鍵按下的時候。設定個變數sum=0;按1次就sum++然後就可以區分按下兩次的不同了。
void keyscan()
if(snum==1)
if(snum==2)
比如,我寫的乙個暫停的函式,按1下,執行乙個函式1,暫停;
再按1下,執行另一函式2,開始工作。
不懂的說吧 ,另外你發問題不給分,這個態度是不對滴^-^
51微控制器鍵盤矩陣掃瞄**的理解
8樓:網友
本人是學c的,但還看得懂組合語言。
mov p2,a 是把掃瞄碼賦給p2口,其實是賦給p2口的低四位,進行掃瞄;
mov a,p2 是讀取p2口的值,後面一句把低四位遮蔽了,最終還是讀取了高四位。
9樓:網友
這兩條語句就是掃瞄按鍵用的啊,這個是乙個迴圈掃瞄按鍵子程式(4*4的鍵盤),如先給p2口乙個值(11110111),如果有按鍵去讀p2口的值就看是不是(11110111),如有鍵按下這個值有可能是),是其中乙個的時候我們就認為有鍵按下。
10樓:網友
語句 mov a,p2 就是在讀鍵盤,如果沒有鍵按下,則a的值就是取反(cpl)後的值,如果有鍵按下,就要看按下的是哪個鍵了,不同的鍵按下返回不同的值,這些值也就是鍵盤的編碼。
11樓:做而論道
將累加器a的值傳送到p2口,--在p2低四位輸出一位0;
又將p2口的值傳送到累加器a,那現在a的值到底應該是多少,--a的內容取決於p2外接按鍵的狀態。
12樓:網友
如果是c語言就好了!個人建議你還是學用c語言寫程式!c語言比彙編好多了!
求51微控制器最簡單的矩陣按鍵程式
13樓:微控制器技術宅
uchar x[16]=;
uchar scan() //掃瞄鍵值的子程式} }return(key);}
求。用89c51微控制器設計4*4矩陣式鍵盤計算器程式,
14樓:網友
我剛做了乙個,不過是用c語言寫的,1602液晶顯示的。
15樓:樹清稱思楠
/*我寫的這個計算器可以算255範圍以內的整數計算,本打算再加入小數與做最後的處理工作。可是又太費時間,所以就放那裡了。看見了你的提問,也懶得改一改,你看看能不能用。*/
#include
unsigned char line,row,val;
void delay()
void delay1()
void initialcpu(void)
unsigned char leddata=; //"0-9"
unsigned char ledbai(unsigned char dat)
unsigned char ledshi(unsigned char dat)
void ledge(unsigned char dat)
unsigned char bin=1;
void ledplay(unsigned char dat)
else if(bin==2)
else if(bin==3)
unsigned char futemp=0,data1=0,data2=0;
void initialtimer0(void)
void timer0(void) interrupt 1 using 3
有值了,顯示data1,ledplay(data1);
有兩種可能,1、資料data1為零;2、直接data1沒有給它值。總之顯示data1
ledplay(data1);
輸入的是符號,接著顯示data1
ledplay(data1);
顯示的是data2
ledplay(data2);
th0=(65536-100)/256;
tr0=1;
void denghou()
unsigned char keytemp,checkvalue,key1=0x00,key2=0x00;
void dispose()
else else if(val>9&&val<16)
else if(val==13)
else if(futemp==11)
else if(futemp==14)
else if(futemp==15)
else}}
elsewhile(1) //顯示錯誤。
unsigned char getkey1(void)
unsigned char getkey2(void)
void main()}
51微控制器矩陣鍵盤問題
16樓:網友
這問題問得還是可以,scan1&0xf0 就是為了防止其他因素干擾了p1的低四位,用你說的scan1!=0xf0 程式就會認為有按鍵按下,實際則沒有。只不過在不嚴格要求下用 scan1!
0xf0 也是可以的。順便提醒你一下,程式改了,實踐下就知道了。
17樓:生活如歌
在這裡scan1就是p1口,而p1口接了矩陣式鍵盤,四行四列。在這條語句之前已經通過p1口送出了四個低電平:p1=0xf0.
這條語句p1&0xf0就是遮蔽先送出去的低四位的四個低電平。然後再通過(p1&0xf0)!=0xf0來判斷是不是有鍵按下。
18樓:網友
scan1&0xf0 應該是用來遮蔽低四位用的。
19樓:網友
是的,p口也包括其他輸入口的讀取,如果不是用全部位都需要這樣來處理,因為你不知道其他位處於什麼狀態,所以需要把不要得位遮蔽掉。
7乘8減36,這道題算式表示7乘8的積,再減去36,差是多少
由題意得式子為7 8 36 56 36 20 7 8 36 56 36 20 一個數先加上8,再乘以8,再減去8,最後除以8,結果還是8,這個數是多少 這個數是1。解題過程如下 解 設這個數為x。x 8 8 8 8 8 8 x 8 8 64 8 x 8 72 x 8 9 x 1使方程左右兩邊相等的未...
用c語言求兩個矩陣的乘積,求高手
這個不算,沒看清楚0 0 這下看清楚了,是少了再就是你是怎麼初始化的,初始化不對也會出問題 include int main printf n printf array c n for i 0 i 3 i 列印二維陣列要用二層for迴圈巢狀 return 0 你的陣列都沒有進行初始化就運算了?問題一...
數乘08的積比45乘06少7,求這個數是多少?列方程
0.8x 7 45 0.6 0.8x 45 0.6 7 0.8x 27 7 0.8x 20 x 25 設這個數位x 0.8x 45 0.6 7 0.8x 20 x 25 x 0.8 45 0.6 7 x 25 一個數乘0.8的積比45個0.6少7,這個數是多少 設這個數是x 0.8x 7 45 0....