嵌入式--键盘扫描

 

l         实验内容:

通过直接修改内存在终端显示按的不同键,只能知道是哪一行的按键,通过程序来扫描出具体是哪一个按键。

l         实验步骤:

1)环境搭建。

硬件环境:插上仿真器电源,打开实验台电源。注意:电源打开后禁止拔下JTAG接口线!

软件环境:打开multi-ICE,加载该软件安装目录下文件名带有920T.cfg文。打开CodeWarrior加入工程文件(后缀名为.mcp)。修改CodeWarrior中程序地址。

其他步骤见一中所述。

2)实验相关知识:

键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。

本实验中用到了GPF1GPF2GPF3GPF7作为输入端,GPB7GPB8GPB9GPB10作为输出端。所以相应的端口需要设置成相应输入/输出模式。

3)通过JTAG接口直接修改内存:

键盘实验用到的端口寄存器:(GPB10987)和(GPF1237

GPBCON(地址0X56000010

GPBDAT(地址0X56000014

GPFCON(地址0X56000050

GPFDAT(地址0X56000054

                              GPBCON = 0x154555        01 01 01 01 00 01 01 01 01 01 01

                      GPBDAT =0X7F           0  0   0   0   1   1   1   1   1   1   1

                              GPFCON=0X1502          00 01 01 01 00 00 00 10

                      查看GPFDAT的值,其中查看和修改方法见上面第三个实验,。

  实验方法:配置好AXD,任意加载一个镜像文件,在Memory中按上面配置好GPBCONGPBDATGPFCON寄存器,配置方法见上面第三个实验。按下一个任意的按键,手不要松开,单步执行一下程序,看MemoryGPFDAT的内容改变。

4)在程序中实现键盘扫描

首先对GPBGPF端口进行设置,使之处在输入/输出状态。然后向输出端(GPB7GPB8GPB9GPB10)输出全低电平,直到有按键动作发生。判断出行数。然后开始扫描,逐个向输出端口发出高电平,并判断,直到找到对应的列为止,最后在超级终端上显示出来。

要测试某一位是否为1,可以把这位与0相或,看结果是否为1;要测试某一位是否为0,可以把这位与1相与,看结果是否为0

                                   程序说明:

#include "2410addr.h"

//-----------------------------------------------------------------

// 函数定义区

//-----------------------------------------------------------------

/*****************************************************************

*  函数名   : Key_Test

*  功能      : 实现键盘扫描

*   参数    : void

*   返回值  : void

******************************************************************/

void Key_Test(void)

{   

     int i,j;//i表示行数j表示列数

     

     Uart_Printf("/n/nPRESS ANY KEY ON ECPEND BOARD/n");

配置端口

     rGPFCON=rGPFCON&0x3f03;   //pf1237input

     rGPBCON=rGPBCON|0x154000;

     rGPBCON=rGPBCON&0x157fff;

     Uart_Printf("/n/nPRESS ANY KEY OF PC TO STOP./n");

      while(!Uart_GetKey())//按电脑键盘上的任意键停止扫描

     {

      rGPBDAT=rGPBDAT&0x7f;

      if(~(rGPFDAT|0xffffff71))//如果有键按下

      {

         {

         switch(~(rGPFDAT|0xffffff71))//由哪一位取到1判断是第几行

         {

         case 0x2 :{i=1;break;}

           case 0x4 :{i=2;break;}

           case 0x8 :{i=3;break;}

           case 0x80:{i=4;break;}

           }

         }

         //开始扫描各列

         //GPBDAT [10,9,8,7] = 0001 扫描第1

           rGPBDAT=rGPBDAT|0x80;

         rGPBDAT=rGPBDAT&0x6ff;

         rGPBDAT=rGPBDAT&0x5ff; 

         rGPBDAT=rGPBDAT&0x3ff;

            if(!(~(rGPFDAT|0xffffff71))){j=1;}//判断是否第1

                  else

                   { 

                   //GPBDAT [10,9,8,7] = 0010 扫描第2

                   rGPBDAT=rGPBDAT&0x77f;

                rGPBDAT=rGPBDAT|0x100;

                rGPBDAT=rGPBDAT&0x5ff;

                rGPBDAT=rGPBDAT&0x3ff;

                if(!(~(rGPFDAT|0xffffff71))){j=2;}//判断是否第2

                          else

                               {

                                //GPBDAT [10,9,8,7] = 0100 扫描第3

                                rGPBDAT=rGPBDAT&0x77f;

                     rGPBDAT=rGPBDAT&0x6ff;

                     rGPBDAT=rGPBDAT|0x200;

                     rGPBDAT=rGPBDAT&0x3ff;

                       if(!(~(rGPFDAT|0xffffff71))){j=3;}//判断是否第3

                                   else

                                     {j=4;//以上条件不符合则为第4

                                     //下面代码仅保证对应的LED

                                     //GPBDAT [10,9,8,7] = 1000 扫描第4

                                     rGPBDAT=rGPBDAT&0x77f;

                        rGPBDAT=rGPBDAT&0x6ff;

                        rGPBDAT=rGPBDAT&0x5ff;

                        rGPBDAT=rGPBDAT|0x400;

                                     }

                             }

                        }

                   Uart_Printf("THE KEY YOU PUSH IS %d row %d column/n",i,j);}//打印结果

                   Delay(1);//延迟以消除抖动

         }

    Uart_Printf("/n/nTEST FINISHED!!");

}

l         实验体会:

通过键盘实验,体会利用JTAG接口直接修改内存来控制硬件,体会键盘扫描的工作原理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值