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-hant/n/186348.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 05:45
下一篇 2024-11-27 05:45

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python雙重循環輸出矩陣

    本文將介紹如何使用Python雙重循環輸出矩陣,並從以下幾個方面詳細闡述。 一、生成矩陣 要輸出矩陣,首先需要生成一個矩陣。我們可以使用Python中的列表(List)來實現。具體…

    編程 2025-04-29
  • 二階快速求逆矩陣

    快速求逆矩陣是數學中的一個重要問題,特別是對於線性代數中的矩陣求逆運算,如果使用普通的求逆矩陣方法,時間複雜度為O(n^3),計算量非常大。因此,在實際應用中需要使用更高效的算法。…

    編程 2025-04-28
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28

發表回復

登錄後才能評論