首页 > 其他分享 >蓝桥杯单片机小蜜蜂学习笔记——矩阵键盘

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

时间:2024-03-19 21:58:06浏览次数:32  
标签:while 蓝桥 单片机 小蜜蜂 num key c3 c2 c1

笔记仅供学习参考

学习视频链接

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="hPnGb6p9-1710838376424" src="https://player.bilibili.com/player.html?aid=41275873&page=7"></iframe>

【基础技能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;
	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 

直接冲!

标签:while,蓝桥,单片机,小蜜蜂,num,key,c3,c2,c1
From: https://blog.csdn.net/weixin_44554793/article/details/136847943

相关文章

  • 蓝桥杯题目-可构造的序列总数
    链接可构造的序列总数-蓝桥云课(lanqiao.cn)知识点动态规划思路        定义表示序列长度为,以结尾的合法序列的数量 ,初始化时有。因为题意要求 是 的倍数,所以在转移时每个数应该从它的因子转移过来,即:                        ......
  • 【蓝桥杯选拔赛真题70】python最短路径和 第十五届青少年组蓝桥杯python选拔赛真题 算
    目录python最短路径和一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python最短路径和第十五届蓝桥杯青少年组python比赛选拔赛真题一、题目要求(注:i......
  • 蓝桥杯单片机快速开发笔记——超声波测距
    一、原理分析        超声波测距是一种常见的测距方法,其原理是利用超声波在空气中传播的速度恒定且较快的特性,通过发送超声波信号并接收回波,计算出物体与传感器之间的距离。以下是超声波测距的原理和应用:原理:发送超声波信号:超声波传感器发送一个短脉冲的超声波信......
  • 蓝桥杯 X进制减法
    注意,一定不要给(A[i]-B[i])*w取模,因为它可能是负数!!!这个错误我检查了俩小时,呜呜呜呜呜呜呜除此之外这题只要思路对了,难度是比较小的题目思路:1.反向输入,因为权重和题目顺序是相反的      2.B数组的大小要和A一样,因为A长度比较大,或者二者一样长  ......
  • 用 滑动窗口 算法 解决 蓝桥杯子矩阵 的运行超时 问题
    这题如果用暴力算法解决,会用到四个for循环。当数据很大时,会超时,无法通过蓝桥杯。如果掌握了二维滑动窗口,会让时间复杂度减少俩个数量级,很好地解决超时的问题。关于滑动窗口算法,如果读者不会的话,建议去哔站看大佬的讲解视频,笔者也是昨天才学的。如果已经会了滑动窗口算法,......
  • P8685 [蓝桥杯 2019 省 A] 外卖店优先级
    这道题虽然难度很低,但是细节不少1.要先处理减,再处理加。因为是先经历了空档期的优先级衰减,然后才有订单带来的优先级提升;先减后加的时候有0这个下限兜底,如果先加后减可能会导致答案偏小。2.减之后和加之后都要check一下,如果in_cache为true,减完之后小于等于三,但是加了以后又上升......
  • 单片机各种位运算总结
    单片机各种位运算总结当在单片机中需要进行寄存器操作或者读取/发送数据时,可能用到位操作,因此在此做一个总结,将可能用到的位操作进行一个总结并解析。位运算具体的计算方式:【STM32】位操作、按位与、按位或、按位异或、取反、左移、右移等基础C语言知识补充_按位与操作是什么......
  • 0098-基于单片机的洗衣机仿真设计
    功能描述1、采用51/52单片机作为主控芯片;2、采用数码管显示计时秒数,单个操作均为20秒;3、采用继电器控制进水、排水;4、采用L298驱动电机;5、具有强洗、标准洗、弱洗、甩干四种模式;6、强洗流程:进水、三轮洗涤、排水、甩干、进水、漂洗、排水、甩干;7、标准洗流程:进水、两轮......
  • 692、基于51单片机的自行车(调速,LCD1602)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能自行车调速系统1、使用LCD1602显示当前速度和设置速度2、使用电位器设置当前速度,模拟把手调速3、按键启停系统4、速度控制......
  • 693、基于51单片机的RGB调色(PWM)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能采用PWM调制方式进行三基色LED配色控制的研究,实验证明其电路简单、操作方便,能很好的实现各种颜色的配置和切换使用6个按键分别......