10回答

0收藏

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

英飞凌 英飞凌 9115 人阅读 | 10 人回复 | 2013-03-23

本帖最后由 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的时候,有些时候(我有时有,有时没有)会提示

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

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

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


好了,说完了。。。
感觉我这个帖子又在不停的问问题……呵呵,分享一下,问了一些问题,确实还没解决,有知道的一定要告诉我一下,谢谢!
分享到:
回复

使用道具 举报

回答|共 10 个

倒序浏览

沙发

kk5290122

发表于 2013-3-23 22:08:42 | 只看该作者

写的不错,基础永远是最基本的……关于引脚的配置你可以专门看下引脚配置的数据手册……
板凳

tao475824827

发表于 2013-3-23 22:23:35 | 只看该作者

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

pin的datasheet?好吧。。也该看一下了。。一直懒得看e文。。
地板

kk5290122

发表于 2013-3-23 22:26:12 | 只看该作者

tao475824827 发表于 2013-3-23 22:23
pin的datasheet?好吧。。也该看一下了。。一直懒得看e文。。

嗯,也有中文的

Pins 1.70.pdf

799.06 KB, 下载次数: 22

5#

ming1006

发表于 2013-3-23 23:25:05 | 只看该作者

呵呵,顶一顶
6#

┗SKY┛

发表于 2013-3-23 23:38:36 | 只看该作者

顶一下!!!!!!!!!!!!
7#

tao475824827

发表于 2013-3-24 08:37:17 | 只看该作者

kk5290122 发表于 2013-3-23 22:26
嗯,也有中文的

真心好东西~打出来好好看一下
8#

tao475824827

发表于 2013-3-24 08:39:05 | 只看该作者

ming1006 发表于 2013-3-23 23:25
呵呵,顶一顶

感谢版主之前一直在我的求助帖里帮我哈
9#

tao475824827

发表于 2013-3-24 08:39:57 | 只看该作者

┗SKY┛ 发表于 2013-3-23 23:38
顶一下!!!!!!!!!!!!

恩恩。。谢谢啦~ 写的小程序。。其实bug还是挺多的。。囧
10#

ming1006

发表于 2013-3-24 22:48:56 | 只看该作者

tao475824827 发表于 2013-3-24 08:39
感谢版主之前一直在我的求助帖里帮我哈

不客气,应该的
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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