则中止发送;
(6)输出8个数据位到数据线上;
(7)输出校验位;
(8)输出停止位(1);
(9)延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);
通过以下步骤可发送单个位:
(1)准备数据位(将需要发送的数据位放到数据线上);
(2)延时20μs;
(3)把时钟线拉低;
(4)延时40μs;
(5)释放时钟线;
(6)延时20μs。
3.2 ps/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口。相应的发送子程序如下:
#define datap00 用p0.0做数据线
#define clkp01 用p0.1做时钟线
#define inhibitp02 用p0.2做cd4052的inh端
#define portrp1 用p1口做读入口
#define portwp2 用p2口做写出口 可以实现64个自定义键
void send(ucharx)/***function forsend a char da-ta***/
{
uchar i,temp,char_temp;
bit flag_check=1;
inhibit=1;//disable standard keyboard
delay_ ms(3);
temp=x;
for(i=0;i<8;i++)//find the number of 1 in this uchar x is odd or not
{
char_temp=temp&0x01;
if(char_temp==0x01)
{
flag_check=!flag_check;
}
temp=temp>>1;
}
clk=1;//send 1 to p1 then
上一页 [1] [2] [3] 下一页