前提条件矩阵键盘接线图及简要介绍练习
前提条件先将CT107D的J5键帽跳到KBD那边(或者拿一根导线短路kbd一端管脚和中间那跟管脚)
矩阵键盘接线图及简要介绍
r1——r4为行,矩阵键盘扫描第n行的时候,默认会将第n行置低电平(0),其它行置为高电平(1)
c1——c4为列,矩阵键盘扫描每一行的时候,我们通过默认将列置为高电平(1),这样当列变化出现低电平(0)的时候,就能锁定到行为低电平,列为低电平的具体位置。
例:我按下了第2行第2列的键盘,怎么判断这个键是否按下了呢?
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
//以上为行的位定义
sbit p34=P3^4;
sbit p35=P3^5;
sbit p42=P4^2;
sbit p44=P4^4
//以上为列的位定义
//只有进行了位定义才能使用Pn^m这样的指定引脚,不然会报错。
p30=0;//让行置为低电平
p31=p32=p33=1;
p34=p35=p42=p44=1
if(p42==0){
//通过这条判断语句就能判断第2行第2列的键盘是否被按下了
}
练习
矩阵键盘4x4,按从上到下从左到右的优先顺序,当按下任一位置的键盘时候,显示对应这个键盘的数字
#includesfr P4=0xc0;//由于reg52头文件没有P4地址,所以需要自己加上P4的I/O口地址,I/O口地址可以查具体MCU型号得到。当然了,也是可以直接使用STC15的头文件,这样就不用这条语句了。 sbit a=P2^5; sbit b=P2^6; sbit c=P2^7; sbit r1 = P3^0; sbit r2 = P3^1; sbit r3 = P3^2; sbit r4 = P3^3; sbit c4=P3^4; sbit c3=P3^5; sbit c2=P4^2; sbit c1=P4^4; unsigned char code dx[]={0xc0,0xf9,0xa4,0xb0,0x99,0x12,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xc1}; void delay(unsigned int t){ while(t--); } void selecthc573(unsigned char channel){ switch(channel){ case 4: c=1;b=0;a=0; break; case 5: c=1;b=0;a=1; break; case 6: c=1;b=1;a=0; break; case 7: c=1;b=1;a=1; break; } } void buzzoff(){ selecthc573(5); P0=0x00; } void showkey(unsigned char key){ selecthc573(6); P0 = 0x01; selecthc573(7); P0= key; } //数码管显示按下键盘后的数值 void scankey(){ r1=0; r2=r3=r4=1; //r1——r4为行,矩阵键盘扫描第一行的时候,默认会将第一行置低电平,其它行为高电平 c1=c2=c3=c4=1; //c1——c4为列,矩阵键盘扫描每一行的时候,我们通过默认将列置为高电平,这样当列变化出现低电平的时候,就能锁定到行为低电平,列为低电平的具体位置。 if(c1==0){ delay(1000); while(c1==0); key(dx[0]); } else if(c2==0){ delay(1000); while(c2==0); key(dx[1]); } else if(c3==0){ delay(1000); while(c3==0); key(dx[2]); } else if(c4==0){ delay(1000); while(c4==0); key(dx[3]); } // r2=0; r1=r3=r4=1; c1=c2=c3=c4=1; if(c1==0){ delay(1000); while(c1==0); key(dx[4]); } else if(c2==0){ delay(1000); while(c2==0); key(dx[5]); } else if(c3==0){ delay(1000); while(c3==0); key(dx[6]); } else if(c4==0){ delay(1000); while(c4==0); key(dx[7]); } // r3=0; r2=r1=r4=1; c1=c2=c3=c4=1; if(c1==0){ delay(1000); while(c1==0); key(dx[8]); } else if(c2==0){ delay(1000); while(c2==0); key(dx[9]); } else if(c3==0){ delay(1000); while(c3==0); key(dx[10]); } else if(c4==0){ delay(1000); while(c4==0); key(dx[11]); } // r4=0; r2=r3=r1=1; c1=c2=c3=c4=1; if(c1==0){ delay(1000); while(c1==0); key(dx[12]); } else if(c2==0){ delay(1000); while(c2==0); key(dx[13]); } else if(c3==0){ delay(1000); while(c3==0); key(dx[14]); } else if(c4==0){ delay(1000); while(c4==0); key(dx[15]); } } void main(){ while(1){ scankey(); } }



