本文目錄一覽:
- 1、需要一個STC89C52晶元的矩陣按鍵掃描程序,要求:每一個按鍵(共16個)對應數碼管0~F顯示出來
- 2、C語言矩陣鍵盤函數疑問
- 3、C語言,4X4矩陣鍵盤怎麼判斷有再次按鍵發生?
- 4、求一個單片機4X4矩陣鍵盤掃描程序,C語言的。
需要一個STC89C52晶元的矩陣按鍵掃描程序,要求:每一個按鍵(共16個)對應數碼管0~F顯示出來
這個是單獨的鍵盤掃描子程序,你可以借鑒一下..
我使用的P3口接的矩陣鍵盤,你可以根據需要適當改變. 還要注意我的鍵值可能和你不一樣,這就要看你的硬體電路是怎麼設計的了.
uint keyscan(void)//鍵盤掃描函數,使用行列反轉掃描法
{
uint cord_h,cord_l,cord;//行列值
P3=0x0f; //行線輸出全為0
cord_h=P30x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(); //去抖
if(cord_h!=0x0f)
{
cord_h=P30x0f; //讀入列線值
P3=cord_h|0xf0; //輸出當前列線值
cord_l=P30xf0; //讀入行線值
for(;;)
{
P3=0x0f;
if(P3==0x0f)
break;
}
P10=0;
delayring();
P10=1;
switch(cord_h+cord_l)
{
case 0x7e:P0=led[1];cord=1;break;
case 0x7d:P0=led[2];cord=2;break;
case 0x7b:P0=led[3];cord=3;break;
case 0x77:P0=led[4];cord=4;break;
case 0xbe:P0=led[5];cord=5;break;
case 0xbd:P0=led[6];cord=6;break;
case 0xbb:P0=led[7];cord=7;break;
case 0xb7:P0=led[8];cord=8;break;
case 0xde:P0=led[9];cord=9;break;
case 0xdd:P0=led[0];cord=0;break;
case 0xee:cord=13;break;
case 0xed:cord=14;break;
case 0xeb:cord=15;break;
case 0xe7:cord=16;break;
}
P2=h;
return(cord);//鍵盤最後組合碼值
}
}return(0xff); //返回該值
}
如果有按鍵,就會返回按鍵值, 如果沒按鍵則返回 0XFF, 通過讀取返回值可以判斷是否有按鍵, 在程序開頭可以加上全局變數的斷碼錶, 這就看你用的是共陰的還是共陽的數碼管了~~
祝您的問題早日得到解決. 謝謝
C語言矩陣鍵盤函數疑問
看程序中P1.0-P1.3是行掃描輸出,P1.4-P1.7是掃描輸入。所以原理是P1.0-P1.3中每次只有一個引腳輸出0,其餘輸出1,然後讀取P1.4-P1.7是否有引腳為0;如果有0說明有按鍵按下,如果全1說明沒有按鍵按下。
scancode這個變數就是用於控制P1.0-P1.3(P1 = scancode;由這句輸出)中每次只有一個引腳輸出0的。
scancode = 0xfe;這句中bit0值為0,其餘bit為1,所以開始時,P1 = scancode;由這句輸出後,P1.0為0,其餘引腳為1。
scancode = (scancode 1) | 0x01;這句使為0的bit左移一位(依次值為0xFE, 0xFD, 0xFB, 0xF7, 0xEF)。0xFE, 0xFD, 0xFB, 0xF7都滿足while ((scancode 0x10) != 0)這個條件,而0xEF則不滿足了,所以說此語句只檢查第五位是否為1,如果最低列按下後不就等於零了,就跳過此函數了,到這就所有按鍵都掃描過了,沒有按鍵按下(如果有按鍵按下,中途就返回了)。
if ((P1 0xf0) != 0xf0)這句中P1 0xf0表示只判斷P1.4-P1.7,只有當前按下的按鍵所在行掃描輸出為0時,這個表達式才成立(這時(P1 0xf0) != 0xf0);否則這個表達式肯定不成立(這時(P1 0xf0) == 0xf0),所以說當前行。
return ((~scancode) + (~tmpcode));這句就是如果有按鍵按下,那麼直接返回鍵值,並不再進行循環退出程序。
程序格式要注意,下面這樣更清楚:
uchar keyscan(void)
{
uchar scancode, tmpcode;
P1 = 0xf0; // 發全0行掃描碼
if ((P1 0xf0) != 0xf0)
// 若有鍵按下
{
delay(); // 延時去抖動
if ((P1 0xf0) != 0xf0)
// 延時後再判斷一次,去除抖動影響
{
scancode = 0xfe;
while ((scancode 0x10) != 0)
// 逐行掃描此語句只檢查第五位是否為1,如果最低列按下後不就等於零了,就跳過此函數了
{
P1 = scancode; // 輸出行掃描碼
if ((P1 0xf0) != 0xf0)
// 本行有鍵按下為什麼是行?哪一列按下此句都成立啊
{
tmpcode = (P1 0xf0) | 0x0f;
/* 返回特徵位元組碼,為1的位即對應於行和列 */
return ((~scancode) + (~tmpcode));
}
else
scancode = (scancode 1) | 0x01;
// 行掃描碼左移一位
}
}
}
return (0); // 無鍵按下,返回值為0
}
C語言,4X4矩陣鍵盤怎麼判斷有再次按鍵發生?
你在程序檢測到按鍵後,加個延時去抖,不要加鬆手檢測。然後執行第一個按鍵相對應的程序。
然後繼續按鍵掃描。注意這裡說的是繼續,也就是繼續往下檢測。否則你的程序就只能執行第一個按鍵所對應的程序了。這樣,就能檢測到你第二次按鍵的鍵值了。
當然,這個掃描是循環的。也就是說即使你第二次按的按鍵已經掃描完了,循環掃描任然能檢測到。
求一個單片機4X4矩陣鍵盤掃描程序,C語言的。
淘bao 旺鋪: 廣州華電 單片機學習板 單片機外圍學習模塊/感測器模塊
//4*4鍵盤檢測程序,按下鍵後相應的代碼顯示在數碼管上
#includereg51.h
sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j0;j–)
for(k=125;k0;k–);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsigned char num)
{
P0=table[num];
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
void main()
{
dula=0;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
beep=0;
}
beep=1;
display(key);
}
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186348.html