找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3450|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

跪求單片機矩陣鍵盤問題,num亂跳

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:378659 發(fā)表于 2019-2-14 23:02 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如圖,為什么num亂跳,或者有其他矩陣鍵盤代碼?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:378659 發(fā)表于 2019-2-14 23:17 來自觸屏版 | 只看該作者
#include <reg52.h>#define uchar unsigned char#define uint  unsigned intuchar num=0;//注意這里是0void delay(uint z){        uint x,y;        for(x = z; x > 0; x--)                for(y = 114; y > 0 ; y--);}uchar KeyScan()        //帶返回值的子函數(shù){        uchar cord_l,cord_h;//聲明列線和行線的值的儲存變量        P3 = 0xf0;//1111 0000        if( (P3 & 0xf0) != 0xf0)//判斷是否有按鍵按下        {                delay(5);//軟件消抖                if( (P3 & 0xf0) != 0xf0)//判斷是否有按鍵按下                {                          cord_l = P3 & 0xf0;// 儲存列線值                          P3 = cord_l | 0x0f;                          cord_h = P3 & 0x0f;// 儲存行線值                          while( (P3 & 0x0f) != 0x0f );//松手檢測                          return (cord_l + cord_h);//返回鍵值碼                }                }                }void KeyPro(){        switch( KeyScan() )        {                 //矩陣鍵盤第一行第一個的鍵值碼                case 0xee: num++;                break;                        }        }void main(){                while(1)        {                 KeyPro();//                }}跪求大佬問為什么我按下了那個按鍵num不是1,而是亂跳的數(shù)值,用led燈看過數(shù)值
回復(fù)

使用道具 舉報

板凳
ID:138119 發(fā)表于 2019-2-15 00:41 | 只看該作者
這代碼怎么看?貼個我用過的,僅作參考!

