找回密码
 立即注册

QQ登录

只需一步,快速开始

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

3*3矩阵键盘如何解决另外两个端口资源的占用问题

[复制链接]
跳转到指定楼层
楼主
ID:465020 发表于 2019-3-10 18:43 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
因为要设计一个单片机3*3的矩阵按键,但又不想浪费另外两个mcu端口资源,跪求大神能帮忙想个方法。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2019-3-10 23:49 | 只看该作者
3*3不是用扫描的吗?一个X端口高电平,然后去检查Y端口的电平,没有检测到电平变化就扫描下一行,这不就可以了,另外两个还是一样的正常使用呀
回复

使用道具 举报

板凳
ID:475444 发表于 2019-3-11 06:29 | 只看该作者
你是要9个键,建议你看一下:这个http://www.51hei.com/bbs/dpj-152064-1.html

评分

参与人数 1黑币 +8 收起 理由
struct00 + 8 赞一个!

查看全部评分

回复

使用道具 举报

地板
ID:7485 发表于 2019-3-11 07:32 | 只看该作者
不影响多出的两个IO正常使用的。
回复

使用道具 举报

5#
ID:213173 发表于 2019-3-11 17:11 | 只看该作者
给你写一个3*3矩阵键盘不占用剩余IO口演示程序,有详细注释。顺序取了P3.0~3.5,按此规律可以取任意一组的任意6个IO口。

  1. #include <reg52.h>
  2. #define uint unsigned int                 //宏定义无符号整型数据
  3. #define uchar unsigned char         //宏定义无符号字符型数据

  4. uchar key=0;                                        //定义键值全局变量

  5. void keyscan()                                        //按键扫描程序
  6. {
  7.         static bit sign=0;                        //按键自锁标志
  8.         static uint count=0;                //消抖计数变量                       
  9.         uchar temp1=0,temp2=0,temp3;//临时变量
  10.         P3|=0x3f;                                        //赋值P3,保留高2位不变,操作低6位 xx11 1111 x为0或1
  11.         P3&=0xf8;                                        //赋值P3,保留高2位不变,操作低6位 xx11 1000 x为0或1
  12.         temp1=P3&0x38;                                //保存P3低6位状态到temp1
  13.         if(temp1!=0x38)                                //检测有按键按下
  14.         {
  15.                 count++;                                //消抖计数
  16.                 if((count>=250)&&(sign==0))//count100~1000,根据主循环周期调整约10~20ms
  17.                 {                       
  18.                         sign=1;                                //按键自锁标志置1
  19.                         P3|=0x3f;                        //赋值P3,保留高2位不变,操作低6位 xx11 1111 x为0或1
  20.                         P3&=0xc7;                        //赋值P3,保留高2位不变,操作低6位 xx00 0111 x为0或1
  21.                         temp2=P3&0x07;                //保存P3低6位状态到temp2
  22.                         temp3=temp2|temp1;        //保存temp2和temp1相或值
  23.                         switch(temp3)
  24.                         {
  25.                                 case 0x36: key=1; break;
  26.                                 case 0x35: key=2; break;
  27.                                 case 0x33: key=3; break;
  28.                                 case 0x2e: key=4; break;
  29.                                 case 0x2d: key=5; break;
  30.                                 case 0x2b: key=6; break;
  31.                                 case 0x1e: key=7; break;
  32.                                 case 0x1d: key=8; break;
  33.                                 case 0x1b: key=9; break;
  34.                         }
  35.                 }
  36.         }
  37.         else                                                //键抬起
  38.         {
  39.                 sign=0;                                        //按键有效标志清0
  40.                 count=0;                                //消抖计数清0
  41.         }
  42. }

  43. void main()                                                //主函数
  44. {

  45.         while(1)
  46.         {
  47.                 keyscan();                                //按键扫描程序
  48.                 P1=key;                                        //P1显示(2进制)
  49.         }
  50. }
复制代码




评分

参与人数 1黑币 +2 收起 理由
小学僧 + 2

查看全部评分

回复

使用道具 举报

6#
ID:465020 发表于 2019-3-25 12:04 | 只看该作者
wulin 发表于 2019-3-11 17:11
给你写一个3*3矩阵键盘不占用剩余IO口演示程序,有详细注释。顺序取了P3.0~3.5,按此规律可以取任意一组的 ...

感谢您的帮助,因为之前我已经解决这个问题了,所以到现在才看到这个回复,看了您的答案,使我有了新的感悟,再次感谢您的帮助。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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