在单片机系统中z.docx

上传人:b****4 文档编号:4416547 上传时间:2022-12-01 格式:DOCX 页数:11 大小:43.06KB
下载 相关 举报
在单片机系统中z.docx_第1页
第1页 / 共11页
在单片机系统中z.docx_第2页
第2页 / 共11页
在单片机系统中z.docx_第3页
第3页 / 共11页
在单片机系统中z.docx_第4页
第4页 / 共11页
在单片机系统中z.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

在单片机系统中z.docx

《在单片机系统中z.docx》由会员分享,可在线阅读,更多相关《在单片机系统中z.docx(11页珍藏版)》请在冰豆网上搜索。

在单片机系统中z.docx

在单片机系统中z

在单片机系统中,经常使用的键盘都是专用键盘。

这类键盘都是单独设计制作的,成本高,连线多,且可靠性不高。

这些问题在那些要求键盘按键较多的应用系统中显得更加突出。

与此相比,在PC系统中广泛使用的PS/2键盘具有价格低、通用可靠,且使用的连线少(仅使用2根信号线)的特点,并可满足多数系统的要求。

因此,在单片机系统中应用PS/2键盘是一种很好的选择。

本文在分析PS/2协议和PS/2键盘工作原理与特点的基础上,给出在AT89C51单片机上实现对PS/2键盘支持的硬件连接方法以及驱动程序的设计实现。

1PS/2协议

现在PC机广泛采用的PS/2接口为miniDIN6引脚的连接器。

其引脚如图1所示。

1—数据线(DATA);2—未用;3—电源地(GND);

4—电源(+5V);5—时钟(CLK);6—未用。

图1PS/2连接器PS/2设备有主从之分,主设备采用female插座,从设备采用male插座。

现在广泛使用的PS/2键盘鼠标均工作在从设备方式下。

PS/2接口的时钟与数据线都是集电极开路结构的,必须外接上拉电阻。

一般上拉电阻设置在主设备中。

主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。

(1)从设备到主设备的通信

当从设备向主设备发送数据时,首先会检查时钟线,以确认时钟线是否是高电平。

如果是高电平,从设备就可以开始传输数据;否则,从设备要等待获得总线的控制权,才能开始传输数据。

传输的每一帧由11位组成,发送时序及每一位的含义如图2所示。

图2从设备到主设备的通信每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1。

从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读入数据线状态。

(2)主设备到从设备的通信

主设备与从设备进行通信时,主设备首先会把时钟线和数据线设置为“请求发送”状态。

具体方式为:

首先下拉时钟线至少100μs来抑制通信,然后下拉数据线“请求发送”,最后释放时钟线。

在此过程中,从设备在不超过10μs的间隔内就要检查这个状态。

当设备检测到这个状态时,将开始产生时钟信号。

此时数据传输的每一帧由12位构成,其时序和每一位含义如图3所示。

图3主设备到从设备的通信与从设备到主设备通信相比,其每帧数据多了一个ACK位。

这是从设备应答接收到的字节的应答位,由从设备通过拉低数据线产生,应答位ACK总是为0。

主设备到从设备通信过程中,主设备总是在时钟为低电平时改变数据线的状态,从设备在时钟的上升沿读入数据线状态。

2PS/2键盘的编码与命令集

(1)PS/2键盘的编码

现在PC机使用的PS/2键盘都默认采用第二套扫描码集。

该扫描码集可参考文献\[1\]。

扫描码有两种不同的类型:

通码(makecode)和断码(breakcode)。

当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机。

根据键盘按键扫描码的不同,在此可将按键分为如下几类:

第一类按键,通码为1字节,断码为0xF0+通码形式。

如A键,其通码为0x1C,断码为0xF00x1C。

第二类按键,通码为2字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式。

如rightctrl键,其通码为0xE00x14,断码为0xE00xF00x14。

第三类特殊按键有两个,printscreen键通码为0xE00x120xE00x7C,断码为0xE00xF00x7C0xE00xF00x12;pause键通码为0xE10x140x770xE10xF00x140xF00x77,断码为空。

组合按键的扫描码发送按照按键发生的次序,如以下面顺序按左SHIFT+A键:

