




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三 基于ARM9 2440linux系统的按键控制一、实验内容 (1)学习按键驱动原理,了解ARM实验箱上如何控制键盘的输入 (2)设计程序在ARM实验箱上能够正确读出被按的键位。 (3)优化按键的部分源程序,能准确写出按照自己的要求设计的按键输入代码,掌握通过CPU的I/O扩展键盘的方法。 (4)将写出的代码载入到ARM实验箱上,验证所写的按键程序是否正确。二、实验目的(1) 熟悉Linux操作系统。(2) 熟悉嵌入式系统Ubuntu的开发环境和流程,熟练掌握常用的指令。(3) 掌握按键程序的设计思路,并根据提供的源代码将其简化,编程实现键盘的驱动,通过按键可以在超级终端上显示相应的键值
2、。三、实验设备及工具 硬件:ARM9 S3C2440实验箱、PC(CPU:Intel i3,内存:4GB以上)、交叉网线、串口线 软件:VMWare10.0.2、ubuntu14.04.1、Secure CRT四、实验原理矩阵键盘又称为行列式键盘,它是用4条I/O线做为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4*4个(如图1),这种行列式键盘结构能够有效的提高嵌入式系统MCU的I/O的利用率(如果采用直连式的键盘,16个按键需要16个I/O口,此举节省了8个I/O口)。S3C2440上key4×4的硬件电路引脚如图: 图
3、1:S3C2440上key4×4的硬件电路引脚根据图1找到相应的输入输出接口,通过ARM的rPDATC(低四位)和EINT4567四个中断口扩展4×4的键盘,编程实现键盘的驱动,通过按键可以在超级终端上显示相应的键值。在初始化阶段,所有的行(输出端口)被强行设置为低电平。在没有任何键按下时,所有的列(输入端口)将读到高电平。任何键的闭合将造成其中的一列变为低电平,因此只需再确定是哪一行即可定位被按键的位置。在所有的行中,保持一行为低,其余为高,循环所有行,此时能使列仍然输出低的行即为按键的行号。实验板行扫描线分别连接与PX270的KP_MKOUT0、KP_MKOUT1、KP
4、_MKOUT2、KP_MKOUT6端口相连,列扫描线分别与PX270的KP_MKIN0、KP_MKIN1、KP_MKIN2、KP_MKIN5端口相连。图2PX270支持最大8根行扫描线,8根列扫描线总计64个按键的矩阵键盘,通过对键盘控制寄存器KPC的操作,我们可以自由的定制键盘的扫描工作方式,行扫描线,列扫描线的个数。现在对矩阵键盘驱动中要使用的KPC寄存器主要控制位进行简要的说明(如图3)。图3BIT11:MIE: 矩阵键盘中断使能 1:矩阵键盘中断 0:矩阵键盘不中断BIT12:ME: 矩阵键盘工作模式使能 1:矩阵键盘工作 0:矩阵键盘不工作BIT13BIT20:MS0MS7:行扫描线
5、使能 1:对应的行扫描线工作 0:对应的行扫描线不工作BIT23BIT25:MKCN:行扫描线个数统计 000: 0个 111:7个BIT26BIT28:MKRN:列扫描线个数统计 000: 0个 111:7个BIT29:ASACT:激活矩阵扫描自动扫描过程 1:激活 0:不激活BIT30:AS:矩阵扫描工作模式选择 1:自动扫描 0:手动扫描设置好KPC之后,就可以调用PX270的键盘扫描功能模块进行键值的扫描。现在就实验板实际连接的电路对扫描的键值加以说明。实验板的16键矩阵键盘的行扫描线是KP_MKOUT0、KP_MKOUT1、KP_MKOUT2、KP_MKOUT6,列扫描线是KP_MK
6、IN0、KP_MKIN1、KP_MKIN2、KP_MKIN5,其对应PX270内置的列扫描线位于第0、1、2、6列,对应的行扫描线为0、1、2、5行。以按下16键矩阵键盘的第4行,第4列的按键为例,根据前面对矩阵键盘工作原理的分析可以知道,其对应的键值应该是PX270第6列,第5行所对应的键值。故实验板上16键矩阵键盘的键值如下表所示:第列第一列第二列第六列第行0x00(0,0)0x01(0,1)0x02(0,2)0x06(0,6)第一行0x10(1,0)0x11(1,1)0x12(1,2)0x16(1,6)第二行0x20(2,0)0x21(2,1)0x22(2,2)0x26(2,6)第五行0
7、x50(5,0)0x51(5,1)0x52(5,2)0x56(5,6)表1键盘控制过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。某一时刻按下多个键(意外地或者故意地)的情况被称为转滚。能够正确识别一个新键被按下(即使n-1个键已经被按下)的任何算法被称为具有n键转滚的能力。本章提出的矩阵键盘系统设计,在这种系统中用户输入可能发生相继按键。这些系统通常不需要具有像终端或者计算机系统上的键盘的全部特征那
8、样的键盘。5、 实验步骤1. 先对老师给的程序进行编译,先把源代码拷贝在虚拟机并共享目录VM_share下,然后用cd命令逐层进入源代码所在目录,如图所示,在led文件夹下,有bsp.c、main.c、以及他们的头文件,除此之外还有makefile文件和以前编译生成的可执行文件等等。修改main.c里的头文件把第一行的改为:从错误中发现makefile环境变量和我们之前配置的不一样,所以我们还要修改makefile文件重新配置CROSS_COMPILE,把第二行注释掉改为如下行:完成后并保存。2.输入cd命令进入所在key4×4路径之后,首先执行make clean命令清除以前mak
9、e产生的文件 ,运行效果如下:产生的两个.o文件、makefile.bak、led的可执行文件都被清除了。3.使用make命令进行编译4 编译成功后,把生成的key_4x4文件用U盘拷贝到串口终端上使用./命令执行。5.修改按键程序:在key_4x4平行的目录中新建yoyokey文件夹,将新建的.c文件放在该文件夹中,之后编写需要的.h文件,这是前者需要的头文件,同样把.h文件放在yoyokey文件夹中最后把上面的makefile文件直接拷贝到这个文件夹里6. 修改完成后,执行cd命令进入led_test文件夹使用make命令进行编译7. 编译成功之后,把生成的key4x4文件拷贝到U盘在串口
10、终端上使用./命令执行,当按键按下时运行效果如下:6、 实验小结 通过本次课的学习,让我更熟悉了Linux操作系统的使用,熟悉了嵌入式系统Ubuntu的开发环境和流程以及常用的指令。掌握了键盘驱动的原理和ARM9 S3C2440开发板的通用I/O接口以及他们的工作原理,加深了对基于linux的ARM开发的基本流程的学习。附录#include <stdio.h>#include <sys/mman.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#includ
11、e <math.h>#include <errno.h>unsigned int *PIOB_BaseVirt;/* 端口PORTB虚拟基地址 0x56000040 */unsigned int *PIOE_BaseVirt;/* 端口PORTE虚拟基地址 0x56000040 */unsigned int *PIOF_BaseVirt;/* 端口PORTF虚拟基地址0x56000050 */unsigned int *PIOG_BaseVirt;/* 端口PORTG虚拟基地址0x56000060 */unsigned int *PIOJ_BaseVirt;/* 端口P
12、ORTJ虚拟基地址0x560000d0 */unsigned int *ADC_BaseVirt;/* 端口ADC控制器的虚拟基地址0x560000d0 */#define S3C2440_GPXCON_OFFSET 0x0#define S3C2440_GPXDAT_OFFSET 0x4#define S3C2440_GPXUP_OFFSET 0x8#define S3C2440_PIO_PJ7 S3C2440_BASE_PIOJ,(unsigned int) 1 << 7) / Pin Controlled by PC7#define S3C2440_PIO_PJ5 S3C24
13、40_BASE_PIOJ,(unsigned int) 1 << 5) / Pin Controlled by PC5#define S3C2440_BASE_PIOJ (unsigned int)PIOJ_BaseVirt)#define S3C2440_PIO_PJ0 S3C2440_BASE_PIOJ,(unsigned int) 1 << 0) / Pin Controlled by PC0#define S3C2440_PIO_PJ10 S3C2440_BASE_PIOJ,(unsigned int) 1 << 10) / Pin Controll
14、ed by PC10#define S3C2440_PIO_PJ8 S3C2440_BASE_PIOJ,(unsigned int) 1 << 8) / Pin Controlled by PC8#define S3C2440_PIO_PJ12 S3C2440_BASE_PIOJ,(unsigned int) 1 << 12) / Pin Controlled by PC12#define S3C2440_PIO_PJ1 S3C2440_BASE_PIOJ,(unsigned int) 1 << 1) / Pin Controlled by PC1#defi
15、ne S3C2440_PIO_PJ2 S3C2440_BASE_PIOJ,(unsigned int) 1 << 2) / Pin Controlled by PC2#define S3C2440_PIO_PJ4 S3C2440_BASE_PIOJ,(unsigned int) 1 << 4) / Pin Controlled by PC4#define S3C2440_PIO_PJ11 S3C2440_BASE_PIOJ,(unsigned int) 1 << 11) / Pin Controlled by PC11#define KEYA_R_1 S3C
16、2440_PIO_PJ0 / 这4个一直保持输入#define KEYA_R_2 S3C2440_PIO_PJ10#define KEYA_R_3 S3C2440_PIO_PJ8#define KEYA_R_4 S3C2440_PIO_PJ12 / 当给它高时,这个PB29一直是2.45V,拉不高#define KEYA_D_1 S3C2440_PIO_PJ4#define KEYA_D_2 S3C2440_PIO_PJ1#define KEYA_D_3 S3C2440_PIO_PJ2#define KEYA_D_4 S3C2440_PIO_PJ11/* * * 函数描述延迟us * 参 数延
17、时时间,单位us * 返 回无 * */void uudelay(unsigned int us)unsigned int i, j;for (i = 0; i < us; i+)for (j = 0; j < 170; j+);/* * * 函数描述延迟ms * 参 数延时时间,单位ms * 返 回无 * */void mmdelay(unsigned int ms)unsigned int i, j;for (i = 0; i < ms; i+)for (j = 0; j < 30000; j+);int open_port_device(void)/ 别名 AT9
18、1RM9200_PORTABCD_init(void)unsigned char *gpioports; int fdMem = -1 ; fdMem = open("/dev/mem",O_RDWR);if (fdMem < 0)printf("Can't open mem device entry.Error number:%dn",fdMem);return -1;gpioports = mmap(0,getpagesize(),PROT_READ|PROT_WRITE,MAP_SHARED,fdMem,0x56000000);if
19、(gpioports=MAP_FAILED) printf("n Map failed!n");return -1;PIOB_BaseVirt = (unsigned int *) (gpioports + 0x10);PIOE_BaseVirt = (unsigned int *) (gpioports + 0x40);PIOF_BaseVirt = (unsigned int *) (gpioports + 0x50);PIOG_BaseVirt = (unsigned int *) (gpioports + 0x60);PIOJ_BaseVirt = (unsigne
20、d int *) (gpioports + 0xD0);/ printf("*ADC_BaseVirt:0x%x rn",(*(volatile unsigned int *)(ADC_BaseVirt) );return 0;/* * * 函数描述 读端口的某一个PIN的数值 => 如PA.0( 端口A的引脚1) * 参 数 unsigned int pio_port_base_addr, 端口PIO基地址 * unsigned int port_bit 端口的某位 * 返 回读取的数据 (0 or 1) * */int port_read( unsigned in
21、t pio_port_base_addr, unsigned int port_bit) unsigned int val/*,i*/;/ 对应的那两位配置为00,INPUT(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXCON_OFFSET) &= (0x0001<<(int)log2(double)port_bit)*2); (*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXCON_OFFSET) &= (0x0001<&l
22、t;(int)log2(double)port_bit)*2+1);/ 对应的那1位UP配置为0,enable(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXUP_OFFSET) &= port_bit;val = (*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXDAT_OFFSET) & port_bit;/printf("CON:0x%x ,DAT:0x%x,port:%frn",(*(volatile unsigned
23、 int *)(pio_port_base_addr+S3C2440_GPXCON_OFFSET),/(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXDAT_OFFSET),log2(double)port_bit); return (val ? 1 : 0); /* * * 函数描述 读端口的某一个PIN的数值 => 如PA.0( 端口A的引脚1) * 参 数 unsigned int pio_port_base_addr PIO基地址 *unsigned int port_bit, 某位 *int value 值:0
24、,1 * 返 回0成功 *-1失败 */int port_write(unsigned int pio_port_base_addr,/ PIO基地址 unsigned int port_bit, / 某位 int value) / 值:0,1/ 对应的那两位配置为01,OUTPUT(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXCON_OFFSET) |= (0x0001<<(int)log2(double)port_bit)*2); (*(volatile unsigned int *)(pio_port_ba
25、se_addr+S3C2440_GPXCON_OFFSET) &= (0x0001<<(int)log2(double)port_bit)*2+1);/ 对应的那1位UP配置为0,enable(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXUP_OFFSET) &= port_bit;if(value)(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXDAT_OFFSET) |= port_bit;else/* Clear Outpu
26、t */(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXDAT_OFFSET) &= port_bit;/printf("CON:0x%x ,DAT:0x%x,port:%frn",(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXCON_OFFSET),/(*(volatile unsigned int *)(pio_port_base_addr+S3C2440_GPXDAT_OFFSET),log2(double)port_bit
27、); return 0;/ 返回同时按下的键个数,buf中将放入同时按下的所有键的ASCII 码 / 始终保持KEYA_R_1,KEYA_R_2,KEYA_R_3,KEYA_R_4 为input 功能/ 注意:调用此函数的时间间隔不能太短,机械按键需要一定的延时“去抖”unsigned char ScanKey(char *buf) / ESC=27,ENTER=13char keyArr44 = '0','1','2','3', '4','5','6','7', &
28、#39;8','9','A','B', 'C','D','E','F'volatile unsigned char hScan,vScan,vTemp,bNumPressed=0,i,j; /*同一个端口从从写到读,需要注意一点,一般读端口时,如果端口引脚悬空,读到的是1* 因为在读状态上拉电阻起作用(reset后缺省打开) * 但是端口从写到读切换要注意,且换到读后,第一个读,是上次write的状态,第二次读才是正常值 */port_write(S3C2440_PIO_PJ
29、7,0);/ 245方向切换port_write(S3C2440_PIO_PJ5,1);/ 245方向切换,245做输入port_write(KEYA_R_1,0);port_write(KEYA_R_2,0);port_write(KEYA_R_3,0);port_write(KEYA_R_4,0);mmdelay(1);vScan = port_read(KEYA_D_1)<<4; / 放到高4位vScan |= port_read(KEYA_D_2)<<5;vScan |= port_read(KEYA_D_3)<<6;vScan |= port_re
30、ad(KEYA_D_4)<<7;vScan = (vScan);vScan = vScan >> 4;mmdelay(1); port_write(S3C2440_PIO_PJ7,1);/ 245方向切换,245做输入port_read(KEYA_R_1); port_read(KEYA_R_1); / 状态切换的空读 port_read(KEYA_R_2); port_read(KEYA_R_2);port_read(KEYA_R_3); port_read(KEYA_R_3);port_read(KEYA_R_4); port_read(KEYA_R_4); mmd
31、elay(1);/port_write(S3C2440_PIO_PJ5,0);/ 245方向切换,245做输入port_write(S3C2440_PIO_PJ7,1);port_write(KEYA_D_1,0);port_write(KEYA_D_2,0);port_write(KEYA_D_3,0);port_write(KEYA_D_4,0);mmdelay(1);/hScan = port_read(KEYA_R_1)<<4; / 放到高4位hScan |= port_read(KEYA_R_2)<<5;hScan |= port_read(KEYA_R_3)<<6;hScan |= port_read(KEYA_R_4)<<7;hScan = (hScan);hScan = hScan >> 4; / printf(" hScan:0x%x-vscan:0x%xrn",hScan,vScan);mmdelay(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度钢材电商平台开发与运营合同
- 2025年度高新技术企业离退休人员技术指导合同
- 2025年度金融实习生劳动合同规范文本
- 二零二五年度公司股权转让与品牌授权合同
- 二零二五年度个人房产租赁及维修保障协议
- 浙江国企招聘2024台州市建设市政工程检测中心有限公司招聘1名高层次人才笔试参考题库附带答案详解
- 热轧产品知识培训课件
- 匠心筑梦勇闯生涯-大学生职业生涯规划知到智慧树章节测试课后答案2024年秋深圳职业技术大学
- 零售市场知识培训课件
- 2025年国投(张掖)金种科技有限公司招聘77人笔试参考题库附带答案详解
- 10G409预应力管桩图集
- 《电视节目制作》课件
- 挖掘机司机培训服务投标方案(技术标 )
- 小学生主题班会 爱国主义教育 课件(共35张PPT)
- 雇佣保姆免责协议7篇(通用)
- 水电站水轮机调速器及其附属设备安装施工技术方案
- XX大学学科竞赛项目申请书
- 03S702钢筋混凝土化粪池图集
- 06-2018泥石流灾害防治工程勘查规范(试行)
- 黑鲷淡水养殖技术
- 焊工培训-焊接基础知识-课件
评论
0/150
提交评论