蓝桥杯单片机 赛后资料整理(二)——矩阵键盘

本文主要介绍了蓝桥杯单片机竞赛中的矩阵键盘使用,详细讲解了电路原理,提供了独立按键和矩阵键盘的代码模板。在电路中,某些引脚在不同配置下可作为独立按键或矩阵键盘使用。编程时需注意引脚替代,并避免在串口通信中使用特定按键,以防通信冲突导致Keil报错。

蓝桥杯单片机 赛后资料整理(二)——矩阵键盘


本文适用于 CT107D竞赛板+ IAP15转接板

按键

电路原理

pic1
2 3脚短接时,S4 S5 S6 S7用作独立按键;1 2脚短接时,用作4x4矩阵键盘。

需要说明的是,IAP15转接板中P36/WRP37/RD分别被P42/WR P44/RD代替,编程中需要注意。
另外,P36 P37还被用于8255WR RD,在个人练习中要防止冲突。P30 P31还被用作串口通信的TXD RXD,因此,在仿真过程中按下S7 S6等按键时,计算机与MCU之间无法实现通信,此时Keil会报错。
如果要实现串口通信或者使用仿真功能的话,尽量避免使用S7 S6按键,甚至是P30 P31

代码模板

独立按键

#include<reg52.h>

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;

bit l1=1,l2=1,l3=1;		//初始熄灭

void delay100us()		//延时100us@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}
void delay300ms()		//延时300ms@12.000MHz
{
	unsigned char i, j, k;

	i = 14;
	j = 174;
	k = 224;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


bit scans4(){
	if(S4==0){
		delay100us();//消抖
		if(S4==0){
			return 1;
		}
	}
	return 0;
}
bit scans5(){
	if(S5==0){
		delay100us();//消抖
		if(S5==0){
			return 1;
		}
	}
	return 0;
}
bit scans6(){
	if(S6==0){
		delay100us();//消抖
		if(S6==0){
			return 1;
		}
	}
	return 0;
}
bit scans7(){
	if(S7==0){
		delay100us();//消抖
		if(S7==0){
			return 1;
		}
	}
	return 0;
}

int main(){	
	P3|=0x0f;
	//初始化
	while(1){
		//按下S7点亮L1,按下S6熄灭L1
		if(scans7())
			l1=0;
		if(scans6())
			l1=1;
		//按下S5时,L2亮,松开S5时,L2灭
		if(scans5())
			l2=0;
		else
			l2=1;
		//按一次S4,L3亮,再按一次,L3灭
		if(scans4()){
			delay300ms();
			l3=~l3;
		}
		//设置锁存器,控制LED灯
		P2&=0x1f;
		P0=0xff;L1=l1;L2=l2;L3=l3;
		P2|=0x80;	
		P2&=0x1f;
	}
}

矩阵键盘

#include <STC15F2K60S2.H>//使用P4时,注意修改头文件

#ifndef u8
#define u8 unsigned char
#endif 

u8 code font[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 code y6=0xc0,y7=0xe0;
u8 dis[2],key;

void delay100us()		//延时100us@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}
u8 scankey(){
	u8 key;

	P42=0;P44=0;P3=0x0f;
	if(P3!=0x0f){
		delay100us();
		if(P3!=0x0f){
			key=P3;
			P3=0xf0;P42=1;P44=1;
			key|=P3;
			if(P42==0) key&=0xbf;
			if(P44==0) key&=0x7f;
			switch(key){
				//返回按键编号
				case 0x77:return 4;
				case 0x7b:return 5;
				case 0x7d:return 6;
				case 0x7e:return 7;
				case 0xb7:return 8;
				case 0xbb:return 9;
				case 0xbd:return 10;
				case 0xbe:return 11;
				case 0xd7:return 12;
				case 0xdb:return 13;
				case 0xdd:return 14;
				case 0xde:return 15;
				case 0xe7:return 16;
				case 0xeb:return 17;
				case 0xed:return 18;
				case 0xee:return 19;
			}
		}	
	}
	return 0;
}
//数码管显示
void display(){
	u8 i;

	//显示按键编号
	dis[0]=font[key/10];
	dis[1]=font[key%10];
	
	for(i=0;i<2;i++){
		P2&=0x1f;
		P0=1<<i;
		P2|=y6;
		P2&=0x1f;
		P0=dis[i];
		P2|=y7;
		delay100us();
		P0=0xff;
	}
	P2&=0x1f;
}
int main(){
	while(1){
		key=scankey();
		display();	
	}
}
### 关于蓝桥杯单片机第十届国赛的题目与解题报告 #### 资料概述 蓝桥杯全国大学生单片机设计大赛是一项备受关注的比赛,其核心目标在于考察参赛者的理论基础、实践能力以及创新能力[^2]。对于第十届蓝桥杯嵌入式的赛后总结及相关建议已经有所提及[^1],这可以作为理解比赛整体流程的重要参考资料。 #### 题目获取途径 官方并未公开历年的具体国赛题目及其标准解答文档,因此要获得第十届蓝桥杯单片机国赛的具体题目,可以通过以下方式尝试: - **购买官方出版物**:部分培训机构或出版社整理并发布了往届蓝桥杯竞赛的真实试题集,这些书籍通常包含了详细的题目解析代码实现。 - **在线资源平台**:一些技术论坛或者教育网站可能分享了由参赛选手回忆记录下来的版本,虽然可能存在偏差但仍具有一定的参考价值。 - **联系高校教练团队**:许多学校会保存历年参加各类科技竞赛所积累的经验材料,包括但不限于模拟训练习题库及实际考题回顾等信息。 #### 解题思路分析 针对单片机类别的挑战项目,一般涉及硬件电路搭建、软件编程调试等多个方面的工作内容。以下是基于以往经验给出的一般性指导原则: ##### 硬件选型与接口配置 在面对具体的任务需求时,合理选择合适的微控制器型号至关重要。同时还需要考虑外设模块的选择如传感器阵列、显示单元等人机交互界面的设计方案。 ```c // 示例代码片段展示如何初始化I/O端口方向设置 void GPIO_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); } ``` ##### 嵌入式算法开发 根据不同的应用场景编写相应的控制逻辑程序,比如定时器中断服务函数用于精确计时操作;PWM波形发生器驱动电机转速调节等等功能模块都需要精心规划与测试验证过程才能确保最终作品能够稳定运行达到预期效果。 ##### 测试优化环节 完成初步编码之后进入全面的功能检测阶段,在此期间应该注意收集各种边界条件下的表现数据以便进一步改进完善整个系统的性能指标参数设定值范围调整等工作直至满足全部考核要点为止。 #### 总结陈词 通过上述方法可以获得有关第十届蓝桥杯单片机国赛的部分资料线索,并按照既定框架结构开展深入学习研究活动从而提高自身的综合竞争力水平为未来参与更高层次的竞争奠定坚实的基础前提条件下争取优异成绩回报自我努力付出成果体现个人实力风采展现团体协作精神风貌共同进步成长!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值