目录
3.由state控制L1亮灭,当L1亮时,可以通过任意按键关闭L1,且不执行按键原功能
4.state=1,num++;state=0,num--(在按键按下后生效)
6.长按后,num++快速,题目如果没有减按键,达到上限就归0,如果对时间有要求,就设置定时器
声明:根据柳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
题目:按键S4
1.按下松手后数字加1,数码管显示
2.按下显示界面1,松手显示界面2
3.由state控制L1亮灭,当L1亮时,可以通过任意按键关闭L1,且不执行按键原功能
4.state=1,num++;state=0,num--(在按键按下后生效)
if(state==1)num++;else num--;
5.长按L1亮,再长按L1灭
6.长按后,num++快速,题目如果没有减按键,达到上限就归0,如果对时间有要求,就设置定时器
7.长按后松手,num++
8.长按短按都有效
长按,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),让第一个按键按下仍可以检测,然后分别给俩次按下做标记,并进行判断
国赛:同时按下并持续俩秒
#我十六届省赛考试就考到这个了【哭泣】#
矩阵键盘的双按
俩独立功能放在松手前测试

