蓝桥杯单片机小蜜蜂学习笔记——矩阵键盘

本文详细介绍了矩阵键盘的工作原理,包括其布局、独立按键与矩阵模式的区别,以及使用C语言编写的扫描代码示例。作者还强调了编程中需要注意的细节,如数码管段码记忆和全局变量设置。
摘要由CSDN通过智能技术生成

笔记仅供学习参考

学习视频链接

【基础技能07】矩阵键盘的扫描原理与基本应用

基本原理

(图片来自欧老师的视频)

讲一下基本原理吧

图片的左半部分是矩阵键盘的布局 R1R2R3R4C1C2C3C4都是IO端口(就是电平高低可以人为控制)

图片右半部分上面是独立按键 下面是矩阵键盘 两者的区别就是

看末端部分

独立按键是要接地的

矩阵键盘接的还是IO口

当按键被按下的时候

独立按键模式的按键位置的电平就会被拉低 原本是1 变成了0

矩阵键盘模式的按键位置会变成IO口的电平

先看看我们的赋值情况吧 这是扫描第一行的

//row 1
	r1=0;
	r2=r3=r4=1;
	c1=c2=c3=c4=1;

在赋值的过程中 我的理解是 老师把C1C2C3C4当作了上图右半部分的矩阵键盘模式的VCC

即全部都赋值为1

然后r1为0 就是图片中的IO口

当有按键被按下的时候 该按键的值会等于IO口的值 在这个情况下 就是0

所以我们在判断的时候写的是 c1==0 就是判断是否是0

然后再接着写相同的三个这样的结构判断C2C3C4就可以完成R1这一行的按键扫描

然后再整体的结构写3遍就完成了R2R3R4的行扫描

代码

代码如下(我的延时程序和老师的不一样 简单讲就是用老师的,我的板子就无法运行)

#include "reg52.h"
sfr P4=0xc0;

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 smg_duanma[18]={
	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
	0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
	0xbf,0x7f};
void selecthc573(unsigned char channel){
	switch(channel){
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}
void displaykeynum(unsigned char value){
	selecthc573(6);
	P0=0x01<<pos;
	selecthc573(7);
	P0=value;
}
unsigned char key_num;
void delay()		
{
	unsigned char data i, j;

	i = 216;
	j = 37;
	do
	{
		while (--j);
	} while (--i);
}

void scankeymulti(){
//row 1
	r1=0;
	r2=r3=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0){
		delay();
		if(c1==0){
			while(c1==0);  
			key_num=0;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c2==0){
		delay();
		if(c2==0){
			while(c2==0);  
			key_num=1;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c3==0){
		delay();
		if(c3==0){
			while(c3==0);  
			key_num=2;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c4==0){
		delay();
		if(c4==0){
			while(c4==0);  
			key_num=3;
			displaykeynum(smg_duanma[key_num]);
		}
	}
//row 2
	r2=0;
	r1=r3=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0){
		delay();
		if(c1==0){
			while(c1==0);  
			key_num=4;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c2==0){
		delay();
		if(c2==0){
			while(c2==0);  
			key_num=5;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c3==0){
		delay();
		if(c3==0){
			while(c3==0);  
			key_num=6;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c4==0){
		delay();
		if(c4==0){
			while(c4==0);  
			key_num=7;
			displaykeynum(smg_duanma[key_num]);
		}
	}
//row 3
	r3=0;
	r2=r1=r4=1;
	c1=c2=c3=c4=1;
	if(c1==0){
		delay();
		if(c1==0){
			while(c1==0);  
			key_num=8;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c2==0){
		delay();
		if(c2==0){
			while(c2==0);  
			key_num=9;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c3==0){
		delay();
		if(c3==0){
			while(c3==0);  
			key_num=10;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c4==0){
		delay();
		if(c4==0){
			while(c4==0);  
			key_num=11;
			displaykeynum(smg_duanma[key_num]);
		}
	}
//row 4
	r4=0;
	r2=r1=r3=1;
	c1=c2=c3=c4=1;
	if(c1==0){
		delay();
		if(c1==0){
			while(c1==0);  
			key_num=12;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c2==0){
		delay();
		if(c2==0){
			while(c2==0);  
			key_num=13;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c3==0){
		delay();
		if(c3==0){
			while(c3==0);  
			key_num=14;
			displaykeynum(smg_duanma[key_num]);
		}
	}
	if(c4==0){
		delay();
		if(c4==0){
			while(c4==0);  
			key_num=15;
			displaykeynum(smg_duanma[key_num]);
		}
	}
}

void main(){

	while(1){
		scankeymulti();
	}
}

结果展示

结果也是正确显示了 

代码编写要注意那个数码管的段码 可能比赛的时候官方不给的 要自己背下来

还有就是写一段编译一段 好排查问题

注意全局变量的设置 不要设置成局部变量了

等我之后再写一篇中断和定时器hhhhhhh 

直接冲!

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值