返回主页

矩阵键盘产生PC机键盘信号的应用设计

 

  武汉建科科技有限公司  张卫东

 

  本文通过介绍PC系列机键盘的工作原理,提出了一个使用AT89C2051单片机将矩阵键盘信号转化为标准PC机键盘信号的实例,并给出了电路原理图和C51源程序。

关键词 标准键盘 接口 单片机

 

  

PC104总线嵌入系统在工程设计上得到了广泛应用,而其主要的人机交互设备-PC机标准键盘则因不适应工业环境而受到了限制,我们希望自己设计的薄膜式矩阵键盘能产生标准PC机键盘信号,这样即能满足人机交互的灵活性,又能满足仪器设备的工作环境。在此,我仅介绍PC机键盘的工作原理,并给出一个键盘接口在工程上的应用实例,供大家参考。

一、PC系列机键盘的工作原理

PC系列机使用的键盘有83键、84键、101键、102键和104键等多种。XTAT机的标准键盘分别为83键和84键,而286以上微机的键盘则普遍使用101键、102键和104键。PC系列机采用的是由单片机(804880358044)扫描、编码的智能化键盘,它通过一根带5DIN插头的电缆与主机相连,5针的编号和定义分别为:(1)、键盘时钟;(2)、键盘数据(3)、NC;(4)、地;(5)、+5V。系统通过两类键盘程序与键盘发生关系,一类是硬件中断程序-中断09H,负责把键盘代码(称为扫描码)转换为相应的ASCII码存入键盘缓冲区;另一类是软件中断程序-中断INT 16H,负责取出键盘缓冲区内的ASCII码。当键按下时,输出的是接通扫描码,当键松开时,输出的是断开扫描码。PC系列机中不同机型的键盘,接通和断开的扫描码不同。

1PCPC/XT使用的83键的键盘的接通扫描码和位置码(键位置)是等值的,如"A"键,键号30,接通扫描码为1EH;断开扫描码是接通扫描码加上80H而得,如"A"键的断开扫描码为9EH。按键的拍发率是固定的,即当一个键按下0.5秒后仍不放开,将重复输出该键的接通扫描码,其速率为每秒10次。单片机以串行序列发送键盘扫描码,其数据祯长度为9位,由起始位(低电平)和8位数据(低位在前,高位在后)组成。

2PC/AT使用的84/101/102扩展键盘的扫描码和键号并非同值,如"A"键,键号31,接通扫描码不是1FH,而是1CH;断开扫描码是2字节,在接通扫描码前加上字节F0H,如"A"键的断开扫描码为F01CH。按键的拍发速率是可选的,从最大30/秒,到最小2/秒,缺省选择仍与标准键盘一样。键盘扫描码的发送完全按串行异步通讯格式进行,其数据祯长度为11位,由起始位(低电平)、8位数据(低位在前,高位在后)、(高电平)组成。

我们在实际的设计应用中,采用的均是PC/AT机标准键盘的接口信号,这一点要特别注意。在这种键盘接口中,当无数据传输时,数据线和时钟线均为高电平,接口时钟信号由键盘提供,其频率至少应为733.33Hz,才能保证数据的准确发送和接收。在发送数据以前,键盘检测接口时钟线和数据线上的电平。如果时钟线为低电平,则认为主机禁止键盘发送按键数据,这时键盘数据送到缓存器中缓存。只有时钟线和数据线上均为高电平时,才允许键盘发送按键数据。此时,键盘向主机发送数据和时钟信号,键盘发送数据时,先拉底数据线发送起始位,再依次发送8位数据,最后发送奇偶校验位和停止位,每位数据在时钟脉冲下降沿有效,在时钟脉冲高电平期间变化。

二、矩阵键盘产生PC机键盘信号的接口设计

有了以上PC系列机键盘工作原理的知识,我们就可以进行接口设计了。下面给出了使用ATEML公司的20脚封装FLASH单片机AT89C2051SN74HC125配合产生标准PC机键盘信号的电路原理图和C51源程序,因为AT89C2051内部没有看门狗,所以由MAX813提供单片机复位信号,KBDKBC分别是键盘数据和时钟信号。这个电路用来模拟标准PC机键盘的右部数字小键盘的信号,经工程实践证明,应用效果良好。

 

1 矩阵键盘产生PC机键盘信号的接口电路

附:矩阵键盘采用扫描方式C51源程序

#include<reg51.h>

#define uchar unsigned char

sbit WDI=P 3^0;

