找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3507|回复: 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 单片机教程网

快速回复 返回顶部 返回列表