1按下左SHIFT键,2按下A键,3释放A键,4释放左SHIFT键,那么计算机上接收到的一串数据为0x120x1C0xF00x1C0xF00x12。

在驱动程序设计中,就是根据这样的分类来对不同的按键进行不同处理的。

(2)PS/2键盘的命令集

主机可以通过向PS/2键盘发送命令来对键盘进行设置或者获得键盘的状态等操作。

每发送一个字节,主机都会从键盘获得一个应答0xFA(“重发resend”和“回应echo”命令例外)。

下面简要介绍驱动程序在键盘初始化过程中所用的指令(详细键盘命令集见参考文献\[1\]):

0xED主机在本命令后跟随发送一个参数字节,用于指示键盘上numlock,capslock,scrolllockled的状态;

0xF3主机在这条命令后跟随发送一个字节参数来定义键盘机打的速率和延时;

0xF4用于在当主机发送0xF5禁止键盘后,重新使能键盘。

3PS/2键盘与单片机的连接电路

PS/2键盘与AT89C51单片机的连接方式如图4所示。

P1.0接PS/2数据线,P3.2(INT0)接PS/2时钟线。

因为单片机的P1、P3口内部是带上拉电阻的,所以PS/2的时钟线和数据线可以直接与单片机的P1、P3相连接。

4驱动程序设计

驱动程序使用KeilC51语言,KeiluVision2编程环境。

PS/2104键盘驱动程序的主要任务,是实现单片机与键盘间PS/2通信,以及将接收到的按键扫描码转换为该按键的键值KeyVal,提供给系统上层软件使用。

(1)单片机与键盘间PS/2通信的程序设计

在PS/2通信过程中,主设备(单片机)是在时钟信号为低时发送和接收数据信号的。

因为单片机到键盘发送的是指令,需要键盘回应,所以这部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序。

单片机的键盘发送接口程序见本刊网站。

(2)键盘扫描码转换程序设计

由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值,控制键如F1、CTRL等为自定义值),只能通过查表的方式。

