学蓝桥Chapter6:矩阵键盘KBD练习

学蓝桥Chapter6:矩阵键盘KBD练习

前提条件

先将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,按从上到下从左到右的优先顺序,当按下任一位置的键盘时候,显示对应这个键盘的数字

#include <reg52.h>

sfr 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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值