基于Small RTOS51的PS/2键盘驱动程序开发
引言
随着嵌入式系统的发展,嵌入式软件设计向软件平台靠近,单片机软件设计不再是单一线程结构方式,而是逐步采用多任务的设计思想。实时操作系统使得实时应用程序的设计、扩展和维护变得更容易,无需大的改动就可以增加新的功能。然而随着任务的增加,要求输入的数据也会增加,类型也呈多样化。如果仍然用矩阵式扫描键盘,势必浪费单片机巨大的资源,且增加了成本。若用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(),通知退出中断服务程序并进行任务切换。
相关文章
- 2022-06-06基于DSP系统的多道脉冲幅度分析器设计
- 2022-06-16基于Small RTOS51的PS/2键盘驱动程序开发
- 2021-11-12基于DSP和IPM的变频调速的硬件设计
- 2022-12-16回转机械扭矩监测仪数字信号无线传输的研究
- 2022-06-23显微测量系统外参数标定的研究
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。