蓝桥杯单片机独立按键和矩阵按键

首先看原理图

1. 独立按键:

注意:我们使用蓝桥杯的板子时候,写代码之前一定要将在板子上将J523用跳线帽连接起来

检测原理:

51单片机上电之后P38IO口全部都是高电平,按键一端连接的是GND,按键按下电路接通使得另外一端的电平变成了低电平,也就是说我们只要检测对应的IO口是不是低电平就可以检测按键是否按下。

从原理图可以看到,J523连接的时候,如果S7被按下,P30会变成低电平,同样的S6对应着P31,S5对应P32,S4对应P33

程序目的:将每次的键值在数码管上面显示出来

程序测试:

我们只需要看P3的低三位哪一个是低电平,就可以知道哪一个键被按下

下面程序就是用数码管将键值打印出来,当没有独立按键按下时数码管显示0,有键按下的时候显示键值.


//按键检测函数
unsigned char key_scan(){
	unsigned char key_value = 0;
	//当独立按键按下时,会使低三位有一个不是高电平
	if((P3&0x0F)!=0x0F){
		delay_ms(50); //延时消抖
		if((P3&0x0F)!=0x0F){
			switch(P3&0x0F){
			case 0x0e:key_value = 7;break;
			case 0x0d:key_value = 6;break;
			case 0x0b:key_value = 5;break;
			case 0x07:key_value = 4;break;
			}
		
		}
	
	}
	return key_value;
}

void main()
{
	while(1){
//关于数码管的显示的函数我有篇文章已经专门写好
	display_num(1,key_scan());
	}
}

2. 矩阵按键

首先我们必须非常清楚独立按键的原理,才能继续玩矩阵按键,独立按键是因为按键的一端连接GND,另一端连接IO,当按键按下的时候电路接通,IO口为低电平判断按键被按下.

我么检测矩阵按键也可以是同样的思路,这个时候我们蓝桥杯只要将J512引脚连上就可以用矩阵按键了,当时唯一值得注意的是,如果我们用时蓝桥杯的转接板有些引脚就不一样,我们的P36被替换成了P42,P37替换成了P44.在这里我们不考虑转接板的情况.

根据原理图,我们循环给某一行或者循环给某一列低电平,加入我们循环给四列依次给其中一列低电平,其他的列给高电平,检测行变化,某个键被按下会导致相应的行产生低电平,注意单片机的电平变化是”与”的关系,只有有一方为低电平,另外一方就会为低电平,这是单片机IO口内部结构决定的.我们根据相应的行和列出现低电平的位置就可以计算出被按下的键的位置

unsigned char key_code[] = {0x7f,0xbf,0xdf,0xef};
//按键扫描函数
unsigned char key_scan()
{
	
	int i,key_value=0;
	//判断按键
	for(i=0;i<4;i++)
	{
		P3 = key_code[i];
		//如果检测到按键被按下
		if(P3!=key_code[i])
		{
			delay_ms(20);//延时消抖
			if(P3!=key_code[i])//如果仍然检测到按键被按下,则按键真的被按下
			{
				switch(P3&0x0f)
				{
					//检测按键是不是松开
					case(0x0e):{while(P3==(key_code[i]&0xfe));key_value=4*i+7;}break;
					case(0x0d):{while(P3==(key_code[i]&0xfd));key_value=4*i+6;}break;
					case(0x0b):{while(P3==(key_code[i]&0xfb));key_value=4*i+5;}break;
					case(0x07):{while(P3==(key_code[i]&0xf7));key_value=4*i+4;}break;
				}
				
			}
		}
	}
	return key_value;
}



