找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1933|回复: 11
打印 上一主题 下一主题
收起左侧

我学写的MCU矩阵键盘看不出来有什么问题?

[复制链接]
回帖奖励 80 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次(中奖概率 80%)
跳转到指定楼层
楼主
我是将按键的值通过数码管显示,第1,2,3,4个按键按下去正常,

其他按键按下去的分布如下所示(这个是我现在的问题):
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
有没有大佬解答一下。
我希望的正确结果是:
1  5  9   13
2  6  10 14
3  7  11 15
4  8  13 16

1.jpg (130.25 KB, 下载次数: 29)

1.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-3-29 01:25 | 只看该作者
对于计算机来说,1也罢、2也罢、它都一样处理。何必介意键值是多少呢?随便是什么都可以。
要点是:对于你的硬件布置方便,排好后可以以序给键命名。程序要做的事:将你对键的命名与键值做个关联!
回复

使用道具 举报

板凳
ID:123289 发表于 2019-3-29 01:32 | 只看该作者
例如:电脑用的键盘,它有100多个键,拆开看一下,它的连线总是电适合硬件位置的走线方便。
其实对于“A"这个键,不同的厂家它的硬件键值会因走线不同而不同,但键盘上的CPU会把它翻译成“A”的ASCII码送出去,这样无论是哪个厂家的键,就都可以通用了。
回复

使用道具 举报

地板
ID:416287 发表于 2019-3-29 07:53 | 只看该作者
你看哈    void  display(void)  { char a=0;    PGIO_KEY=0X0F;     if(PGIO_KEY!=0x0f)         {delay(1000);          if(PGIO_KEY!=0x0f)          {   PGIO_KEY=0X0F;                     switch(PGIO_KEY)                    { case(0x07): Keyvalue=0;break;                    case(0x0b): Keyvalue=1;break;                    case(0x0d): Keyvalue=2;break;                   case(0x0e): Keyvalue=3;break;                   }                  PGIO_KEY=0xf0;                   switch(PGIO_KEY)                   { case(0x70): Keyvalue=Keyvalue;break;                     case(0xb0): Keyvalue=Keyvalue+4;break;                     case(0xd0): Keyvalue=Keyvalue+8;break;                    case(0xe0): Keyvalue=Keyvalue+12;break;               }              while((a<50)&&(PGIO_KEY!=0xF0))                   delay(1000);                   a++;              }         }           }  
回复

使用道具 举报

5#
ID:96131 发表于 2019-3-29 08:35 | 只看该作者
第三列最后一行13应为12
回复

使用道具 举报

6#
ID:213173 发表于 2019-3-29 08:43 | 只看该作者

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit digital_1=P2^0;
  5. sbit digital_2=P2^1;
  6. uchar  code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. uchar KeyValue=0;                                //键值变量
  8. bit sign_1=0,sign_2=0;                        //位变量
  9. uint count_1=0,count_2=0;                //计数变量                       

  10. void keyscan()                                        //按键扫描程序
  11. {
  12.         P3=0xf0;                                        //赋值P3 1111 0000
  13.         if(P3!=0xf0)                                //检测有按键按下
  14.         {
  15.                 if((++count_1>=250)&&(sign_1==0))//消抖计数100~1000,判断按键自锁
  16.                 {                       
  17.                         sign_1=1;                        //按键自锁标志置1
  18.                         switch(P3)
  19.                         {
  20.                                 case(0Xe0):KeyValue=0;break;
  21.                                 case(0Xd0):KeyValue=1;break;
  22.                                 case(0Xb0):KeyValue=2;break;
  23.                                 case(0X70):KeyValue=3;break;
  24.                         }
  25.                         P3=0x0f;                        //赋值P3 0000 1111
  26.                         switch(P3)
  27.                         {
  28.                                 case(0X0e):KeyValue+= 1;break;
  29.                                 case(0X0d):KeyValue+= 5;break;
  30.                                 case(0X0b):KeyValue+= 9;break;
  31.                                 case(0X07):KeyValue+=13;break;
  32.                         }
  33.                 }
  34.         }
  35.         else                                                //键抬起
  36.         {
  37.                 sign_1=0;                                //按键自锁标志清0
  38.                 count_1=0;                                //消抖计数清0
  39.         }
  40. }

  41. void display()                                        //数码管显示程序
  42. {
  43.         if(++count_2>=100)                        //延时计数
  44.         {
  45.                 count_2=0;
  46.                 P0=0x00;                                //消隐
  47.                 if(sign_2==0)
  48.                 {
  49.                         P0=table[KeyValue/10];//显示十位段码
  50.                         digital_1=0;
  51.                         digital_2=1;
  52.                         sign_2=1;
  53.                 }
  54.                 else
  55.                 {
  56.                         P0=table[KeyValue%10];//显示个位段码
  57.                         digital_1=1;
  58.                         digital_2=0;
  59.                         sign_2=0;
  60.                 }
  61.         }
  62. }

  63. void main()                                                //主函数
  64. {
  65.         while(1)
  66.         {
  67.                 keyscan();                                //按键扫描程序
  68.                 display();                                //数码管显示键值1~16
  69.         }
  70. }
复制代码



回复

使用道具 举报

7#
ID:158375 发表于 2019-3-29 08:45 | 只看该作者
你读到的按键或显示的按键值不对;
这个要看程序。有程序,一定会有人帮你的。
回复

使用道具 举报

8#
ID:365802 发表于 2019-3-29 09:48 | 只看该作者
不应该直接返回你要的值, 推荐是由扫描码返回目标码.
回复

使用道具 举报

9#
ID:282850 发表于 2019-3-29 09:52 | 只看该作者
程序逻辑清晰,应该是“线与”功能出问题。你在列扫描时加个default 并+值,看一下是否一直是进default 。
回复

使用道具 举报

10#
ID:160500 发表于 2019-3-29 11:30 | 只看该作者
你这个程序不对,仔细检查一下吧
回复

使用道具 举报

11#
ID:337069 发表于 2019-3-29 13:27 | 只看该作者
P0高四位没加上拉电阻,不能输出0xf0
回复

使用道具 举报

12#
ID:244223 发表于 2019-3-30 16:26 | 只看该作者
结贴了,关键问题是图上那个延时,在第一次发的图上加也行

2.png (25.67 KB, 下载次数: 20)

2.png
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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