由于按键的三种类型及部分按键对应着两个键值(如A键的键值根据CAPS和SHIFT键状态有0x41(A)和0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用4个键盘表:

键盘扫描码转换基本集和切换集kb_plain_map\[NR_KEYS\]与kb_shift_map\[NR_KEYS\];包含E0前缀的键盘扫描码转换基本集和切换集kbe0_plain_map\[NR_KEYS\]与kbe0_shift_map\[NR_KEYS\]。

PS/2104键盘按键扫描码最大值为0x83,所以设置NR_KEYS为132。

所有四个键盘表的定义均为如下形式:

KB_MAP\[MAKECODE\]=KEYVAL,如果扫描码对应的按键为空,如KB_MAP\[0x00\],则定义相应键值为NULL_KEY(0x00)。

以下是键盘扫描码基本集的部分代码实例:

kb_plain_map\[NR_KEYS\]={……

NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39;NULL_KEY;//扫描码0x40~0x47

file:

//对应按键空,逗号,K,I,O,0,9,空

file:

//对应键值0x00,’,’,’k’,’i’,’o’,’0’,’9’,0x00

……};图4硬件连接电路如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、Windows多媒体按键键盘时,只需要将键表中相应处修改即可。

如ACPIpower按键通码为0xE00x37,修改kbe0_plain_map\[0x37\]=KB_ACPI_PWR即可。

特殊按键PAUSE使用单独程序处理,如果接收到0xE1就转入这段程序;而printscreen键则将其看作是两个通码分别为0xE00x12和0xE00x7C的“虚键”的组合键来处理。

在驱动程序中声明如下全局变量:

led_status其bit0-scrolllockled关0、开1;bit1-numlockled关为0,开为1;bit2-capslockled关为0,开为1;bit3~bit7总是0;agcs_status记录左右shiftctrlguialt状态,bit0-左shift键,bit1-左ctrl键,bit2-左gui键,bit3-左alt键,bit4-右shift键,bit5-右ctrl键,bit6-右gui键,bit7-右alt键,相应键按下则对应位为1,释放为0。

E0_FLAG接到0xE0置1;E1_FLAG接收到0xE1置1;F0_FLAG接收到0xF0置1。

按键键值通过KeyVal提供给上层使用。

PS/2键盘扫描码键值转换程序ps2_codetrans()流程如图5所示。

图5扫描码键值转换程序流程第一类按键的扫描码键值转换程序代码:

if(F0_FLAG){//接收扫描码为断码

switch(mcu_revchar){//处理控制键

case0x11:

agcs_status&=0xF7;break;//左alt释放

case0x12:

agcs_status&=0xFE;break;//左shift释放

case0x14:

agcs_status&=0xFD;break;//左ctrl释放

case0x58:

if(led_status&0x04)

led_status&=0x03;//capslock键

elseled_status=0x04;

ps2_ledchange();

break;

case0x59:

agcs_status&=0xEF;break;//右shift释放

case0x77:

if(led_status&0x02)

led_status&=0x05;//numlock键

elseled_status=0x02;

ps2_ledchange();

break;

case0x7E:

if(led_status&0x01)

led_status&=0x06;//scrolllock键

elseled_status=0x01;

ps2_ledchange();

break;

default:

break;

}

F0_FLAG=0;

}

else{//接收扫描码为通码

if(led_status&0x04)caps_flag=1;elsecaps_flag=0;

if(led_status&0x02)num_flag=1;elsenum_flag=0;

if(scga_status&0x11)shift_flag=1;elseshift_flag=0;

file:

//扫描码键值转换

if((caps_flag==shift_flag)(!

num_flag))KeyVal=kb_plain_map\[mcu_revchar\];

elseKeyVal=kb_shift_map\[mcu_revchar\];

switch(mcu_revchar){//处理控制键或状态键

case0x11:

agcs_status=0x08;//左alt按下

case0x12:

agcs_status=0x01;//左shift按下

case0x14:

agcs_status=0x02;//左ctrl按下

case0x59:

agcs_status=0x10;//右shift按下

default:

break;

}

}第二类按键的扫描码键值转换程序与上相似。

要注意的是在退出该程序段时对E0_FLAG和F0_FLAG标志的清0。

PAUSE键的处理程序:

如果接收到0xE1,置E1_FLAG=1,然后顺次将后续接收到的7个字节数据和PAUSE的通码后7个字节比较,一致则返回KeyVal=KB_PAUSE。

在比较完所有7个字节后清除E1_FLAG标志。

键盘初始化程序kb_init()流程:

①上电后,接收键盘上电自检通过信号0xAA,或者自检出错信号0xFC。

单片机接收为0xAA,进入下一步,否则,进行出错处理。

②关LED指示,单片机发送0xED,然后接收键盘回应0xFA,接着发送送0x00接收0xFA。

③设置机打延时和速率。

单片机发送0xF3,接收0xFA,发送0x00(250ms,2.0cps),接收0xFA。

④检查LED,发送0xED,接收0xFA,发送0x07(开所有LED),接收0xFA。

发送0xED,接收0xFA,发送0x00(关LED),接收0xFA。

⑤允许键盘发送0xF4,接收0xFA。

键盘LED改变ps2_ledchange()函数流程:

发送0xED→接收0xFA→发送led_status→接收0xFA。

结语

该驱动程序经KeiluVision2编译,在AT89C51单片机上运行通过,实现了对PS/2104键盘的支持,以及对字符按键大小写切换,numlock切换,控制键及组合按键的支持。

该程序对其他嵌入式或单片机系统中PS/2键盘的应用也有借鉴意义

 

随着计算机工业的发展,作为计算机最常用输入设备的键盘也日新月异。

1981年IBM推出了IBMpc/XT键盘及其接口标准。

该标准定义了83键,采用5脚DIN连接器和简单的串行协议。

实际上,第一套键盘扫描码集并没有主机到键盘的命令。

为此,1984年IBM推出了IBMAT键盘接口标准。

该标准定义了84~101键,采用5脚DIN连接器和双向串行通讯协议,此协议依照第二套键盘扫描码集设有8个主机到键盘的命令。

到了1987年,IBM又推出了ps/2键盘接口标准。

该标准仍旧定义了84~101键,但是采用6脚mini-DIN连接器,该连接器在封装上更小巧,仍然用双向串行通讯协议并且提供有可选择的第三套键盘扫描码集,同时支持17个主机到键盘的命令。

现在,市面上的键盘都和ps/2及AT键盘兼容,只是功能不同而已。

ps/2接口硬件

2.1物理连接器

一般,具有五脚连接器的键盘称之为AT键盘,而具有六脚mini-DIN连接器的键盘则称之为ps/2键盘。

其实这两种连接器都只有四个脚有意义。

它们分别是Clock(时钟脚)、DATA(数据脚)、+5V(电源脚)和Ground(电源地)。

在ps/2键盘与pc机的物理连接上只要保证这四根线一一对应就可以了。

ps/2键盘靠pc的ps/2端口提供+5V电源,另外两个脚Clock(时钟脚)和DATA(数据脚)都是集电极开路的,所以必须接大阻值的上拉电阻。

它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。

现在比较常用的连接器如图1所示。

2.2电气特性

ps/2通讯协议是一种双向同步串行通讯协议。

通讯的两端通过Clock(时钟脚)同步,并通过DATA(数据脚)交换数据。

任何一方如果想抑制另外一方通讯时,只需要把Clock(时钟脚)拉到低电平。

如果是pc机和ps/2键盘间的通讯,则pc机必须做主机,也就是说,pc机可以抑制ps/2键盘发送数据,而ps/2键盘则不会抑制pc机发送数据。

一般两设备间传输数据的最大时钟频率是33kHz,大多数ps/2设备工作在10~20kHz。

推荐值在15kHz左右,也就是说,Clock(时钟脚)高、低电平的持续时间都为40μs。

每一数据帧包含11~12个位,具体含义如表1所列。

表1数据帧格式说明

1个起始位

总是逻辑0

8个数据位

(LSB)低位在前

1个奇偶校验位

奇校验

1个停止位

总是逻辑1

1个应答位

仅用在主机对设备的通讯中

表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。

2.3ps/2设备和pc机的通讯

ps/2设备的Clock(时钟脚)和DATA(数据脚) 都是集电极开路的,平时都是高电平。

当ps/2设备等待发送数据时,它首先检查Clock(时钟脚)以确认其是否为高电平。

如果是低电平,则认为是pc机抑制了通讯,此时它必须缓冲需要发送的数据直到重新获得总线的控制权(一般ps/2键盘有16个字节的缓冲区,而ps/2鼠标只有一个缓冲区仅存储最后一个要发送的数据)。

如果Clock(时钟脚)为高电平,ps/2设备便开始将数据发送到pc机。

一般都是由ps/2设备产生时钟信号。

发送时一般都是按照数据帧格式顺序发送。

其中数据位在Clock(时钟脚)为高电平时准备好,在Clock(时钟脚)的下降沿被pc机读入。

ps/2设备到pc机的通讯时序如图2所示。

当时钟频率为15kHz时,从Clock(时钟脚)的上升沿到数据位转变时间至少要5μs。

数据变化到Clock(时钟脚)下降沿的时间至少也有5μs,但不能大于25μs,这是由ps/2通讯协议的时序规定的。

如果时钟频率是其它值,参数的内容应稍作调整。

上述讨论中传输的数据是指对特定键盘的编码或者对特定命令的编码。

一般采用第二套扫描码集所规定的码值来编码。

其中键盘码分为通码(make)和断码(Break)。

通码是按键接通时所发送的编码,用两位十六进制数来表示,断码通常是按键断开时所发送的编码,用四位十六进制数来表示。

3ps/2接口的嵌入式软件编程方法

ps/2设备主要用于产生同步时钟信号和读写数据。

3.1ps/2向pc机发送一个字节

从ps/2向pc机发送一个字节可按照下面的步骤进行:

(1)检测时钟线电平,如果时钟线为低,则延时50μs;

(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到

(1);

(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时pc机在向ps/2设备发送数据,所以ps/2设备要转移到接收程序处接收数据);

(4)延时20μs(如果此时正在发送起始位,则应延时40μs);

(5)输出起始位(0)到数据线上。

这里要注意的是:

在送出每一位后都要检测时钟线,以确保pc机没有抑制ps/2设备,如果有则中止发送;

(6)输出8个数据位到数据线上;

(7)输出校验位;

(8)输出停止位

(1);

(9)延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);

通过以下步骤可发送单个位:

(1)准备数据位(将需要发送的数据位放到数据线上);

(2)延时20μs;

(3)把时钟线拉低;

(4)延时40μs;

(5)释放时钟线;

(6)延时20μs。

3.2ps/2设备从pc机接收一个字节

由于ps/2设备能提供串行同步时钟,因此,如果pc机发送数据,则pc机要先把时钟线和数据线置为请求发送的状态。

pc机通过下拉时钟线大于100μs来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。

当ps/2设备检测到需要接收的数据时,它会产生时钟信号并记录下面8个数据位和一个停止位。

主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。

而ps/2设备则要配合pc机才能读到准确的数据。

具体连接步骤如下:

(1)等待时钟线为高电平。

(2)判断数据线是否为低,为高则错误退出,否则继续执行。

(3)读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被pc机拉低,如果被拉低则要中止接收。

(4)读地址线上的校验位内容,1个bit。

(5)读停止位。

(6)如果数据线上为0(即还是低电平),ps/2设备继续产生时钟,直到接收到1且产生出错信号为止(因为停止位是1,如果ps/2设备没有读到停止位,则表明此次传输出错)。

(7输出应答位。

(8)检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。

(9)延时45μs,以便pc机进行下一次传输。

读数据线的步骤如下:

(1)延时20μs;

(2)把时钟线拉低

(3)延时40μs

(4)释放时钟线

(5)延时20μs

(6)读数据线。

下面的步骤可用于发出应答位;

(1)延时15μs;

(2)把数据线拉低;

(3)延时5μs;

(4)把时钟线拉低;

(5)延时40μs;

(6)释放时钟线;

(7)延时5μs;

(8)释放数据线。

4 用于工控机的双键盘设计

工控机通常要接标准键盘,但是为了方便操作,常常需要外接一个专用键盘。

此实例介绍了在工控pc机到ps/2总线上再接入一个自制专用键盘的应用方法。

该设计应能保证两个键盘单独工作,而且相互不能影响。

因此,不能直接把专用键盘和标准键盘一起接到工控pc的ps/2口。

鉴于这种情况,本设计使用模拟开关CD4052并通过时分复用工控pc的ps/2口,来使在同一个时刻只有一个键盘有效,从而解决上述问题。

其硬件原理图如图3所示。

其中P2口和P1口用于键盘扫描电路(图中未画出),p0.0为数据端,p0.1为时钟端,p0.2为模拟开关选通端。

由于专用键盘不需要接收工控pc机的命令,所以软件中并不需要写这部分相应的代码。

通过软件可在专用键盘复位后把p0.2清0,以使模拟开关CD4052打开相应的通道。

这时工控pc的标准键盘将开始工作。

标准键盘可以完成工控pc刚启动时对外设检测的应答。

复位后的专用键盘不停地扫描有没有按键,如果有键按下则识别按键,并且按照预先的设计进行编码,同时调用发送程序并通过ps/2口发送到工控pc。

此时模拟开关关闭相应通道(将p0.2置1),专用键盘接入工控pcps/2口的时钟线和数据线而工作,但标准键盘被模拟开关从ps/2的时钟线和数据线中断而不工作,这样,双键盘便可时分复用同一个工控pc机的ps/2口。

相应的发送子程序如下:

#defineDATAp00   用p0.0做数据线

#defineCLKp01    用p0.1做时钟线

#defineINHIbitp02 用p0.2做CD4052的INH端

#definePORTR p1   用P1口做读入口

#definePORTW p2     用P2口做写出口可以实现64个自定义键

voidsend(ucharx)/*  functionforsendachardata*/

{

 uchari,temp,char_temp;

 bitflag_check=1;

 INHIBIT=1;  //disablestandardkeyboard

 delay_ms(3);

 temp=x;

 for(i=0;i<8;i++) //findthenumberof1inthisucharxisoddornot

 {

    char_temp=temp&0x01;

    if(char_temp==0x01)

    {

   flag_check=!

flag_check;

    }

    temp=temp>>1;

 }

 CLK=1;  //send1toP1thenreadP1

 while(!

CLK)   

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1