嵌入式--键盘扫描

2019-07-14 01:09发布

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