久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3505|回復: 4
收起左側

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

[復制鏈接]
ID:378659 發表于 2019-2-14 23:02 來自觸屏版 | 顯示全部樓層 |閱讀模式
如圖,為什么num亂跳,或者有其他矩陣鍵盤代碼?
回復

使用道具 舉報

ID:378659 發表于 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()        //帶返回值的子函數{        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,而是亂跳的數值,用led燈看過數值
回復

使用道具 舉報

ID:138119 發表于 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

評分

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

查看全部評分

回復

使用道具 舉報

ID:365802 發表于 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. }
復制代碼
回復

使用道具 舉報

ID:213173 發表于 2019-2-15 08:36 | 顯示全部樓層
//P3  4*4矩陣鍵盤,P1 LED 顯示鍵值
#include <reg52.h>
#define uint unsigned int                 //宏定義無符號整型數據
#define uchar unsigned char         //宏定義無符號字符型數據
uchar key=0;                                        //定義鍵值全局變量

void keyscan()                                        //按鍵掃描程序
{
        static bit sign=0;                        //按鍵自鎖標志
        static uint count=0;                //消抖計數變量                       
        uchar num=0;                                //臨時變量
        P3=0xf0;                                        //賦值P3 1111 0000
        if(P3!=0xf0)                                //檢測有按鍵按下
        {
                count++;                                //消抖計數
                if((count>=500)&&(sign==0))//100~1000,根據主循環周期調整約10~20ms
                {                       
                        sign=1;                                //按鍵自鎖標志置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;                                        //按鍵自鎖標志清0
                count=0;                                //消抖計數清0
        }
}
void main()                                                //主函數
{
        while(1)
        {
                keyscan();                                //按鍵掃描程序
                P1=~key;                                //LED顯示鍵碼1~16,低電平亮
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91九色在线观看 | 欧美精品一区二区免费 | 天天艹天天干天天 | 亚洲综合中文字幕在线观看 | 羞羞网站在线观看 | 91伊人网| 性欧美xxxx | 久久精品国产一区二区电影 | 欧美精品在线一区二区三区 | 日韩精品在线播放 | 天天插天天射天天干 | 成人免费大片黄在线播放 | 欧美一区成人 | 欧美在线观看一区 | 亚洲综合色丁香婷婷六月图片 | 免费黄篇 | 精品久久久久久久久久久久 | 日韩成人免费av | 97影院在线午夜 | 亚洲人成人一区二区在线观看 | 国产成人精品一区二 | 91免费电影 | 久久久久国 | 欧美 中文字幕 | 九色网址| 中文精品视频 | 狠狠干狠狠操 | 黄色在线免费看 | 九九久久国产精品 | 亚洲综合在线视频 | 色偷偷人人澡人人爽人人模 | 一区二区三区国产 | 日韩欧美亚洲 | 日本在线你懂的 | 久久久久久久久久久久久九 | 超碰导航| 欧美日韩不卡合集视频 | 欧美一区不卡 | 国产精品视频在线免费观看 | 色播av| 天天操夜夜爽 |