1. 請問單片機4*4矩陣鍵盤如何檢測並返回多個按鍵按下的鍵值和多個按鍵抬起的鍵值(註:不使用死循環)
你按鍵要是沒有鬆手檢測的話,按鍵按下後程序會執行一次按鍵一的數據,然後在執行按鍵2的數據,按鍵1和按鍵2就成了循環檢測了,執行兩個按鍵事件,如果按鍵有鬆手檢測的話,例如按鍵1按下,程序會在按鍵1哪裡等待按鍵鬆手後,才會跳出按鍵,否則按鍵會一直死在哪裡等待按鍵鬆手,希望我的回答對你有幫助!
那就用這種方法解決:
if(keyxxx == 0)
{
if(++i <= 10)
return;
//
if(keyxxx == 0)
{
i = 0;
//處理按鍵程序
}
}
if(keyxxx == 0)
{
if(++y <= 10)
return;
//
if(keyxxx == 0)
{
y = 0;
//處理按鍵程序
}
}
2. C51單片機4X4矩陣鍵盤檢測程序問題
可以參考:
http://hi..com/%d7%f6%b6%f8%c2%db%b5%c0/blog/item/ef086222268d4f4eac34de59.html
程序中,讀取4*4矩陣鍵盤的函數,可以得到0~f,和16。
當讀出為16的時候,即是按鍵放手了,可以執行對應的功能程序。
3. 求助程序:51單片機矩陣鍵盤是否按下檢測程序
/**************************************************************************************
* 矩陣按鍵實驗 *
實現現象:下載程序後數碼管顯示0,按下矩陣按鍵上的按鍵顯示對應的數字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
注意事項:如果不想讓點陣模塊顯示,可以將74HC595模塊上的JP595短接片拔掉。
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用來存放讀取到的鍵值
u8 code smgan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : KeyDown
* 函數功能 : 檢測有按鍵按下並讀取鍵值
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵鬆手檢測
{
delay(1000);
a++;
}
}
}
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
LSA=0; //給一個數碼管提供位選
LSB=0;
LSC=0;
while(1)
{
KeyDown(); //按鍵判斷函數
GPIO_DIG=smgan[KeyValue]; //
}
}
4. 單片機上矩陣鍵盤出現問題
你應該把P1.0設置成0輸出,P1.2
P1.3
P1.1輸出為1.再依次檢測P1.4-P1.7
再把P1.1設置成0輸出,P1.2
P1.3
P1.0輸出為1.再依次檢測P1.4-P1.7
再把P1.2設置成0輸出,P1.1
P1.3
P1.0輸出為1.再依次檢測P1.4-P1.7
再把P1.3設置成0輸出,P1.2
P1.1
P1.0輸出為1.再依次檢測P1.4-P1.7
這樣掃描鍵盤就可以了
5. 單片機矩陣鍵盤掃描方式
首先單片機引腳默認輸出高電瓶的。令控制某一行(假設第n行)鍵盤的引腳為0,然後按下該行的某一鍵,然後一列一列的檢查低電平(假設檢測出為第m列),由此判斷出按下的為第nm鍵。思路就是令行為低電平,檢查列(當然反之也可以)
6. 單片機矩陣鍵盤鬆手檢測問題,怎樣加鬆手檢測
display()沒問題,但是鍵盤掃描的時候和消抖都是要花時間的,要綜合起來考慮問題,動態掃描最好用定時中斷方式
7. 51單片機4 x 4矩陣鍵盤的檢測中P3=0xfe,temp=P3;看解釋ms第二步是把按下去的鍵P3賦給temp 但p3不是被
這個問題是這樣的,首先單片機的c語言和電腦的編譯器不是一樣的,你要考慮硬體,下面步入正題:
P3=0xfe; //P3等於0xfe
temp=P3; //temp等於P3等於0xfe
temp=temp&0xf0; //到這里,如果你按下矩陣鍵盤的第一個鍵,那麼temp等於0xee
temp=0xee&0xf0=0xe0
while(temp!=0xf0) //你這里打錯了,不是while語句是if語句,現在temp的值是0xe0
0xe0不等於0xf0,所以進入語句內部
{
delay(5); //去抖動
temp=P3; //現在賦值,這是你還在按著第一個鍵,那麼P3=0xee,所以temp等於0xee
temp=temp&0xf0; //temp=0xee&0xf0=0xe0,「看這里,這是temp=0xe0」
while(temp!=0xf0) //這里還是寫錯了,是if語句,0xe0不等於0xf0再次進入語句內部
{
temp=P3;//在沒執行這一步的時候,temp的值是0xe0,如果不把P3的值賦予temp
那麼當進入switch語句後就沒有相應的case,這是你還在按鍵,那麼
P3=0xee,所以temp也等於0xee,然後進入switch語句判斷,進入
相應的case
switch(temp)
8. 51單片機矩陣鍵盤檢測方面的問題
第一個問題,應該是考慮如果先開鎖存器,在那一時刻,P0的值還是上一次給P0賦的值,下在一條語句才將這次的值給P0,這樣會造成數碼管的余輝,靜態顯示的時候,因為太快看不到,動態顯示時,就會比較明顯了。第二個問題他的程序應該檢測的是高四位,是否被拉低,因為temp和0xf0與,低四位不管是什麼,都是0,只有高四位的值從1,變為0,0xf0才會發生改變。