基于Small RTOS51的PS/2键盘驱动程序开发

发布者:勾剑寒最新更新时间:2006-07-18 来源: 单片机及嵌入式系统应用关键字:按键  单片机  字节 手机看文章 扫描二维码
随时随地手机看文章

引言

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

1 驱动的设计

  驱动的实现一般可用以下几种方法:① 使用任务编写;② 使用消息编写;③ 使用信号量编写。PS/2键盘既不需要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资源。中断程序如下:

void Receive() interrupt 0 {
  IE0=0;
  dat>>=1; //接收数据,低→高
  if(sda) dat|=0x80;
  count++;
  if(count==num) {
    if(num==9) {
      temp[0]=dat;
      num=20;
    }
    else {
      temp[1]=dat;
      IE&=0xfe;
      count=0;
      num=9;
      OSSendIntSignal(KeyCodeTranst_ID);
      OSIntExt();
    }
  }
}

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

1.2 键码处理任务设计

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

KeyCodeTranst() {
  uint8Key;
  PS2Int();//键盘初始化
  OSQCreate(Key_ASCII,16);//创建存放按键ASCII码数据队列
  while(1) {
    OSWait(K_SIG,0);//等待按键
    IE&=0x0fe;//屏蔽无用扫描码
    if(temp[1]==0xf0&&temp[0]!=0xe0)Key=noshift[temp[0]];//键码转换
    else if(temp[0]==0xe0&&temp[1]!=0xf0)Key=noshift[temp[1]];
    else if(temp[0]==0x12||temp[0]==0x59)Key=addshift[temp[1]];
    OSWait(K_TMO,5);//延时5个滴答
    IE0=0;
    IE|=0x01;//准备接收下一个按键
    OSQPost(Key_ASCII,Key);//发送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,例如:

SbitSDA=P1^0;
SbitCLK=P3^2;

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

结语

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

参考文献
[1] 陈明计,等.嵌入式实时操作系统Small RTOS51原理及应用.北京:北京航空航天大学出版社,2004.
[2] 张晓辉.嵌入式操作系统驱动程序开发. 安徽电气工程职业技术学校学报,2005(3).
[3] 郑炜,等.单片机系统中PS/2键盘驱动程序设计.单片机与嵌入式系统应用,2005(4).
[4] 李华,等. MCS-51单片机实用接口技术. 北京:北京航空航天大学出版社,1993

关键字:按键  单片机  字节 引用地址:基于Small RTOS51的PS/2键盘驱动程序开发

上一篇:数字视频压缩的大容量记录系统设计
下一篇:基于嵌入式Linux平台的多协议路由器设计

推荐阅读最新更新时间:2024-05-02 20:25

基于单片机IAP技术的LED显示屏控制系统
LED显示屏由于其具有耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远等特点,已经成为新一代的信息传播媒体工具。LED与LCD相比较最突出的特点是,亮度高、成本低且屏幕尺寸可根据现场情况用标准LED单元板拼制。按安装位置可分为室外、半室外和室内;按颜色可分为单色、双基色和彩色;按发光二极管点距可分为φ5.0、φ3.75及φ3.0等。本文以市场上常见的室内双色LED单元板为控制对象,说明基于单片机IAP技术的LED显示屏控制系统工作原理以及数据组织方法。 1 双色LED单元板硬件组成及工作原理 常见的室内双色LED单元板电路框图如图1(a)所示。其中行扫描电路由2片74HC138(3-8译码器)构成的4-16译码器加
[单片机]
基于<font color='red'>单片机</font>IAP技术的LED显示屏控制系统
单片机如何使用?单片机只会用例程怎么办?
“单片机”可以说是一个专业名词,只要做电子的,或者电子产品相关的人才会知道单片机,以及单片机是干什么的。 大学谈女朋友的时候,女朋友问我每天在实验室里学什么东西,我说单片机软件开发,她是一脸懵逼问我单片机是个啥! 是的,只有关注电子产品开发的兄弟姐妹们才会关注单片机这个话题,以及单片机如何使用? 单片机如何使用?我们先聊一下这个话题,再和大家探讨单片机只会用例程怎么办? 单片机如何使用,这是每个初学者都会问的问题,大家还会问单片机怎么入门? 其实所有知识的学习入门,如果没有别人帮助,自己独立学习的话,是一个极其痛苦的事情。 我在大学进入实验室参加电子大赛的时候,刚开始接触学习单片机的,每天都是刻苦学习,花了2个月学习了C语言,
[单片机]
单片机工程师需要掌握什么?单片机编程培训哪里有?
般知道单片机的,都是对单片机有兴趣的,想做一些很酷的智能控制产品。 或者觉得单片机的就业前景好,这个技术也不会过时的。 小孩子才做选择,成年人全部都要。 我就是兴趣入行,然后做了几年感觉这个行业前景越来越好。 原来我以为单片机开发是传统行业,后来结合了互联网,把硬件连上网,感觉能做的功能更加强大了。 一、一个合格的单片机工程师需要掌握什么知识? 1.C语言 。 C语言是单片机程序开发的工具,必须要掌握。 基本语法,指针,结构体,枚举,回调函数等 都是需要完全掌握,并可以灵活使用。 2.掌握单片机硬件接口的驱动 大家可以灵活的使用单片机的GPIO,串口,定时器,SPI,IIC等,这些都是基础。 大家还可以简单的分析一些
[单片机]
单片机开发过程中硬件调试阶段步骤及相关内容解析方案
在单片机开发过程中,从硬件设计到软件设计几乎是开发者针对本系统特点亲自完成的。这样虽然可以降低系统成本,提高系统的适应性,但是每个系统的调试占去了总开发时间的2/3,可见调试的工作量比较大。单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。但通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。可见硬件的调试是基础,如果硬件调试不通过,软件设计则是无从做起。本文结合作者在单片机开发过程中体会,讨论硬件调试的技巧。 当硬件设计从布线到焊接安装完成之后,就开始进入硬件调试阶段,调试大体分为以下几步。 1 硬件静态的调试 1.1排除逻辑故障 这类故障往往由于设计和加工制板过程中
[单片机]
PIC8位单片机源程序编写方法
PIC系列单片机的源程序是指PIC的助记符指令编写的程序(汇编语言程序)。这里将对PIC源程序的格式要求和其源程序的建立或书写作简要的介绍。 一般来说对PIC单片机的源程序格式并没有要求统一的编写形式,用户可以根据习惯来编写,当然编写时应遵守汇编的一些规范。下面以PIC16F84芯片点亮一支发光二极管的汇编程序实例,介绍一种源程序编写的方法(格式),以供实际应用时参考。 源程序清单 1File TURNON.ASM 2Assembly code for PIC16F84 microcontroller 3Turns on an LED connected to B0 4Uses RC oscillator,ab
[单片机]
AVR单片机实现智能电冰箱控制系统方法
简介:现今,电冰箱已经普及家家户户,人们对电冰箱的性能和控制功能特别是智能程度的要求是越来越高,本方所讲述的AVR单片机智能电冰箱控制系统,具有功能齐全、操作简单、使用方便等优点,在国内同类产品中处于较高水平,具有较高的实用和推广价值。 现今,电冰箱已经普及家家户户,人们对电冰箱的性能和控制功能特别是智能程度的要求是越来越高,本方所讲述的AVR单片机智能电冰箱控制系统,具有功能齐全、操作简单、使用方便等优点,在国内同类产品中处于较高水平,具有较高的实用和推广价值。并且该系统在设计完成之后进行了多次试验,试验数据表明该系统的各项性能指标和功能达到了预期的设计目的。 多年来电冰箱在国内市场上一直作为储物、保鲜的空间,人们对于电
[单片机]
AVR<font color='red'>单片机</font>实现智能电冰箱控制系统方法
Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入)
前面几篇文章试验都是讲解如何使用 I.MX6U 的 GPIO 输出控制功能, I.MX6U 的 IO 不仅能作为输出,而且也可以作为输入。 I.MX6U-ALPHA 开发板上有一个按键,按键连接了一个 IO,将这个 IO 配置为输入功能,读取这个 IO 的值即可获取按键的状态(按下或松开)。本篇文章通过这个按键来控制蜂鸣器的开关 1、按键输入简介 按键就两个状态:按下或弹起,将按键连接到一个 IO 上,通过读取这个 IO 的值就知道按键是按下的还是弹起的。至于按键按下的时候是高电平还是低电平要根据实际电路来判断。 I.MX6U-ALPHA 开发板上有一个按键 KEY0,本篇文章我们将会编写代码通过这个 KEY0 按键来控制
[单片机]
Linux之ARM(IMX6U)裸机<font color='red'>按键</font>输入实验(GPIO的输出与输入)
意法半导体突破20纳米技术节点,提升新一代微控制器的成本竞争力
首款采用新技术的 STM32 微控制器将于 2024 下半年开始向部分客户出样片 18nm FD-SOI制造工艺与嵌入式相变存储器(ePCM)组合,实现性能和功耗双飞跃 2024年3月26日,中国-- 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST;) 发布了一项基于 18 纳米全耗尽绝缘体上硅(FD-SOI) 技术并整合嵌入式相变存储器 (ePCM)的先进制造工艺,支持下一代嵌入式处理器升级进化 。这项新工艺技术是意法半导体和三星晶圆代工厂共同开发,使嵌入式处理应用的性能和功耗实现巨大飞跃,同时可以集成容量更大的存储器和更多的模拟和数字外设。基于新技术的
[半导体设计/制造]
意法半导体突破20纳米技术节点,提升新一代<font color='red'>微控制器</font>的成本竞争力
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved