矩阵键盘产生PC机键盘信号的应用设计
■ 武汉建科科技有限公司 张卫东
摘 要 本文通过介绍PC系列机键盘的工作原理,提出了一个使用AT89C2051单片机将矩阵键盘信号转化为标准PC机键盘信号的实例,并给出了电路原理图和C51源程序。
关键词 标准键盘 接口 单片机
引 言
PC104总线嵌入系统在工程设计上得到了广泛应用,而其主要的人机交互设备-PC机标准键盘则因不适应工业环境而受到了限制,我们希望自己设计的薄膜式矩阵键盘能产生标准PC机键盘信号,这样即能满足人机交互的灵活性,又能满足仪器设备的工作环境。在此,我仅介绍PC机键盘的工作原理,并给出一个键盘接口在工程上的应用实例,供大家参考。
一、PC系列机键盘的工作原理
PC系列机使用的键盘有83键、84键、101键、102键和104键等多种。XT和AT机的标准键盘分别为83键和84键,而286以上微机的键盘则普遍使用101键、102键和104键。PC系列机采用的是由单片机(8048、8035或8044)扫描、编码的智能化键盘,它通过一根带5芯DIN插头的电缆与主机相连,5针的编号和定义分别为:(1)、键盘时钟;(2)、键盘数据(3)、NC;(4)、地;(5)、+5V。系统通过两类键盘程序与键盘发生关系,一类是硬件中断程序-中断09H,负责把键盘代码(称为扫描码)转换为相应的ASCII码存入键盘缓冲区;另一类是软件中断程序-中断INT 16H,负责取出键盘缓冲区内的ASCII码。当键按下时,输出的是接通扫描码,当键松开时,输出的是断开扫描码。PC系列机中不同机型的键盘,接通和断开的扫描码不同。
1、PC、PC/XT使用的83键的键盘的接通扫描码和位置码(键位置)是等值的,如"A"键,键号30,接通扫描码为1EH;断开扫描码是接通扫描码加上80H而得,如"A"键的断开扫描码为9EH。按键的拍发率是固定的,即当一个键按下0.5秒后仍不放开,将重复输出该键的接通扫描码,其速率为每秒10次。单片机以串行序列发送键盘扫描码,其数据祯长度为9位,由起始位(低电平)和8位数据(低位在前,高位在后)组成。
2、PC/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单片机AT89C2051和SN74HC125配合产生标准PC机键盘信号的电路原理图和C51源程序,因为AT89C2051内部没有看门狗,所以由MAX813提供单片机复位信号,KBD和KBC分别是键盘数据和时钟信号。这个电路用来模拟标准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):23~24
2 安学军等,PC机键盘接口深入分析与应用设计,单片机与嵌入式系统应用,2001;(8):57~59
3 邹逢兴,微型计算机接口原理与技术,长沙:国防科技大学出版社,1999