C51单片机上的外设键盘键是使用的矩阵方式扩展的,但是硬件仿真时必须把蜂民器的开关打开触使行扫描的74HC53的E端接地为输出型,否则测死了也没反应,我还以为是我的程序有问题呢,后来才找到的。
其原理
74HC138译码器在输出端Y1与WR(P3^6)都处于低电平通过或非门,转化成行扫描的74HC53的片选端打开写入数据,在输出端的高4位通过移位方式输出到外设键盘中。然后给WR一个高电平来给74HC53一个低电平使得输入无效进行锁存操作。然后通过RD(P3^7)与Y2共同输出低电平通过或非门加上个非门把低电平送到列扫描的74HC53的片选端E上,在读取数据前必须先将要获取的高4位进行置1,然后读取高4位数据,通过RD送出高电平进行锁住输出,防止74HC53同时输入输出导致芯片烧毁。然后根据获得的unsigned char进行移位比对操作来获得是哪一列,然后在通过运算得到第几个按键被按下。
这是最简单的矩阵方式扩展键盘的代码流程,上述是我理解的流程,测试已没问题。
#include<reg52.h>
#include<absacc.h>
void my_delay10nms(unsigned int n)
{
unsigned i,j;
while(n --)
{
for(i = 128;i > 0;i --)
for(j = 10;j > 0;j --);
}
}
sbit LED_BIT = P1^6;
void main(void)
{
unsigned char Key_h;
unsigned char Key_Val;
unsigned char Key_r;
unsigned char Last_key;
unsigned char Key_Temp;
while(1)
{
Key_Val=0;
for(Key_h=4;Key_h<8;Key_h++)
{
P2=0x88;
P0=(1<<Key_h);
P3&=~(1<<6);
P3|=(1<<6);
P2=0x90;
P3&=~(1<<7); //读
P0|=0xf0;
Key_Temp=P0&0xf0; //
P3|=(1<<7); // 防止芯片烧坏
if(Key_Temp)
{
for(Key_r=4;Key_r<8;Key_r++)
{
if(Key_Temp&(1<<Key_r))
{
Key_Val=(Key_h-4)*4+(Key_r-4)+1;
break;
}
}
if(Key_Val)break;
}
}
if(Last_key!=Key_Val)
{
Last_key=Key_Val;
}else
{
if(Last_key)
{
P0=Last_key;
LED_BIT = 1;
LED_BIT = 0;
}
}
my_delay10nms(1);
}
}
