蓝桥杯51单片机设计

发布于:2025-07-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

#独立按键优化<精品>#

优化1:

按键抖动过程

此按键消抖的缺点与改进

程序设计

优化2:

题目:按键S4

1.按下松手后数字加1,数码管显示

2.按下显示界面1,松手显示界面2

3.由state控制L1亮灭,当L1亮时,可以通过任意按键关闭L1,且不执行按键原功能

4.state=1,num++;state=0,num--(在按键按下后生效)

5.长按L1亮,再长按L1灭

6.长按后,num++快速,题目如果没有减按键,达到上限就归0,如果对时间有要求,就设置定时器

7.长按后松手,num++

8.长按短按都有效

按键进阶,长按短按松手判别

用矩阵键盘实现长按短按

矩阵键盘的一般代码编写:

双按键

国赛:同时按下并持续俩秒

矩阵键盘的双按

俩独立功能放在松手前测试


声明:根据柳up课程讲解编写的文章

#独立按键优化<精品>#

优化1:

按键抖动过程

此按键消抖的缺点与改进

程序设计

sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;

unsigned char key_up=1;//按键松手标志位

//按键进阶
unsigned char key_scan()
{
	if(key_up==1&&(S4==0||S5==0||S6==0||S7==0))//四个按键中只要有一个被按下
	{
		key_up=0;
		delay_ms(20);//消抖
		if(S7==0) return 1;//按键被按下
		else if(S6==0) return 2;
		else if(S5==0) return 3;
		else if(S4==0) return 4;
	}
	else if(S4==1&&S5==1&&S6==1&&S7==1)//四个按键都松手
	{
		key_up=1;
	}
	return 0;
}

优化2:

一般题目是按下就生效,松手生效会强调松开生效

①按下生效

②松手生效

①②结合,按下模式1,松时模式2

③在某个模式下,任意按键都生效,且不发挥原有功能

④只在某个模式生效

⑤长按生效

⑥长按松手生效

⑦长按短按俩个效果

若是长按生效,另起一行进行判断时间

若是长按松手后生效,放在松手else if里面进行判断

松手判断,不需要在else if里将标志位置零,直接判断为0

题目:按键S

.按下松手后数字加1,数码管显示

.按下显示界面1,松手显示界面2
.由state控制L1亮灭,当L1亮时,可以通过任意按键关闭L1,且不执行按键原功能

.state=1,num++;state=0,num--(在按键按下后生效)

ifstate==1)num++;else num--;

.长按L1亮,再长按L1灭

.长按后,num++快速,题目如果没有减按键,达到上限就归0,如果对时间有要求,就设置定时器

.长按后松手,num++

.长按短按都有效

长按,L1亮,短按num++

if(flag==1 && systick_ms-key_time>1000)

{flag==0;return ~state1;}

else

{flag==0;return num++;}

按键进阶,长按短按松手判别

长按短按相互独立,短按控制L1亮灭,长按控制数码管显示加1

长按与短按区别在于时间,在按下开始计时时,松手计算按下时间,判断长短按

定义同一按键连续俩次按下时间小于500ms为一次双击,

双击与单击功能独立,双击数码管值加1,单机控制L1亮灭

第一次按下时间与第二次按下的时间差<500,为双击

第一次按下松手到第二次按下松手的时间>500,为单击

用矩阵键盘实现长按短按

矩阵键盘的一般代码编写:
#include "key.h"
uchar key_up=1;
uchar key_scan()
{
	uchar key;
	P44=P42=P35=P34=0;
	P30=P31=P32=P33=1;
	if(key_up==1&&(P30==0||P31==0||P32==0||P33==0))
	{
		key_up=0;
		if(P30==0)key=7;
		else if(P31==0)key=6;
		else if(P32==0)key=5;
		else if(P33==0)key=4;
		P44=P42=P35=P34=1;
	    P30=P31=P32=P33=0;
          if(P44==0||P42==0||P35==0||P34==0)
			{
				if(P44==0)key=key;
				else if(P42==0)key=key+4;
				else if(P35==0)key=key+8;
				else if(P34==0)key=key+12;
			}
			return key;

	}
	else if(P30==1&&P31==1&&P32==1&&P33==1)
	{
		key_up=1;
	}
	return 0;
}

双按键

俩按键都有对应的功能,当俩个按键同时被按下,就会实现第三个功能

思路:俩按键功能需要松手才能生效(当按键按下后,key_up=0,下一个按键无法进入按键判断),所以俩次按下时间有要求,key_up为按下标志位,必须改动(按下按键不要置0),让第一个按键按下仍可以检测,然后分别给俩次按下做标记,并进行判断

国赛:同时按下并持续俩秒

#我十六届省赛考试就考到这个了【哭泣】#

矩阵键盘的双按

俩独立功能放在松手前测试


网站公告

今日签到

点亮在社区的每一天
去签到