找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2465|回复: 2
收起左侧

单片机矩阵键盘扫描仿真加源代码

[复制链接]
ID:210524 发表于 2017-6-12 17:25 | 显示全部楼层 |阅读模式
键盘扫描仿真原理图如下(proteus的仿真工程文件可以到附件中下载):

0.png 0.png


51单片机源代码如下:
  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int   
  5. #define out P2
  6. #define outk P1
  7. #define N 3

  8. void delayms(uint);
  9. uchar scan(void);

  10. void main(void)
  11. {
  12.         uchar key,i;
  13.         while(1)
  14.         {
  15.                 key=scan();
  16.                 if(key!=0xff) {
  17.                 switch(key) {
  18.                 case 0:
  19.                 for(i=0;i<N;i++) {out=0xfe; delayms(100);
  20.                 out=0xff; delayms(100);
  21.                 } break;
  22.                 case 1: for(i=0;i<N;i++) {out=0xfd; delayms(100);
  23.                 out=0xff; delayms(100);
  24.                 } break;
  25.                 case 2: for(i=0;i<N;i++) {out=0xfb; delayms(100); out=0xff; delayms(100);
  26.                 }break;
  27.                 case 3: for(i=0;i<N;i++) {out=0xf7; delayms(100);out=0xff; delayms(100);
  28.                 } break;
  29.                 case 4: for(i=0;i<N;i++) {out=0xef; delayms(100);out=0xff; delayms(100);
  30.                 } break;
  31.                 case 5: for(i=0;i<N;i++) {out=0xdf; delayms(100); out=0xff; delayms(100);
  32.                 }break;
  33.                 case 6: for(i=0;i<N;i++) {out=0xbf; delayms(100);out=0xff; delayms(100);
  34.                 } break;
  35.                 case 7: for(i=0;i<N;i++) {out=0x7f; delayms(100);out=0xff; delayms(100);
  36.                 } break;
  37.                 case 8: for(i=0;i<N;i++) {out=0xfc; delayms(100);out=0xff; delayms(100);
  38.                 } break;
  39.                 case 9: for(i=0;i<N;i++) {out=0xf3; delayms(100);out=0xff; delayms(100);
  40.                 } break;
  41.                 case 10: for(i=0;i<N;i++) {out=0xcf; delayms(100);out=0xff; delayms(100);
  42.                 } break;
  43.                 case 11: for(i=0;i<N;i++) {out=0x3f; delayms(100); out=0xff; delayms(100);
  44.                 }break;
  45.                 case 12:
  46.                 for(i=0;i<N;i++) {out=0x00; delayms(100);
  47.                 out=0xff; delayms(100);
  48.                 } break;
  49.                 case 13: for(i=0;i<N;i++) {out=0xf8; delayms(100); out=0xff; delayms(100);
  50.                 }break;
  51.                 case 14: for(i=0;i<N;i++) {out=0xf0; delayms(100); out=0xff; delayms(100);
  52.                 }break;
  53.                 case 15: for(i=0;i<N;i++) {out=0x0f; delayms(100);out=0xff; delayms(100);
  54.                 } break;

  55.                 }}
  56.         }
  57. }
  58. // 延迟
  59. void delayms(uint j)
  60. {
  61.         uchar i;
  62.         for(;j>0;j--)
  63.         {
  64.                 i=250;
  65.                 while(--i);
  66.                 i=249;
  67.                 while(--i);
  68.            }
  69. }

  70. //键盘扫描函数
  71. //行线为0 扫描列
  72. uchar scan(void)                                          
  73. {

  74.         uchar k=16,m,n,in,a;
  75.         outk=0x0f;                //行线为0 扫描列
  76.         a=outk&0x0f;        //读入列线值
  77.         if(a!=0x0f)                //检测有无键按下
  78.         {
  79.         delayms(100);        //去抖
  80.         }
  81.         if(a!=0x0f) {        //检测有无键按下
  82.       for(m=0;m<4;m++)      //m为列号
  83.                 {
  84.                         outk=~(0x10<<m); //按位左移

  85.                         for(n=0;n<4;n++)
  86.                         {
  87.                                 in=outk;
  88.                                 in=in>>n; //按位右移
  89.                                 if((in&0x01)==0)
  90.                                 {
  91.                                         delayms(10);
  92.                                         if((in&0x01)==0){k=4*n+m;break;}
  93.                                 }
  94.                         }
  95.                         if(k!=16){break;}
  96.                 }
  97.         }
  98.         return(k);
  99. }

  100.         /*
  101. // 列线为0 扫描行
  102.         uchar k=16,m,n,in,a;
  103.         outk=0xf0;                //列线为0 扫描行
  104.         a=outk&0xf0;        //读入行线值
  105.         if(a!=0xf0)                //检测有无键按下
  106.         {
  107.         delayms(100);        //去抖
  108.         }
  109.         if(a!=0xf0) {        //检测有无键按下
  110.                 for(m=0;m<4;m++)      //m为行号
  111.                 {
  112.                         outk=~(0x01<<m); //按位左移

  113. ……………………

  114. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
键盘扫描.zip (44.67 KB, 下载次数: 20)

评分

参与人数 1黑币 +5 收起 理由
vktpas + 5

查看全部评分

回复

使用道具 举报

ID:399872 发表于 2018-9-19 10:37 | 显示全部楼层
楼主分享的很有用,
回复

使用道具 举报

ID:400024 发表于 2018-9-19 15:24 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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