现在的位置: 首页 > 综合 > 正文

嵌入式–键盘扫描

2013年08月26日 ⁄ 综合 ⁄ 共 3664字 ⁄ 字号 评论关闭

 

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;   //pf1237
input

   
 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接口直接修改内存来控制硬件,体会键盘扫描的工作原理。

 

抱歉!评论已关闭.