查看: 7034|回复: 10

跟大家分享一下自己写的扫描矩阵键盘的小程序/*tt*/

[复制链接]
  • TA的每日心情
    奋斗
    2014-11-27 16:02
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-3-23 21:35:21 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 tao475824827 于 2013-3-23 21:57 编辑

    在论坛里做了N久的伸手党了(感觉论坛里有一半的求助帖都是我发的……也感谢大家一直帮我解决着问题……感谢!)
    今天跟大家分享一下我做的一个扫描4*4矩阵的小程序。
    不会用比较高端的方式,就用的pin的IO口来做的……囧……新学,确实水平不高……

    我记得微机原理书上说过,矩阵键盘的扫描方法一般三种方法
    1、中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个案件被按下。
    2、扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。若列值中有一位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。
    3、反转法:先将所有行扫描线输出低电平,读列值。若列值有一位是低,则表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可以查表1 得到的键码。
    个人习惯,一般用反转法,可能是因为用的扫描次数最少吧。

    矩阵键盘电路图如下

    矩阵键盘电路

    矩阵键盘电路


    遇到的第一个问题就是管脚既要做输入,又要做输出,就是要选择bidirection模式,但是一直没找着这个的资料,也不怎么会用,不知道设置成什么模式比较好,给support_china@cypress.com发了邮件询问,他也给我回了,如下图

    回信

    回信

    然后我就懵了……我不知道去哪里下载工程……崩溃……论坛里有知道的可以告诉我一下,谢谢!

    于是我就自己测试,最后觉得 Resistive Pull Up/Down(上下拉)这个模式貌似能用
    直接输出高的话,我用表测是3.3v,带一个0v的,两个就都变成1.65v,识别仍然是 高。
    所以我就用这个模式做的,不知道是不是很不稳定。但是至少出结果了。

    原理图中再拉一个LCD出来做显示即可,默认设置。

    原理图

    原理图

    引脚如下

    引脚

    引脚


    程序写的比较水,大家轻拍
    #include <device.h>
    void main()
    {
       uint16 num_button=0;
      
        CYGlobalIntEnable;
        LCD_Start();
        LCD_Position(0,0);
        LCD_PrintString("num");

        for(;;)
        {
      row1_Write(1);
      row2_Write(1);
      row3_Write(1);
      row4_Write(1);
      column1_Write(0);
      column2_Write(0);
      column3_Write(0);
      column4_Write(0);
      
      if(column1_Read()||column2_Read() || column3_Read()||column4_Read())  //检测到有电平被拉高
      {
                        //   CyDelay(20);//CyDelayCycles(2000 * 48); /* 延时函数Delay 2000us(20ms) based on 48MHz clock */     
       
       
        if(column1_Read())
         {
         row1_Write(0);
         row2_Write(0);
         row3_Write(0);
         row4_Write(0);
         column1_Write(1);
         if(row1_Read()) {num_button=1;}
         if(row2_Read()) {num_button=5;}
         if(row3_Read()) {num_button=9;}
         if(row4_Read()) {num_button=13;}
         }
        if(column2_Read())
         {
         row1_Write(0);
         row2_Write(0);
         row3_Write(0);
         row4_Write(0);
         column2_Write(1);
         if(row1_Read()) {num_button=2;}
         if(row2_Read()) {num_button=6;}
         if(row3_Read()) {num_button=10;}
         if(row4_Read()) {num_button=14;}
         }
        if(column3_Read())
         {
         row1_Write(0);
         row2_Write(0);
         row3_Write(0);
         row4_Write(0);
         column3_Write(1);
         if(row1_Read()) {num_button=3;}
         if(row2_Read()) {num_button=7;}
         if(row3_Read()) {num_button=11;}
         if(row4_Read()) {num_button=15;}
         }
        if(column4_Read())
         {
         row1_Write(0);
         row2_Write(0);
         row3_Write(0);
         row4_Write(0);
         column4_Write(1);
         if(row1_Read()) {num_button=4;}
         if(row2_Read()) {num_button=8;}
         if(row3_Read()) {num_button=12;}
         if(row4_Read()) {num_button=16;}
         }     
      }
    if(num_button<10)
      {
      LCD_Position(1,0);
      LCD_PrintNumber(num_button);
      LCD_Position(1,1);
      LCD_PrintString("   "); //覆盖之前两位数的个位数
      }
    else
      {
      LCD_Position(1,0);
      LCD_PrintNumber(num_button);
      }
        }
    }

    实物图就不上了、、手机不在、、
    实现的结果就是按4*4键盘,1602上会显示出 你按下的键的编码 1~16


    build没问题
    实际program的时候,有些时候(我有时有,有时没有)会提示

    error

    error

    这个怎么解决,论坛里有人知道么?

    不过提示了也没关系,只要按一下板子的复位键就行,只能正常工作了。(囧)

    附件上传
    Design01_keyboard.rar (2.38 MB, 下载次数: 72)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-3-23 22:08:42 | 显示全部楼层
    写的不错,基础永远是最基本的……关于引脚的配置你可以专门看下引脚配置的数据手册……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-11-27 16:02
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-3-23 22:23:35 | 显示全部楼层
    kk5290122 发表于 2013-3-23 22:08
    写的不错,基础永远是最基本的……关于引脚的配置你可以专门看下引脚配置的数据手册…… ...

    pin的datasheet?好吧。。也该看一下了。。一直懒得看e文。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-8-7 21:35
  • 签到天数: 340 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-3-23 22:26:12 | 显示全部楼层
    tao475824827 发表于 2013-3-23 22:23
    pin的datasheet?好吧。。也该看一下了。。一直懒得看e文。。

    嗯,也有中文的

    Pins 1.70.pdf

    799.06 KB, 下载次数: 22

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-3-23 23:25:05 | 显示全部楼层
    呵呵,顶一顶
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-3-23 23:38:36 | 显示全部楼层
    顶一下!!!!!!!!!!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-11-27 16:02
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-3-24 08:37:17 | 显示全部楼层
    kk5290122 发表于 2013-3-23 22:26
    嗯,也有中文的

    真心好东西~打出来好好看一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-11-27 16:02
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-3-24 08:39:05 | 显示全部楼层
    ming1006 发表于 2013-3-23 23:25
    呵呵,顶一顶

    感谢版主之前一直在我的求助帖里帮我哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-11-27 16:02
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-3-24 08:39:57 | 显示全部楼层
    ┗SKY┛ 发表于 2013-3-23 23:38
    顶一下!!!!!!!!!!!!

    恩恩。。谢谢啦~ 写的小程序。。其实bug还是挺多的。。囧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-3-24 22:48:56 | 显示全部楼层
    tao475824827 发表于 2013-3-24 08:39
    感谢版主之前一直在我的求助帖里帮我哈

    不客气,应该的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-8 10:28 , Processed in 0.201469 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.