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

本文详细介绍了矩阵键盘的工作原理,包括其布局、独立按键与矩阵模式的区别,以及使用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
    评论
蓝桥杯单片机定时器小蜜蜂是一个用于学习和实践单片机编程的教学项目。根据引用,在这个项目中,按键等待是一个关键操作,需要将显示时间的模块放在循环中,并且通过定时器中断来控制操作的时间。同时,引用提到LED和数码管的P0口端口被复用,用来记录串口发送的数据和判断按键是否按下。关于蓝桥杯单片机定时器小蜜蜂的具体内容,引用提供了一份目录,其中包括了一些进阶的案例和底层驱动代码的移植与应用。 总结来说,蓝桥杯单片机定时器小蜜蜂是一个教学项目,通过学习它可以了解和练习单片机编程的一些基础和高级操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [蓝桥杯单片机-小蜜蜂老师-工厂灯光控制系统(P15代码)](https://blog.csdn.net/m0_61804419/article/details/129488234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [备战蓝桥杯单片机倒数第四天 小蜜蜂老师公众号更新内容](https://blog.csdn.net/silver321/article/details/123969400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值