l
实验内容:
通过直接修改内存在终端显示按的不同键,只能知道是哪一行的按键,通过程序来扫描出具体是哪一个按键。
l
实验步骤:
1)环境搭建。
硬件环境:插上仿真器电源,打开实验台电源。注意:电源打开后禁止拔下JTAG接口线!
软件环境:打开multi-ICE,加载该软件安装目录下文件名带有920T的.cfg文。打开CodeWarrior加入工程文件(后缀名为.mcp)。修改CodeWarrior中程序地址。
其他步骤见一中所述。
2)实验相关知识:
键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。
本实验中用到了GPF1、GPF2、GPF3、GPF7作为输入端,GPB7、GPB8、GPB9、GPB10作为输出端。所以相应的端口需要设置成相应输入/输出模式。
3)通过JTAG接口直接修改内存:
键盘实验用到的端口寄存器:(GPB10,9,8,7)和(GPF1,2,3,7)
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中按上面配置好GPBCON,GPBDAT,GPFCON寄存器,配置方法见上面第三个实验。按下一个任意的按键,手不要松开,单步执行一下程序,看Memory中GPFDAT的内容改变。
4)在程序中实现键盘扫描
首先对GPB和GPF端口进行设置,使之处在输入/输出状态。然后向输出端(GPB7、GPB8、GPB9、GPB10)输出全低电平,直到有按键动作发生。判断出行数。然后开始扫描,逐个向输出端口发出高电平,并判断,直到找到对应的列为止,最后在超级终端上显示出来。
要测试某一位是否为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接口直接修改内存来控制硬件,体会键盘扫描的工作原理。