【蓝桥杯】独立按键控制

void keyscan()
{ 
	if(P30==0)//判断S7按键是否按下
	{
		delayms(5);//防抖动延时
		if(P30==0)//再次检测按键是否按下
		{
			S7=1;   
		}
		while(!P30);//如果while(1)则程序再次死循环,
		            //就是说如果按键一直按着,则程序不会往下执行
		            //知道按键松开,则(P30)=1,则(!P30)=0,程序往下执行
	}
	else if(P31==0)
	{
		delayms(5);
		if(P31==0)
		{
			S6=1;
		}
		while(!P31);
	}
	else	if(P32==0)
	{
		delayms(5);
		if(P32==0)
		{
			S5=1;
		}
		while(!P32);
	}
	else	if(P33==0)
	{
		delayms(5);
		if(P33==0)
		{
			S4=1;
		}
		while(!P33);
	}
}



### 蓝桥杯单片机按键与定时器控制示例教程 在蓝桥杯比赛中的单片机项目开发中,可以通过定时器实现对按键的功能控制。以下是基于引用内容以及专业知识整理的一个完整的解决方案。 #### 1. 定时器基础设置 单片机的定时器通常由多个寄存器协同工作完成特定功能。其中涉及的主要寄存器有 `TCON` 和 `TMOD`[^3]。 - **TMOD 寄存器**:用于设定定时器的工作模式和操作方式。 - **TCON 寄存器**:负责启动或停止定时器,并记录中断状态。 初始化定时器 T0 的代码如下所示: ```c void Timer0_Init() { TMOD |= 0x01; // 设置T0为模式1 (16位定时器) TH0 = 0xFC; // 高8位置初值, 计算得到约50ms溢出一次 TL0 = 0x18; // 低8位置初值 EA = 1; // 开总中断 ET0 = 1; // 允许T0中断 } ``` 此部分代码设置了定时器 T0 工作于模式 1 并配置初始值以便每 50 毫秒触发一次中断。 --- #### 2. 数码管显示驱动 为了配合按键的操作反馈,在数码管上实时更新时间数据是一个常见需求。假设使用的是共阳极七段数码管,则其基本驱动逻辑可表示为: ```c #define SEG_A P2_7 #define SEG_B P2_6 #define SEG_C P2_5 #define SEG_D P2_4 #define SEG_E P2_3 #define SEG_F P2_2 #define SEG_G P2_1 void Display_Segment(unsigned char num) { switch(num){ case 0: SEG_A=0;SEG_B=0;SEG_C=0;SEG_D=0;SEG_E=0;SEG_F=0;SEG_G=1;break; case 1: SEG_A=1;SEG_B=0;SEG_C=0;SEG_D=1;SEG_E=1;SEG_F=1;SEG_G=1;break; ... } } ``` 上述代码片段展示了如何通过软件编程点亮指定数字到数码管上的方法[^1]。 --- #### 3. 独立按键处理机制 对于两个独立按键的设计方案,分别定义它们的功能:“清零”、“暂停/继续”。当检测到某个按键按下事件发生时执行相应动作即可满足题目要求。 ```c bit Key_Pressed(char key_num) { static bit last_state[2]={0}; if(key_num==1){ if(!P1_0 && !last_state[0]){ delay_ms(10); if(!P1_0)return 1; last_state[0]=1; }else{ if(P1_0)last_state[0]=0; } }else{ if(!P1_1 && !last_state[1]){ delay_ms(10); if(!P1_1)return 1; last_state[1]=1; }else{ if(P1_1)last_state[1]=0; } } return 0; } // 主循环调用 if(Key_Pressed(1)) Reset_Timer(); // 清零按钮响应 if(Key_Pressed(2)) Toggle_State(); // 启动/暂停切换 ``` 这里实现了去抖动后的按键扫描流程并绑定具体业务逻辑函数。 --- #### 4. 中断服务程序设计 最后一步是在每次定时器中断到来之后累加全局变量的时间计数值,并依据当前运行状态决定是否刷新显示屏或者重置计数器等内容。 ```c unsigned int count_time=0; void Timer0_ISR(void) interrupt 1 { TR0 = 0; // 关闭定时器防止重复进入ISR TH0 += 0xFC; // 更新高字节重新加载初值 TL0 = 0x18; // 更新低字节重新加载初值 if(state_flag != STOPPED){ // 如果不是处于暂停状态下才增加时间 count_time++; } Update_Display(count_time); // 将最新时间写入到数码管缓冲区等待渲染 TR0 = 1; // 继续开启定时器 } ``` 以上即完成了整个系统的框架搭建过程[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值