微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > 基于Murphypinyin的嵌入式键盘设计

基于Murphypinyin的嵌入式键盘设计

时间:02-21 来源:中电网 点击:

引 言

随着嵌入式系统的飞速发展,在嵌入式手持设备中,人机交互设备是与用户接触最多的部分,最能够直接快速地体现出该设备的性能。所以,是否有一个友好的、快速的、可靠的人机交互设备已经成为衡量一款手持设备的重要指标。在嵌入式人机交互设备中,键盘由于其具有很高的准确性和可靠性,能够适应各种恶劣的工作环境,并且具有很长的使用寿命,而得到广泛应用。

本文根据手持终端的特点,设计出一款矩阵键盘,并在Linux平台下开发出键盘的驱动程序。采用Qt/Embedded构建图形界面,通过对Qt/Embedded自带输入法的分析,结合Murphpinyin中文输入法软件包,构建了一款可输入数字、中/英文的嵌入式键盘。

1 硬件设计

本系统的硬件部分主要是一个4列5行的矩阵键盘,如图1所示。其中列线COL0~COL3使用了S3C2440的4个中断引脚--EINT10、ENIT13、EINT15、EINT20,并且每根列线都有一个4.7 kΩ的上拉电路,把中断引脚电平拉高,确保按键空闲时不会触发中断;行线ROW0~ROW4使用的是S3C2440的5个普通I/O口--GPE11、 GPE13、GPG3、GPG6、GPG11。这里需要注意的问题是,一定要确保列线所用的中断在Linux的各个设备中尚未使用到,否则在后面的驱动程序中将会造成驱动程序初始化失败。

考虑到手持终端操作的方便性,将所有的按键进行重新布局,如图2所示。为了延长手持设备的使用寿命、提高可靠性,增加了电源按键Power。另外,考虑到手持设备的低功耗要求,增加了背光控制按钮Back-Light,通过控制LCD_PWREN引脚的高低电平,控制LCD背光的开关。其中电源按键 Power、背光控制按键BackLight为单独按键,直接与S3C2440的中断引脚相连。本文重点对矩阵键盘做详细介绍,电源按键和背光控制按键的处理机制与矩阵键盘类似,这里不再做介绍。

2 软件设计

2.1 矩阵键盘的Linux驱动程序设计

矩阵键盘是作为Linux的一个字符设备注册到系统中的。为了降低对系统资源的损耗,采用中断处理函数对按键做处理;同时考虑到按键的抖动问题,采用定时器来消除抖动。

该驱动程序的流程如图3所示。首先,使用S3C2440_Kb_init()函数将键盘作为一个字符设备进行注册,初始化行线引脚为:输出、非上拉,并将所有行输出置为低电平;注册该键盘设备。初始化列线所连接的中断引脚为:输入、下降沿触发中断,并建立中断与中断处理函数Key_interrupt()的连接。

当有按键按下后,由于所有的行为低电平,必然有一行和一列线导通,从而将相应的列线拉低,触发中断。然后,中断处理函数Key_interrupt()记录相应的中断号码,由于按键存在抖动,单凭一次中断的触发就判定相应的按键按下很不可靠,所以在中断触发后开启定时器kb_timer对按键状态再次进行判定。

上层应用程序使用S3C2440_Kb_open()打开键盘设备,开启列线中断,初始化定时器。当中断触发后,开启定时器,定时器定时时间到后,触发定时器中断kb_timer_handler()。kb_timer_handler()首先会调用键盘扫描函数 Scan_keyboard()扫描按键状态,Scan_keyboard()流程如图4所示。如果经过3次键盘扫描,每次都扫描到相同的按键值被按下,则证明确实有按键被按下,Scan_keyboard()函数返回:KEYDOWN。如果按本次按键值与上一次按键值不同,则保存本次按键值到循环队列,这样可以不保存重复数据到缓冲队列。如果连续10次扫描到按键的状态都不为KEY_DOWN,则证明按键已经弹起,关闭定时器kb_timer。

S3C2440_Kb_read()函数负责从循环队列中读取按键值反馈给上层应用程序。

2.2 Qt/Embedded的键盘映射

Qt/Embedded是Trolltech公司针对采用嵌人式Linux的电子设备开发的综合应用平台。Qt/Embedded包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序以及开发框架。

Qt/Embedded 本身提供了对按键的支持,它在文件qkeyboard_qws.cpp中提供了一个QWSKeyboardHandler类来处理按键事件。本系统创建了 QWSKeyboardHandler类的一个子类QWSKEYMATRIXHandler。在QWSKEYMATRIXHandler类的构造函数中,通过open()函数打开矩阵键盘key_matrix,通过对打开的键盘设备创建一个QscoketNotifer来监控按键设备,通过信号与槽机制,建立该QscoketNotifer与读键盘函数ReadKeyboardData()的连接,当key_matrix被激活时,就会触发读键盘函数 ReadKeyboardData()。代码如下:

notifier=new QSocketNotifier(key_matrix,QSock-etNotifier::Read,this);
connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadKeyboardData()));

在读键盘函数ReadKeyboardData()中,调用矩

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top