如何用Linuxc编写矩阵键盘扫描程序.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如何用 Linux c 编写矩阵键盘扫描程序 通常,矩阵键盘的工作方式有三种,即:程序查询、定时查 询和键盘中断扫描。键盘工作方式的选取应根据实际应用系 统中 CPU 工作的忙、闲情况而定。 此次矩阵键盘的应用场合是数字电桥系统。一者,电桥系统 对按键的响应速度、准确性都有较高的要求。二者,按键相 关代码嵌入在 linux 系统中, linux 系统中的其它程序(如 LCD 显 示)对 CPU 的占用量相对较大,基本排除程序查询方式的使用 。若采用中断扫描方式在组合按键时有一定的局限性,即不 能组合同列的按键,否则无法响应中断。 相比以上两种方式,定时扫描在嵌入式系统中的应用最为广 范。 l 设备驱动层:将底层的硬件输入转化为统一事件形式,向输入核心层 ( Input Core )汇报。 l 输入子系统核心:承上启下。为驱动层提供输入设备注册与操作接口 ,如: input_register_device; 通知事件处理层对事件进行处理;在 /Proc 下产生相应的设备信息等。 l 事件处理层:主要是和用户空间交互。( Linux 中在用户空间将所有 的设备都当做文件来处理,由于在一般的驱动程序中都有提供 fops 接 口,以及在 /dev 下生成相应的设备文件 nod ,这些操作在输入子系统中 由事件处理层完成)。 l 用户空间:一般包括 C 程序实现的应用程序和 Qt 程序。 从框图可以 看出驱动程 序员所要完 成的是硬件 相关部分( 具体是输入 设备驱动程 序模块)。 设备驱动程 序主要完成 键盘的扫描 ,如果有按 键按下或弹 起,则通过 input core 完 成两件事件 :报告事件 传递键码 本电路采用 6*7 矩阵键盘,共 39 个按键。其中行包括 KEY_LINE[1 : 6] ,分别连接 GPB5~GPB10 作为电平 输出引脚。列包括 KEY_ROW[1 : 7] ,分别连接 GPG5~GPG7 , GPG11~GPG14 作为电平输入脚,且使用内 部上拉置高。 ? 系统初始化时将列设为输入,弱上拉;第 1 行输出低电平,其余行输出高电平(假设扫描顺序按标 号由低到高);启动内核定时器。 ? 定时间隔到,查询各列输入电平情况,从而确定第 1 行上各个按键状态与上次扫描时本行各按键状 态比较。若有按键状态变化,此时的按键坐标为 button ( line ( 1 ), row ( x )),将按键键码,状 态等信息保存,报告事件到 input core 层(也可将每次扫描结果全部汇报,由应用程序决定按键状 态是否改变)。同时将第 2 行输出低电平,其余行输出高电平。 ? 定时间隔到,查询各列输入电平情况,从而确定第 2 行上各个按键状态与上次扫描时本行各按键状 态比较。若有按键变化,此时的按键坐标为 button ( line ( 2 ), row ( x )),将按键键码,状态等 信息保存,报告事件到 input core 层。同时将第 3 行输出低电平,其余行输出高电平。 ? 如此周期循环进行,即可方便将所有按键变化扫描到,并向 input core 层汇报,键码转换后供用户 程序调用。 ? 说明:为什么不在定时间隔到的时候一次性将 6 行都扫描了? ? 因为在定时间隔到来时,按上面方法一次将 6 行扫描,很可能会出现硬件不能及时响应指令,而造 成扫描不到按键变化的现象(特别是在系统时钟较高的情况)。比如:第 1 行扫描完成后,将第 2 行 置高,其余行置低来扫描低二行,这句话就两条 C 语言指令:拉低第 1 行,置高低 2 行。接下来马上 扫描列的电平,但其实在上面两条指令结束时,硬件上并不一定完成这两条指令预期的动作。即第 1 行线路真的已经为 0 ,第 2 行线路真的为 1 码?如果有键按着,此时列的数据寄存器里的值已经根据 行电平的变化而变化了吗?其实这些是难以保证的,按键的阻抗, GPIO 的阻性、容性都会滞后电平 变化。所以难以保证一次性将所有行扫描完成这种方式的准确性和稳定性 。 ? #include <stdio.h> ? #include <stdlib.h> ? #include <unistd.h> ? #include <linux/input.h> ? #include <sys/fcntl.h> ? int main(int argc, char *argv[]) ? { ? int fd = -1; ? int num; ? size_t rb; ? int version; ? char name[20]; ? st

文档评论(0)

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

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

1亿VIP精品文档

相关文档