sbit CLK_OUT=P3^1;

sbit REQ_IN=P3^2;

sbit DATA_OUT=P3^3;

sbit DATA_IN=P3^4;

sbit H1=P1^5;

sbit H2=P1^6;

sbit H3=P1^7;

sbit H4=P3^7;

 

uchar key_data;

uchar key_flag;

uchar code KEYCODE[20]={0X3D,0X3E,0X46,0X3C,0X34,/*7  8  9  +  /  */

                        0X25,0X2E,0X36,0X23,0X09,/*4  5  6  UP  *  */

                        0X16,0X1E,0X26,0X4B,0X76,/*1  2  3  LEFT  RIGHT */

                        0X45,0X49,0X4E,0X2D,0X5A};/*0  .  -   DOWN  ENTER*/

void dly()/*延时36us*/

{uchar x;

for(x=0;x<3;x++){;};

}

 

void delay(uchar t) /*延时tms*/

{

uchar j;

while(t--){

for(j=0;j<83;j++){;};

}

}

/*发送按键数据*/

void TRANS_KEY_DATA()

{

uchar x1 ,x2,x3,x4, j;

DATA_OUT=1;

CLK_OUT=1;

for(j=0;j<25;j++){;};/*300us*/

DATA_OUT=0;

dly();

CLK_OUT=0;

dly();

dly();

CLK_OUT=1;

dly();

x4=0;

x2=0X01;

for(x1=0;x1<8;x1++)

{

x3=x2&key_data;

if(x3==0) DATA_OUT=0;

else {DATA_OUT=1;x4++;}

dly();

CLK_OUT=0;

dly();

dly();

CLK_OUT=1;

dly();

x2=x2<<1;

}

x4=x4%2;

if(x4==0) DATA_OUT=1;

else DATA_OUT=0;

dly();

CLK_OUT=0;

dly();

dly();

CLK_OUT=1;

dly();

DATA_OUT=1;

dly();

CLK_OUT=0;

dly();

dly();

CLK_OUT=1;

dly();

}

/*按键扫描判断*/

void GETKEY()

{

uchar  x2;

uchar x1,ROW,COL;

key_flag=0XFF;

for(ROW=0;ROW<4;ROW++)

{

switch(ROW){

case 0:

       H1=0;H2=1;H3=1;H4=1;break;

case 1:

       H1=1;H2=0;H3=1;H4=1;break;

case 2:

       H1=1;H2=1;H3=0;H4=1;break;

case 3:

       H1=1;H2=1;H3=1;H4=0;break;

            }

x2=P1;

x2=~x2;

x2=x2&0X1F;

if(x2!=0) {

delay(30);

x2=P1;

x2=~x2;

x2=x2&0X1F;

 if(x2!=0){

      key_flag=0;

      if(x2>8) COL=4;

      else if(x2>4) COL=3;

      else if(x2>2) COL=2;

      else if(x2>1) COL=1;

      else COL=0;

x1=ROW*5+COL;

key_data=KEYCODE[x1];

do{

   x2=P1;

   x2=~x2;

   x2=x2&0X1F;

   }while(x2!=0);

return;

        }

            }

}    

}

/*判断是否发送数据*/

void SEND_KEY()

{

uchar x;

x=key_data;

do{}while(REQ_IN==0||DATA_IN==0);

TRANS_KEY_DATA();

delay(3);

do{}while(REQ_IN==0||DATA_IN==0);

key_data=0XF0;

TRANS_KEY_DATA();

delay(3);

do{key_data=x;}while(REQ_IN==0||DATA_IN==0);

TRANS_KEY_DATA();

delay(3);

}

void KEYINT()

{

GETKEY();

if(key_flag!=0XFF)

{

 SEND_KEY();

 delay(75);

}

key_flag=0XFF;

}

/*主程序*/

main()

{

P1=0XFF;

P3=0XFF;

CLK_OUT=1;

DATA_OUT=1;

delay(15);

for(;;)

{

KEYINT();

if(WDI==1) WDI=0;

else WDI=1;

}

}

 

参考文献:

1  李江伟等,键盘接口在单片机机系统与PC机系统通信中的应用,电子技术应用,2001;(3):2324

2  安学军等,PC机键盘接口深入分析与应用设计,单片机与嵌入式系统应用,2001;(8):5759

3  邹逢兴,微型计算机接口原理与技术,长沙:国防科技大学出版社,1999

 更多文章资料

Google
 
Web www.whctco.com