请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册

扫一扫,访问微社区

搜索
查看: 671|回复: 9

新人求助,矩阵键盘的内容

[复制链接]

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2019-8-2 16:27:15 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int

u8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 code xx[]={0x7f/*0111 1111*/,0xbf/*1011 1111*/,0xdf/*1101 1111*/,0xef/*1110 1111*/};
u8 hang,xian;

sbit Lock1 = P2^4;
sbit Lock2 = P2^3;
sbit Lock3 = P2^2;
sbit a = P1^3;
sbit b = P1^2;
sbit c = P1^1;
sbit d = P1^0;

void main()
{
  Lock1 = 0;
  Lock2 = 0;
  Lock3 = 0;
  while(1)
  {
    for(hang=0;hang<2;hang++)
    {
      P1 = xx[hang];
          if(a==0)
            xian = table[4*hang+1];
          else if(b==0)
        xian = table[4*hang+2];
      else if(c==0)
            xian = table[4*hang+3];
          else if(d==0)
            xian = table[4*hang+4];
          else
            xian = table[0];
    }
    P0 = xian;
  }
}



我想通过按矩阵键盘上前八个键让数码管输出1~8,可是不知道为什么第一行按键按了没反应,第二行是正常的


回复

使用道具 举报

0

主题

6

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2019-8-2 19:07:09 | 显示全部楼层
sbit Lock1 = P2^4;
sbit Lock2 = P2^3;
sbit Lock3 = P2^2;
这才三个啊,共3*4=12个键,你是不是少定义了一个
回复 支持 反对

使用道具 举报

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 2019-8-3 11:37:40 | 显示全部楼层
rebios 发表于 2019-8-2 19:07
sbit Lock1 = P2^4;
sbit Lock2 = P2^3;
sbit Lock3 = P2^2;

这三个管脚是控制哪个数码管开启的,少定义什么了?
回复 支持 反对

使用道具 举报

3

主题

27

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2019-8-4 20:41:52 | 显示全部楼层
你为什么要整这么复杂呢?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 2019-8-6 10:37:41 | 显示全部楼层
UFO007 发表于 2019-8-4 20:41
你为什么要整这么复杂呢?

那你弄一个简单的逐行扫描的,发到这里让我看看
回复 支持 反对

使用道具 举报

0

主题

62

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
发表于 2019-8-6 14:29:59 | 显示全部楼层
uchar keyscan()
{
    uchar key=99;
    KEY_IO=0x0f;
    if(KEY_IO!=0x0f)                     //读取按键是否按下
    {
        delay(1000);                     //延时消抖
        if(KEY_IO!=0x0f)                 //再次检测键盘是否按下
        {       
            //测试列
            KEY_IO=0x0f;
            switch(KEY_IO)
            {
                 case(0x07):key=0;break;
                 case(0x0b):key=1;break;
                 case(0x0d):key=2;break;
                 case(0x0e):key=3;break;
            }
            //测试行
            KEY_IO=0xf0;
            switch(KEY_IO)
            {
                case(0x70):key=key;break;
                case(0xb0):key=key+4;break;
                case(0xd0):key=key+8;break;
                case(0xe0):key=key+12;break;
            }
            while(KEY_IO!=0xf0);          //检测按键松手检测
        }
    }
    return key;
}

普中有标准的4x4矩阵按键例程,为何不好好看看呢...
上面的按键扫描就是读取4x4按键的键值,若有按键按下就会返回0到15的键值,若没有按键则键值是99,你可以在主循环中调用然后再进行键值处理,比如1<=键值<=8时就显示到数码管,也可以直接在此函数的尾部直接添加键值处理的操作。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 2019-8-6 22:37:08 | 显示全部楼层
神奇 发表于 2019-8-6 14:29
uchar keyscan()
{
    uchar key=99;

普中科技ppt里讲键盘扫描有两个方法,一个是逐行扫描,一个就是你写的行列扫描,我写的是逐行扫描的代码,你看也不看我的代码,就复制了视频里的行列扫描的代码给我。我的问题是为什么我写的逐行扫描不对,而不是复制一个别人的看看就好
回复 支持 反对

使用道具 举报

4

主题

176

帖子

536

积分

高级会员

Rank: 4

积分
536
发表于 2019-8-7 12:01:46 | 显示全部楼层
我这边试了一下确实是不行,但是按照你的思路换了一个写法是可以实现的, 不知道是不是因为原来那样单独判断io口行不通。发出来给你参考一下
  1. void main()
  2. {
  3.         Lock1 = 0;
  4.           Lock2 = 0;
  5.           Lock3 = 0;
  6.         P0 = table[0];
  7.         while(1)
  8.         {
  9.                 //第1行
  10.                 P1 =0x7f;
  11.                 if(P1==0X77)
  12.                 {
  13.                         delay(1000);
  14.                         if(P1==0X77)
  15.                         {
  16.                                 P0 = table[1];
  17.                         }
  18.                 }
  19.                 else if(P1==0X7b)
  20.                 {
  21.                         delay(1000);
  22.                         if(P1==0X7b)
  23.                         {
  24.                                 P0 = table[2];
  25.                         }
  26.                 }
  27.                 else if(P1==0X7d)
  28.                 {
  29.                         delay(1000);
  30.                         if(P1==0X7d)
  31.                         {
  32.                                 P0 = table[3];
  33.                         }
  34.                 }
  35.                 else if(P1==0X7e)
  36.                 {
  37.                         delay(1000);
  38.                         if(P1==0X7e)
  39.                         {
  40.                                 P0 = table[4];
  41.                         }
  42.                 }


  43.                 //第2行
  44.                 P1 =0xbf;
  45.                 if(P1==0Xb7)
  46.                 {
  47.                         delay(1000);
  48.                         if(P1==0Xb7)
  49.                         {
  50.                                 P0 = table[5];
  51.                         }
  52.                 }
  53.                 else if(P1==0Xbb)
  54.                 {
  55.                         delay(1000);
  56.                         if(P1==0Xbb)
  57.                         {
  58.                                 P0 = table[6];
  59.                         }
  60.                 }
  61.                 else if(P1==0Xbd)
  62.                 {
  63.                         delay(1000);
  64.                         if(P1==0Xbd)
  65.                         {
  66.                                 P0 = table[7];
  67.                         }
  68.                 }
  69.                 else if(P1==0Xbe)
  70.                 {
  71.                         delay(1000);
  72.                         if(P1==0Xbe)
  73.                         {
  74.                                 P0 = table[8];
  75.                         }
  76.                 }
  77.                
  78.         }       
  79. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 2019-8-7 13:02:12 | 显示全部楼层
YXUN 发表于 2019-8-7 12:01
我这边试了一下确实是不行,但是按照你的思路换了一个写法是可以实现的, 不知道是不是因为原来那样单独判 ...

谢谢,我找到问题所在了,我把else xian=table[0];这两行代码删掉程序就正确了,但还是不知道为什么这两行代码导致程序错误
回复 支持 反对

使用道具 举报

0

主题

62

帖子

215

积分

中级会员

Rank: 3Rank: 3

积分
215
发表于 2019-8-8 22:56:18 | 显示全部楼层
x10318041014 发表于 2019-8-6 22:37
普中科技ppt里讲键盘扫描有两个方法,一个是逐行扫描,一个就是你写的行列扫描,我写的是逐行扫描的代码 ...

然而那代码是我自己写的,你看都不看就说是复制来的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|51开发板专区 STM32开发板专区 PLC工控专区 PLC学习机专区 ( 粤ICP备18101765号 )

GMT+8, 2019-9-22 06:18 , Processed in 0.155233 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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