//4*4 鍵盤掃描
void Scan_KEY(void)
{
        S8 = 0;                                                                        //==16,12,13,15
        S7 = 1;
        S6 = 1;
        S5 = 1;
        __delay_us(1);
        if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1)                                //未按下
        {
                S8 = 1;
                S7 = 0;                                                                //10(0),   5,  14,11
                S6 = 1;
                S5 = 1;
                KEY_num_16_bit = 0;
                KEY_num_12_bit = 0;
                KEY_num_13_bit = 0;
                KEY_num_15_bit= 0;
                KEY_num = 0;
                if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1)                        //未按下
                {
                        S8 = 1;
                        S7 = 1;
                        S6 = 0;                                                        //=====9,   4,   1,   6
                        S5 = 1;
                        KEY_num_10_bit = 0;
                        KEY_num_5_bit = 0;
                        KEY_num_14_bit= 0;
                        KEY_num_11_bit= 0;
                        KEY_num = 0;
                        if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1)                //未按下
                        {
                                S8 = 1;
                                S7 = 1;
                                S6 = 1;
                                S5 = 0;                                                //=8,   3,   2,   7
                                KEY_num_9_bit = 0;
                                KEY_num_4_bit = 0;
                                KEY_num_1_bit= 0;
                                KEY_num_6_bit= 0;
                                KEY_num = 0;
                                if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1)        //未按下
                                {
                                        KEY_num_8_bit = 0;
                                        KEY_num_3_bit = 0;
                                        KEY_num_2_bit= 0;
                                        KEY_num_7_bit= 0;
                                        KEY_num = 0;
                                       
                                        KEY_tmp = 0;                                //只能這里清零一次,或者不需要這個
                                }
                                else
                                {
                                        ++KEY_tmp;
                                        if(KEY_tmp >= KEY_delay_OK)                                                                //去抖
                                        {
                                                KEY_tmp = 0;
                                                if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1)                        //S1 + S4 按下
                                                {
                                                        if(KEY_num_8_bit == 0)
                                                        {
                                                                KEY_num_8_bit = 1;
                                                                KEY_num = 8;
                                                                KEY_once_bit = 0;       
                                                        }
                                                }
                                                else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1)                //S1 + S3 按下
                                                {
                                                        if(KEY_num_3_bit == 0)
                                                        {
                                                                KEY_num_3_bit = 1;
                                                                KEY_num = 3;
                                                                KEY_once_bit = 0;       
                                                        }
                                                }
                                                else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1)                //S1 + S2 按下
                                                {
                                                        if(KEY_num_2_bit == 0)
                                                        {
                                                                KEY_num_2_bit = 1;
                                                                KEY_num = 2;
                                                                KEY_once_bit = 0;       
                                                        }
                                                }
                                                else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0)                //S1 + S1 按下
                                                {
                                                        if(KEY_num_7_bit == 0)
                                                        {
                                                                KEY_num_7_bit = 1;
                                                                KEY_num = 7;
                                                                KEY_once_bit = 0;       
                                                        }
                                                }
                                        }
                                }
                        }
                        else
                        {
                                ++KEY_tmp;
                                if(KEY_tmp >= KEY_delay_OK)                                                                        //去抖
                                {
                                        KEY_tmp = 0;
                                        if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1)                                //S7 + S4 按下
                                        {
                                                if(KEY_num_9_bit == 0)
                                                {
                                                        KEY_num_9_bit = 1;
                                                        KEY_num = 9;
                                                        KEY_once_bit = 0;               
                                                }
                                        }
                                        else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1)                        //S7 + S3 按下
                                        {
                                                if(KEY_num_4_bit == 0)
                                                {
                                                        KEY_num_4_bit = 1;
                                                        KEY_num = 4;
                                                        KEY_once_bit = 0;               
                                                }
                                        }
                                        else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1)                        //S7 + S2 按下
                                        {
                                                if(KEY_num_1_bit == 0)
                                                {
                                                        KEY_num_1_bit = 1;
                                                        KEY_num = 1;
                                                        KEY_once_bit = 0;               
                                                }
                                        }
                                        else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0)                        //S7 + S1 按下
                                        {
                                                if(KEY_num_6_bit == 0)
                                                {
                                                        KEY_num_6_bit = 1;
                                                        KEY_num = 6;
                                                        KEY_once_bit = 0;               
                                                }
                                        }
                                }
                        }
                }
                else
                {
                        ++KEY_tmp;
                        if(KEY_tmp >= KEY_delay_OK)                                                                                //去抖
                        {
                                KEY_tmp = 0;
                                if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1)                                        //S6 + S4 按下
                                {
                                        if(KEY_num_10_bit == 0)
                                        {
                                                KEY_num_10_bit = 1;
                                                KEY_num = 10;
                                                KEY_once_bit = 0;                       
                                        }
                                }
                                else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1)                                //S6 + S3 按下
                                {
                                        if(KEY_num_5_bit == 0)
                                        {
                                                KEY_num_5_bit = 1;
                                                KEY_num = 5;
                                                KEY_once_bit = 0;                       
                                        }
                                }
                                else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1)                                //S6 + S2 按下
                                {
                                        if(KEY_num_14_bit == 0)
                                        {
                                                KEY_num_14_bit = 1;
                                                KEY_num = 14;
                                                KEY_once_bit = 0;                       
                                        }
                                }
                                else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0)                                //S6 + S1 按下
                                {
                                        if(KEY_num_11_bit == 0)
                                        {
                                                KEY_num_11_bit = 1;
                                                KEY_num = 11;
                                                KEY_once_bit = 0;                       
                                        }
                                }
                        }
                }
        }
        else
        {
                ++KEY_tmp;
                if(KEY_tmp >= KEY_delay_OK)                                                                                        //去抖
                {
                        KEY_tmp = 0;
                        if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1)                                                //S5 + S4 按下
                        {
                                if(KEY_num_16_bit == 0)
                                {
                                        KEY_num_16_bit = 1;
                                        KEY_num = 16;
                                        KEY_once_bit = 0;                               
                                }
                        }
                        else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1)                                        //S5 + S3 按下
                        {
                                if(KEY_num_12_bit == 0)
                                {
                                        KEY_num_12_bit = 1;
                                        KEY_num = 12;
                                        KEY_once_bit = 0;                               
                                }
                        }
                        else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1)                                        //S5 + S2 按下
                        {
                                if(KEY_num_13_bit == 0)
                                {
                                        KEY_num_13_bit = 1;
                                        KEY_num = 13;
                                        KEY_once_bit = 0;                               
                                }
                        }
                        else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0)                                        //S5 + S1 按下
                        {
                                if(KEY_num_15_bit == 0)
                                {
                                        KEY_num_15_bit = 1;
                                        KEY_num = 15;
                                        KEY_once_bit = 0;                               
                                }
                        }
                }
        }
}
//=END

