找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机行列反转法实现矩阵键盘扫描的源程序+仿真

[复制链接]
跳转到指定楼层
楼主
《上次发过一次,这次程序写法不同。供大家参考参考》

//希望不要再有不懂装懂的人再说成逐行扫描,不知道就不要瞎BB   (此行为注释

*实现效果16个按键数码管对应显示0~f
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):


程序:
  1. #include <reg51.h>

  2. void delay(unsigned int i)                //延时函数
  3. {
  4.         unsigned int k;
  5.         for(k = 0; k < i; k++);
  6. }

  7. unsigned char table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};                                        //数码管显示码0~f
  8. unsigned char code key_code[] ={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};  //键盘扫描码
  9. char keyscan();                //行列反转法实现的矩阵键盘扫描函数


  10. void main()
  11. {
  12.         char i;
  13.         P0=0x00;
  14.         while(1)
  15.         {
  16.                 i=keyscan();
  17.                 if(i!=-1)                                                //当有按键被按下
  18.                 {
  19.                         P0=table[i];
  20.                         delay(10000);
  21.                 }
  22.         }
  23.         
  24. }


  25. char keyscan()
  26. {
  27.         char scan1,scan2,keycode,j,key;
  28.         key =-1;                                                                                                        //按键值初值为-1,如果没有扫描到按键,函数返回-1
  29.         P2 =0xf0;                                                                                                        //写:行为全1,列为全0
  30.         scan1 =P2;                                                                                                //读:行列值
  31.         if(scan1 !=0xf0)                                                                        //如果读入值不为0xf0,则表示有按键按下
  32.         {
  33.                 delay(1200);
  34.                 scan1 = P2;                                                                                        //再次读入
  35.                 if(scan1 != 0xf0)                                                                //再次判断是否有按键按下,去除抖动
  36.                 {
  37.                         P2 =0x0f;                                                                                        //行列反转,写:行为全0,列为全1
  38.                         scan2 =P2;                                                                                //读入行列值
  39.                         keycode = scan1 | scan2;                        //合并行列值,得到扫描码
  40.                         for(j=0;j<16;j++)                                                        //由扫描码表得到按键值
  41.                         {        
  42.                                 if(keycode ==key_code[j])
  43.                                 {key =j;
  44.                                         break;
  45.                                 }
  46.                         }
  47.                 }
  48.         }
  49.         return (key);                //返回按键值
  50. }
复制代码
全部资料51hei下载地址:
行列反转法矩阵键盘扫描.rar (83.25 KB, 下载次数: 81)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:552373 发表于 2019-6-5 08:04 | 只看该作者
仿真在哪里??里面只有c程序啊
回复

使用道具 举报

板凳
ID:555241 发表于 2019-6-5 09:31 | 只看该作者
这个怎么仿真操作啊
回复

使用道具 举报

地板
ID:555406 发表于 2019-6-5 11:04 | 只看该作者
2,4,5,9,d, 都显示不全

2.PNG (49.75 KB, 下载次数: 27)

2.PNG

4.PNG (51.51 KB, 下载次数: 25)

4.PNG

5.PNG (59.09 KB, 下载次数: 36)

5.PNG

9.PNG (49.21 KB, 下载次数: 39)

9.PNG

d.PNG (58.38 KB, 下载次数: 21)

d.PNG
回复

使用道具 举报

5#
ID:531603 发表于 2019-6-30 10:34 | 只看该作者
ywdmas 发表于 2019-6-5 11:04
2,4,5,9,d, 都显示不全

显示不全可能是单片机频率不够,或者限流电阻过大哈;再有可能就是该字符的显示码有错误哟,,可以再检查检查程序;;;我发的是没问题的哟

2.png (102.48 KB, 下载次数: 24)

2.png

4.png (102.45 KB, 下载次数: 36)

4.png

5.png (102.51 KB, 下载次数: 30)

5.png

9.png (102.42 KB, 下载次数: 23)

9.png

d.png (102.43 KB, 下载次数: 24)

d.png
回复

使用道具 举报

6#
ID:531603 发表于 2019-6-30 10:35 | 只看该作者


我发的是没有问题的哟,显示不全可能是字符码有错误,或者电阻过大引起电流不够造成的哈
回复

使用道具 举报

7#
ID:701002 发表于 2020-3-2 13:43 | 只看该作者
这个仿真用proteus7.7打不开啊
回复

使用道具 举报

8#
ID:531603 发表于 2020-3-24 13:33 | 只看该作者
huaxinfeng 发表于 2020-3-2 13:43
这个仿真用proteus7.7打不开啊

我用的是proteus8,7.7版本可能存在不兼容问题
回复

使用道具 举报

9#
ID:771701 发表于 2020-6-8 18:11 | 只看该作者
{        
                                if(keycode ==key_code[j])
                                {key =j;
请问这三步是什么意思?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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