访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
基于Small RTOS51的PS/2键盘驱动程序开发
内容导读:

引言

随着嵌入式系统的发展,嵌入式软件向软件平台的靠近,单片机软件设计不再是单一线程结构方式,而是逐步采用多任务的设计思想,实时操作系统使得实时应用程序的设计、扩展和维护变得更容易,无需大的改动就可以增加新的功能。然而随着任务的增加,要求输入的数据也会增加,类型也呈多样化,如果仍然用矩阵式扫描键盘,势必浪费单片机巨大的资源,且增加了成本。若用pc机标准ps/2键盘取而代之,将可解决以上矛盾,本文介绍基于实时操作系统small rtos51的ps/2键盘驱动程序的设计,具有响应快,移植性强,占用资源少等优点。

1、驱动的设计 驱动的实现一般可用以下几种方法:1)使用任务编写,2)使用消息编写;3)使用信号量编写,ps2键盘既不需要cpu周期服务,又不具有自己的中断设备,但为了实现实时响应,本驱动采用中断方式,利用全局变量传递数据,并在中断服务程序唤醒处理任务。

1.1 中断服务程序

驱动程序使用中断接收案件的部分扫描码,并使用全局变量缓存它们,使用一个任务处理这些描述码来获取按键键值。通过对各种按键扫描码的分析,可将扫描码分为下列3种情况:a,普通按键。通码为唯一标识自己的1个字节,断码为2个字节,第1字节为f0h,第2字节为通码。b、功能键,如ctr。通码第1字节为e0h,第2字节为区别于其他按键的标识码;断码有3个字节,分别为e0h、f0h和标识码。c、组合键,如g。得到g的按键顺序是:按shift,按g,释放g,最后释放shift,所以扫描码应为:12h,34h,f0h,34h,f0h,12h。
由以上分析可知,无论是何种按键,只要知道扫描码的前两个字节,就可以确定哪个按键或那些综合键被按下,并可通过查找表找到相应的ascii码。这样,只接收2个字节,就可大大减少中断次数,节省cpu资源。中断程序如下:

程序首先按照small rtos51的中断编写规范调用宏os_int_enter()。如果用户禁止中断嵌套管理(en_os_int_enter=0),那么不必调用宏。接着,接收扫描码的前面两个字节,并存放在数组temp[2]中,当判断接收完毕(count==20)时,就要将接收中断关闭,以拒绝接收键盘发送后面的扫描码,然后,直接调用ossendintsignal(keycode transt_id),使键码转换处理任务就绪。最后,根据small rtos51的中断编写规范调用函数osintext(),通知退出中断服务程序并进行任务切换。

1.2 键码处理任务设计

这个任务完全可以在中断服务中完成,但为了避免接收扫描码的后面部分在接收到前两个字节后,必须进行一定的延迟,若放在中断服务中完成,会增加中断延时,键码处理任务设计主要完成从中断服务程序返回的扫描码的前两个字节,判断按键属于何种类型,并通过查找表找到相应的ascii号码,任务源代码如下:

任务首先创建一个存放按键ascii码的消息队列,然后对ps/2键盘初始化ps2int()。初始化中,可以简单地开始所使用的中断,也可以在该函数中加上其他一些用户程序。

下面服务函数开始进入一个无限循环中,oswait(k_sig,0)。是等待信号,当中断程序接收扫描码会通过函数ossendintsignal (keycodetranst_id)唤醒该任务。此时数组temp[2]中存放当前按键扫描码的前两个字节:

若temp[1]为0xf0,且temp[0]不等于0xe0,则说明是普通按键,可通过查表noshift[temp[0]],找到相应的ascii码;

若temp[0]为0xe0且temp[0]不等于0xf0,则说明是功能键,可通过查找noshift[temp[1]],找到相应的ascii码;

若temp[0]为0x12且0x59,则说明是shift与一个普通键的组合键,可通过查找addshift[temp[1]],找到相应的ascii码。

随后关接收按键中断,调用函数oswait(k_tmo,5),延时5个时钟周期,以屏蔽按键剩余的扫描码。最后,将得到的按键ascii码发送到消息队列中去,等待其他任务作相应的处理。

2 驱动的移植及使用

本驱动程序用51系列单片机的资源,使1个中断(外部中断0)和1个普通i/o口,分别与ps/2接口的clk和sda相连。在移植时必须首先在config.h中定义clk和sda,例如:

sbit sda=p1∧0;

sbit clk=p3∧2;

还要定义键码处理任务的优先级,#define keycode transt_id 0。这些定义后,就可将驱动程序移到操作系统中使用,使用时不必知道具体如何实现,直接调用osqpend(&val_key,key_ascii,0)获取按键的ascii码,再根据ascii码做相应处理即可。

结语

本驱动程序没有对ps/2键盘作初始化,因为只要通电,ps/2键盘就会按默认设置进行初始化,既然没有初始化,小键盘只能做相应的功能键使用,而不能做数字键使用,有兴趣者可将初始化程序补充完整。

标签:
来源:《单片机与嵌入式系统应用》 作者:武汉军械士官学校 王志国 中国地质大学 王晓威 时间:2007/1/26 0:00:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