評分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:365802 發(fā)表于 2019-2-15 08:34 | 只看該作者
沒看出來問題在哪里,可能碼需要處理一下沒有按鍵時候的情況, 下面是我用的4*4鍵盤掃描程序。
  1. uchr keyscan()
  2. {
  3.         uchr keyL,keyH;
  4.        
  5.         GPIO_KEY = 0x0f;                //行線置0
  6.         keyH = GPIO_KEY & 0x0f;        //取行值
  7.        
  8.         if(keyH != 0x0f)                //檢查是否有見按下
  9.         {
  10.                 delayms(10);                        //去抖
  11.                 keyH = GPIO_KEY & 0x0f;        //取行值
  12.                 if(keyH != 0x0f)
  13.                 {
  14.                         keyH = GPIO_KEY & 0x0f;         //取行值
  15.                         GPIO_KEY = keyH | 0xf0;         //輸出列線
  16.                         keyL = GPIO_KEY & 0xf0;         //取列值
  17.                         return keyL + keyH;
  18.                 }
  19.         }
  20.         return 0xff;
  21. }

  22. uchr getkey()
  23. {
  24.         uchr key,v;
  25.         key = keyscan();
  26.         switch(key)
  27.         {
  28.                 case 0xd7:  v=key0; break;
  29.                 case 0xeb:  v=key1; break;
  30.                 case 0xdb:  v=key2; break;
  31.                 case 0xbb:  v=key3; break;
  32.                 case 0xed:  v=key4; break;
  33.                 case 0xdd:  v=key5; break;
  34.                 case 0xbd:  v=key6; break;
  35.                 case 0xee:  v=key7; break;
  36.                 case 0xde:  v=key8; break;
  37.                 case 0xbe:  v=key9; break;
  38.                 case 0xe7:  v=keyleft; break;
  39.                 case 0xb7:  v=keyright; break;
  40.                 case 0x7e:  v=keyup; break;
  41.                 case 0x7d:  v=keydown; break;
  42.                 case 0x77:  v=keyent; break;
  43.                 case 0x7b:  v=keynone; break;
  44.                 default:    v=keynull; break;
  45.         }
  46.         while(key == keyscan() && key != keynull);
  47.        
  48.         return v;
  49. }
復(fù)制代碼
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2019-2-15 08:36 | 只看該作者
//P3  4*4矩陣鍵盤,P1 LED 顯示鍵值
#include <reg52.h>
#define uint unsigned int                 //宏定義無符號整型數(shù)據(jù)
#define uchar unsigned char         //宏定義無符號字符型數(shù)據(jù)
uchar key=0;                                        //定義鍵值全局變量

void keyscan()                                        //按鍵掃描程序
{
        static bit sign=0;                        //按鍵自鎖標(biāo)志
        static uint count=0;                //消抖計數(shù)變量                       
        uchar num=0;                                //臨時變量
        P3=0xf0;                                        //賦值P3 1111 0000
        if(P3!=0xf0)                                //檢測有按鍵按下
        {
                count++;                                //消抖計數(shù)
                if((count>=500)&&(sign==0))//100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
                {                       
                        sign=1;                                //按鍵自鎖標(biāo)志置1
                        num=P3;                                //保存P3值xxxx 0000,x為0或1
                        num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
                        P3=num;                                //賦值P3 xxxx 1111
                        num=P3;                                //保存P3值xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key= 1; break;
                                case 0xde: key= 2; break;
                                case 0xbe: key= 3; break;
                                case 0x7e: key= 4; break;
                                case 0xed: key= 5; break;
                                case 0xdd: key= 6; break;
                                case 0xbd: key= 7; break;
                                case 0x7d: key= 8; break;
                                case 0xeb: key= 9; break;
                                case 0xdb: key=10; break;
                                case 0xbb: key=11; break;
                                case 0x7b: key=12; break;
                                case 0xe7: key=13; break;
                                case 0xd7: key=14; break;
                                case 0xb7: key=15; break;
                                case 0x77: key=16; break;
                        }
                }
        }
        else                                                //鍵抬起
        {
                sign=0;                                        //按鍵自鎖標(biāo)志清0
                count=0;                                //消抖計數(shù)清0
        }
}
void main()                                                //主函數(shù)
{
        while(1)
        {
                keyscan();                                //按鍵掃描程序
                P1=~key;                                //LED顯示鍵碼1~16,低電平亮
        }
}
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表