在之前的两章中,我们接触的是独立按键。现在,我们可以了解一下16位矩阵按键。首先先看一下原理图:
首先,需要将条形帽跳至1 2端口,即表示为16位矩阵按键。15单片机的矩阵按键大致可以分为按行扫描和按列扫描。我们用按列扫描的方式,也就是从左边的一根线往下看,分别加到了P37,P36,P35和P34这四个I/O借口上,但我们要注意的是,此时我们用的是15的单片机,P37和P36口已经改变了,我们见一下转接板的图便知晓问题所在。
从图中可以看出,转接板的P0,P1,P2口都和原来一样,但是P3口有一点是不一样的,P36变成了P42,P37变成了P44.这一点在写程序的时候需要更改过来。我们先来想两排的按键,考虑到精准的问题,程序写的会复杂一些。首先,我们是按行扫描,比方说先是第一行按键,就要令P44=0,之后呢需要精准一下,就要将P42=0,以确保不会混乱。再然后,就是要判断哪个被按下了,就需要行列的协同作战才能达到的。还是以之前的为例子,就要写if((P30=0)&&(P44=0))就能精准判断哪个被按下了。下面我们贴这个程序:
//两排按键控制数码管
#include<stc15f2k60s2.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xbf,0XFF};//ROM
void delayms(int ms);
void keyscan();
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //板子初始化程序
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //数码管初始化程序
while(1)
{
keyscan();
}
}
void keyscan()
{
P44=0;P42=1;
if((P300)&&(P440))//用来判断哪一行和列被按下
{
delayms(5);
if(P30==0)
{
P0=tab[0];
}
while(!P30);
}
else if((P31==0)&&(P44==0))
{
delayms(5);
if(P31==0)
{
P0=tab[1];
}
while(!P31