[蓝桥杯国赛]按键长按

博客围绕单片机按键操作展开,指出注意判断条件应为(key_press==0x77)而非key_return == 4。还分析了按键长按实现功能的思路,即按下后变量自加,达到一定量标志置1以实现功能,同时强调key_i需在某处固定清零,避免多次短按触发长按功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意点

(key_press==0x77)而不是key_return == 4

分析

按键长按实现功能的思路是:
如果按下后一个变量会自加,满足一定量时候,让一个标志为1,我们就可以用这个标志去实现我们想要的功能

//节选代码
case KEY_STATE_2:
			if(key_press == NO_KEY)
			{
				key_state = KEY_STATE_0;
			}
			else
			{
				if(key_press==0x77)	//按键是S4
				{
					key_i++;
					if(key_i==500)	//大约是1秒多
					{
						key_i=0;led_flag=1;
					}
				}
			}

这个key_i最好在某个地方可以固定清零,不然多次短按后也会触发这个长按的功能

### 蓝桥杯中的矩阵按键定时器实现方案 在蓝桥杯中,矩阵按键的设计通常涉及扫描电路以及检测按键状态的变化。为了提高系统的响应速度并减少资源占用,可以引入定时器来优化按键扫描逻辑。以下是基于定时器的矩阵按键实现方案及其示例代码。 #### 1. 定时器的作用 定时器的主要作用是在固定的时间间隔内触发中断服务程序 (ISR),从而定期执行按键扫描操作。这种方法不仅可以降低 CPU 的负担,还能有效防止因频繁轮询而导致的性能下降[^1]。 #### 2. 状态机设计思路 利用状态机的思想处理按键事件能够显著提升程序的可维护性和扩展性。通过结合定时器中断,可以在每次中断发生时更新按键的状态,并根据当前状态决定是否触发相应的动作[^3]。 #### 3. 示例代码:基于定时器的矩阵按键扫描 以下是一个简单的 C 语言实现案例,展示了如何使用定时器配合状态机完成矩阵按键的功能: ```c #include <reg52.h> sbit LED1 = P1^0; sbit LED2 = P1^1; unsigned char Trg = 0, Cont = 0; // 按键状态变量 // 中断服务函数声明 void Timer0_ISR(void) __interrupt 1 { TH0 = 0xFC; // 设置重载值 TL0 = 0x67; // 配置为每 1ms 触发一次 unsigned char ReadData = P3 ^ 0xFF; // 获取端口数据 Trg = ReadData & (ReadData ^ Cont); // 更新短按标志 Cont = ReadData; // 记录按标志 } // 初始化定时器 T0 void Init_Timer0() { TMOD |= 0x01; // 工作模式 1 TH0 = 0xFC; // 初始计数值高字节 TL0 = 0x67; // 初始计数值低字节 ET0 = 1; // 开启 T0 中断 EA = 1; // 总中断使能 TR0 = 1; // 启动定时器 } // 键盘读取函数 void Key_Read() { if (Trg == 0x08) { // S4 短按 LED1 = ~LED1; // 切换 LED1 状态 } else if (Trg == 0x04) { // S5 短按 LED2 = ~LED2; // 切换 LED2 状态 } } void main() { Init_Timer0(); // 初始化定时器 while (1) { Key_Read(); // 执行按键读取功能 } } ``` 上述代码实现了如下功能: - 使用定时器 `T0` 来周期性地调用按键扫描逻辑。 - 当检测到特定按键被按下时,切换对应的 LED 状态作为反馈信号。 #### 4. 双按键组合识别 对于双按键问题,在蓝桥杯阶段可能会考察更复杂的场景,比如同时按下两个按键后的特殊行为。可以通过修改 `Key_Read()` 函数来支持多按键组合的判断[^2]。 例如,增加对 `(Trg == 0x0C)` 的条件分支即可捕获 S4 和 S5 同时按下的情况。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值