积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> 驱动设计
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | XP Embedded | Nucleus | 新产品 | 相关文章 | 综合技术 |
基于Small RTOS51的PS/2键盘驱动程序开发
 
作者:武汉军械士官学校 王志国 中国地质大学 王晓威   来源:单片机及嵌入式系统应用    点击数:191   更新时间:2008-3-7
您可以添加到网摘 让更多人关注此文章:

    

引言


  随着嵌入式系统的发展,嵌入式软件设计向软件平台靠近,单片机软件设计不再是单一线程结构方式,而是逐步采用多任务的设计思想。实时操作系统使得实时应用程序的设计、扩展和维护变得更容易,无需大的改动就可以增加新的功能。然而随着任务的增加,要求输入的数据也会增加,类型也呈多样化。如果仍然用矩阵式扫描键盘,势必浪费单片机巨大的资源,且增加了成本。若用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




[1]



相关文章
· 泰克新推出混合信号和数字荧光示波器,简便易用小巧便...[101]
· NEC推出9款用于车载多媒体系统的32位MCU[114]
· 基于ARM单片机的条码精密测量系统[402]
· 嵌入式Linux操作系统的驱动程序开发要点[507]
· 利用SPD实现嵌入式系统中内存的自动识别和配置[295]
热门评论排行
·VHDL设计中电路简化问题的
·ARM嵌入式系统基础教程(N
·江苏嵌入式Linux教育培训
·ARM处理器应用开发4步骤
·锐极LINUX驱动培训班定于

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
节能环保备受关注 半导体照
半导体产业最终将存活并将再次蓬勃发展
电子元件业御寒过冬 静待行
台湾当局拨款60亿美元援助DRAM厂
Vishay Silico
严冬期如何发展半导体业 扩
2008年中国集成电路市场回顾与展望
分析师:亚洲芯片厂商库存远超预期
2008年基础电子业十大事件点评
Aptina并购智多微手机软件平台设
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
供应HY5PS561621AF...
优势供应SPP11N80C3...
优势供应ICE2A0565Z...
低价专业PCB打样 双面板20...
深圳市天漠科技超低价供应atm...
深圳市天漠科技超低价供应ARM...
[推荐]2.5米精度,高灵敏度...
830实验箱+电脑没有并口...
[原创]平望科技助力自服终端国...
低价专业PCB打样 双面板20...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网