<think>好的,用户想了解蓝桥杯单片机比赛中独立按键与数码管的综合应用方案。我需要先回忆相关的模块知识常见的设计方法。首先,蓝桥杯单片机通常使用IAP15F2K61S2型号,开发环境是Keil C51,所以代码需要符合C51的语法。 独立按键的检测通常涉及到矩阵扫描或者独立IO口检测。考虑到比赛中的硬件设计,可能使用的是矩阵键盘,或者是独立连接的按键。这里需要确认用户提到的“独立按键”是否指每个按键单独连接到一个IO口,还是矩阵排列。通常比赛中可能采用矩阵排列以节省IO资源,但用户的问题里提到的是独立按键,可能指的是每个按键独立连接。 数码管的显示一般采用动态扫描的方式,因为每个数码管的段选线是并联的,通过位选线控制哪个数码管亮。动态扫描需要定时刷新,否则会有闪烁问题。需要结合定时器中断来实现稳定的显示。 综合应用的话,可能需要通过按键控制数码管显示的内容,比如按下不同的按键显示不同的数字或模式。例如,按键调整参数,数码管实时显示数值。这时候需要处理好按键消抖,防止误触发,同时数码管的刷新不能因为按键处理而延迟。 现在要提供一个示例教程的结构。首先需要初始化数码管按键的IO口,数码管通常使用锁存器控制,比如74HC573来切换段选位选。然后需要编写数码管显示函数,动态扫描每一位。按键部分需要检测按键状态,消抖处理,并执行相应的功能,比如增减数值,切换显示模式等。 代码部分可能需要包含头文件reg52.h,定义数码管按键的IO口,编写延时函数用于消抖,数码管显示码表,以及主函数中的循环检测按键刷新数码管。 需要注意的是,比赛中可能有一些特定的底层代码模板,比如蓝桥杯提供的驱动代码,用户可能需要根据这些模板进行修改。例如,引用中的代码库可能已经包含了一些模块的初始化函数,需要整合到综合应用中。 可能的问题包括按键扫描与数码管刷新的时序冲突,需要确保数码管刷新频率足够高,同时按键检测及时响应。使用定时器中断来定时刷新数码管可能更可靠,这样主循环可以处理按键其他逻辑。 总结步骤:硬件介绍、初始化设置、按键检测逻辑、数码管显示逻辑、综合应用示例(如按键调整数码管显示数值),并附上代码示例。同时要提醒用户注意消抖、资源冲突以及根据具体硬件调整IO口定义。</think>### 蓝桥杯单片机独立按键与数码管综合应用方案 #### 一、硬件基础 蓝桥杯单片机开发板(IAP15F2K61S2)中,独立按键通常连接在$P3$端口(如$P3.0-P3.3$),数码管通过$P0$端口锁存器(如74HC573)控制段选与位选信号[^1]。 #### 二、实现步骤 1. **初始化设置** - 配置$P0$为推挽输出模式 - 设置锁存器控制引脚(如$P2.5$控制段选,$P2.6$控制位选) 2. **按键扫描逻辑** ```c unsigned char KeyScan() { unsigned char key_val = 0; if (P30 == 0) { DelayMs(10); if (P30 == 0) key_val = 1; } //K1 if (P31 == 0) { DelayMs(10); if (P31 == 0) key_val = 2; } //K2 while (!P30 || !P31); //等待释放 return key_val; } ``` 3. **数码管动态显示** ```c void Display(unsigned char pos, unsigned char num) { P2 = (P2 & 0x1F) | 0xE0; //段选锁存器 P0 = SegCode[num]; //段码输出 P2 &= 0x1F; P2 = (P2 & 0x1F) | 0xC0; //位选锁存器 P0 = 0x01 << (pos-1); //位选信号 P2 &= 0x1F; } ``` #### 三、综合应用示例 **功能要求**:通过K1/K2控制数码管显示数值增减,长按快速调整 ```c unsigned char count = 0; void main() { while(1) { switch(KeyScan()) { case 1: count++; break; //K1增加 case 2: count--; break; //K2减少 } //显示个位十位 Display(1, count/10); Display(2, count%10); DelayMs(2); //控制刷新频率 } } ``` #### 四、关键注意事项 1. **消抖处理**:按键检测需包含$10-20ms$延时去抖动 2. **资源冲突**:数码管刷新间隔建议$1-5ms$,避免闪烁 3. **长按检测**:可通过定时器记录按键持续时间实现加速调整 : 参考蓝桥杯官方提供的模块驱动代码,包含数码管按键的底层操作实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值