第9章 Keypad接口设计和驱动开发.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章 Keypad接口设计与驱动开发 本章要点 ●使用基本的逻辑器件,设计Keypad的外围电路 ●根据外围电路编写相应的驱动程序 ●在驱动程序中使用等待队列、定时器 9.1 最小硬件系统设计 9.2 Keypad软件驱动原理 9.3 键盘信息读取应用实例 键盘信息读取程序的主要功能是完成Keypad设备的打开、键值的读取和设备的关闭。程序的主体是一个条件循环。主循环体函数每执行一次,就读取一次键值。当有新按键被按下时,测试函数将打印出该键值。 《嵌入式系统》课件 * 《嵌入式系统》课件 嵌入式系统和用户进行人机交互时,最基本的输入设备是按键或者键盘。简单的应用可以选用按键,比较复杂的应用可以选用键盘。 不论是最简单的按键,还是比较复杂的键盘,总的说来,都是通过0、1来代表按键状态的变化。按键以0、1代表“断开”和“闭合”,键盘以0、1的序列代表按键的键值。 通常,CPU获知按键状态变化的方式有两种:查询式和中断式。当采用查询式时,CPU定时(例如每隔0.2s)查询I/O接口的状态,当I/O接口的状态有变化时,系统认为有按键被按下,并读取键值。当采用中断式时,一般将按键电路连接到一个逻辑器件,再将此逻辑器件 输出端连接到CPU的中断输入引脚。当有按键被按下时,与键盘电路相连的逻辑电路触发中断,CPU执行中断服务程序将键值读入内存。 查寻方式电路简单,但是占用较多CPU资源;中断方式节省CPU资源,但电路稍复杂,并且占用CPU中断资源。 通常在嵌入式系统中,按照情况区别对待。对于功能要求简单的应用场合,一般采用查询式的按键电路,而对于功能要求复杂的应用场合,一般采用中断式的键盘电路。 本章节主要介绍查询式的按键电路设计和驱动程序开发。 本章节所设计的简单键盘通过双向收发器和3—8译码器实现,如图9-1所示。双向收发器将Keypad电路连接到PXA255的数据总线,3-8译码器连接着地址总线和异步静态存储器的片选信号nCS2,它的输出充当双向收发器的使能信号,由KEY-CS#表示。 9.1.1 Keypad接口设计 3-8译码器 使能 nCS2# SA-D[0:7] SA-A[20:22] PXA255 KEY-CS# 键 盘 双向 收发器 使能 图9-1 键盘与处理器接口框图 其它设备 Keypad电路中采用了标准的3-8译码器74LCXl38。 3-8译码器的工作原理。 键盘的使能电路如下图: 9.1.2 Keypad电路原理   KEY-CS#片选信号连接着双向收发器的使能端,具体电路见图9-3: 图9-3 键盘的电路原理图 由图9-3可以看到,当KEY-CS#片选信号为低电平时,按键信息透过双向收发器74LCX245送到PXA255数据线SA-DO~SA-D7。 ·当没有键按下时,SA-DO~SA—D7读入的键值为“0xFF”。 ·当有键按下时,SA-D0~SA-D7读入的键值对应的位为“0”。 KEY-CS对应着3-8译码器的Y2脚,当该脚使能时,它对应的输入SA-A[22:20]为010, 也就是地址0由于SA-CS2#的物理地址是0故最终KEY-CS信号的物理地址是:000 在驱动程序中,假定KEY-CS的物理地址0应的虚地址为0xf8200000。由上面的介绍可知,当KEY-CS#片选信号为低电平使能时,数据通过74LCX245传送到数据总线上,因而可以用如下宏定义读键值(也就是从KEY-CS对应的地址读取数据): #define KEY_CS(*(volatile unsigned short *)(0xf8200000)) 其中,volatile关键字是一种类型修饰符,用它声明的变量不会被缓存在寄存器中,也不会对它做常量合并、常量传播以及读/写优化等。在嵌入式Linux中,与I/O存储器访问相关的变量都应加volatile类型修饰符。 加volatile修饰符是为了保证读取数值的正确性。因为KEY-CS地址的数据是随时可能发生变化的,所以每次使用它时,必须从地址中直接读取。如果不使用volatile声明,则编译器生成的汇编代码会做一些优化。编译器如果发现有连续两次从同一地址读取数据的代码,而它们之间没有对该地址进行写操作的代码,那么编译器会自动地把上次读取的数据放在寄存器中作为第二次读取的数据,而不是重新从该地址里面读取。这样一来,读取的键值就不是当前最新的键值,因此不能对这类的I/O操作进行优化。 在驱动

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档