上一篇文章中,按键的长按短按是按照 短按--第一次长按--第二次长按,按顺序来的。

但是今天重读考题发现,考察的不是按顺序先短按,后长按一个一个来;而是对按下时间长短有一个判断;比如说:只要按下按键,小于1秒判定为短按;大于5秒判定为长按。所以对程序再次进行更改。

目录

独立按键的长按短按:

题目1:仅有一个按键的长按短按

题目2:按键长按涉及次数问题

题目3:涉及其他按键的长按短按

矩阵按键的长按短按

独立按键的长按短按:

题目1:仅有一个按键的长按短按

长按S7按键大于5秒,判定为长按键,让LED1亮起;短按S7按键小于1秒,判定为短按键,让LED2亮起。

规定一个S7按键的标志位:S7_flag=0;在S7按键按下之后,标志位置1;S7按键松开之后,标志位置0。在定时器里面按下按键之后,时间增加;按键松开之后,对时间进行检测。小于1秒,判定为短按键,大于5秒,判定为长按键。

注意:S7按键松开,标志位置0的程序要与S7按键按下的程序处于同一等级。

程序:

uchar S7_flag=0;
uint S7_tt=0;void timer0() interrupt 1
{if(S7_flag==1)//按下之后,时间增加{S7_tt++;}else if(S7_flag==0)//松开按键{if((S7_tt>200)&&(S7_tt<1000))//短按{S7_tt=0;P2=0X80;P0=0XFD;}else if(S7_tt>5000)//长按{S7_tt=0;P2=0X80;P0=0XFE;}      }
}void Keyscan()
{if(P30==0){Delayms(5);if(P30==0){if(S7_flag==0)S7_flag=1;}while(!P30);}else if(P30==1)//S7松开{S7_flag=0;}
}void Timer0Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初始值TH0 = 0xD4;       //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0=1;EA=1;
}

题目2:按键长按涉及次数问题

第一次长按S7按键大于5秒,判定为长按键,让LED1亮起;第二次长按S7按键大于5秒,判定为长按键,让LED3亮起;

短按S7按键小于1秒,判定为短按键,让LED2亮起。

只需要添加一个次数变量即可,当第一次长按之后,改变量变为1,那么在第二次长按之前加入判断条件:次数变量是否为1,如果是,就执行第二次长按的程序。

程序:

uchar S7_flag=0;
uint S7_tt=0;
uchar cishu=0;void timer0() interrupt 1
{if(S7_flag==1)//按下之后,时间增加{S7_tt++;}else if(S7_flag==0)//松开按键{if((S7_tt>200)&&(S7_tt<1000))//短按{S7_tt=0;P2=0X80;P0=0XFD;}else if((S7_tt>5000)&&(cishu==0))//第一次长按{S7_tt=0;P2=0X80;P0=0XFE;cishu=1;}      else if((S7_tt>5000)&&(cishu==1))//第二次长按{S7_tt=0;P2=0X80;P0=0XFB;cishu=0;} }
}void Keyscan()
{if(P30==0){Delayms(5);if(P30==0){if(S7_flag==0)S7_flag=1;}while(!P30);}else if(P30==1)//S7松开{S7_flag=0;}
}void Timer0Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初始值TH0 = 0xD4;       //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0=1;EA=1;
}

题目3:涉及其他按键的长按短按

长按S7按键大于5秒,判定为长按键,让LED1亮起;短按S7按键小于1秒,判定为短按键,让LED2亮起;

长按S6按键大于5秒,判定为长按键,数码管2显示2;短按S6按键小于1秒,判定为短按键,数码管1显示1

这是一个多按键的情况,这里要注意,当我们检测到S7按键松开(未按下)的时候,会一直卡在这个检测里面不出来,这导致其他的按键程序无法实现。所以,我们要把其他的程序写在检测S7按键未松开程序里面,形成嵌套。

其他写法与上面相同。

程序:

#include <STC15F2K60S2.H>#define uchar unsigned char
#define uint unsigned int uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar Smg_num=0;
uchar Smg[8]={11,11,11,11,11,11,0,3};uchar S7_flag=0,S6_flag=0;
uint S7_tt=0,S6_tt=0;void Allinit();
void Delayms(uint ms);
void Keyscan();
void Timer2Init(void);      //1毫秒@11.0592MHz
void Timer0Init(void);      //1毫秒@11.0592MHzvoid main()
{Allinit();Timer0Init();Timer2Init();while(1){Keyscan();//Delayms(5);   }
}void timer0() interrupt 1
{if(S7_flag==1)//按下之后,时间增加{S7_tt++;}else if(S7_flag==0)//松开按键{if((S7_tt>200)&&(S7_tt<1000))//短按{S7_tt=0;P2=0X80;P0=0XFD;}else if(S7_tt>5000)//长按{S7_tt=0;P2=0X80;P0=0XFE;}      }if(S6_flag==1)//按下之后,时间增加{S6_tt++;}else if(S6_flag==0)//松开按键{if((S6_tt>200)&&(S6_tt<1000))//短按{Smg[0]=1;S6_tt=0;}else if(S6_tt>5000)//长按{Smg[1]=2;S6_tt=0;}      }
}void Keyscan()
{if(P30==0){Delayms(5);if(P30==0){if(S7_flag==0)S7_flag=1;}while(!P30);}else if(P30==1)//S7松开{S7_flag=0;if(P31==0){Delayms(5);if(P31==0){if(S6_flag==0)S6_flag=1;}while(!P31);}else if(P31==1)//S6松开{S6_flag=0;if(P32==0)//S5{Delayms(5);if(P32==0){Smg[2]=3;}while(!P32);}else if(P33==0)//S4{Delayms(5);if(P33==0){Smg[3]=4;}while(!P33);}}     }
}void Timer0Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初始值TH0 = 0xD4;       //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0=1;EA=1;
}void timer2() interrupt 12
{P2|=0XC0;P2&=0XDF;P0=(1<<Smg_num);P2|=0XE0;P2&=0XFF;P0=tab[Smg[Smg_num]];if(++Smg_num==8)Smg_num=0;
}void Timer2Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x04;     //定时器时钟1T模式T2L = 0xCD;     //设置定时初始值T2H = 0xD4;       //设置定时初始值AUXR |= 0x10;     //定时器2开始计时IE2|=0X04;EA=1;
}void Allinit()
{P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}void Delayms(uint ms)
{uint i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--);
}

矩阵按键的长按短按:

题目:

长按S7按键大于5秒,判定为长按键,让LED1亮起,短按S7按键小于1秒,判定为短按键,让LED2亮起;
长按S6按键大于5秒,判定为长按键,数码管2显示2,短按S6按键小于1秒,判定为短按键,数码管1显示1;
长按S11按键大于5秒,判定为长按键,让LED4亮起,短按S11按键小于1秒,判定为短按键,让LED3亮起;
长按S10按键大于5秒,判定为长按键,数码管4显示4,短按S10按键小于1秒,判定为短按键,数码管3显示3。

还是将矩阵按键改成独立按键相似的格式写,在S7按键按下之后,标志位置1,然后在定时器里面计时,实现程序。在S7按键未按下(P30==1)对第一列剩下按键的操作进行书写。

程序:

#include <STC15F2K60S2.H>#define uchar unsigned char
#define uint unsigned int uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar Smg_num=0;
uchar Smg[8]={11,11,11,11,11,11,0,3};uchar S7_flag=0,S6_flag=0,S11_flag=0,S10_flag=0;
uint S7_tt=0,S6_tt=0,S11_tt=0,S10_tt=0;void Allinit();
void Delayms(uint ms);
void Keyscan16();
void Timer2Init(void);      //1毫秒@11.0592MHz
void Timer0Init(void);      //1毫秒@11.0592MHzvoid main()
{Allinit();Timer2Init();Timer0Init();   while(1){Keyscan16();//Delayms(5);  }
}void timer0() interrupt 1
{if(S7_flag==1)//按下之后,时间增加{S7_tt++;}else if(S7_flag==0)//松开按键{if((S7_tt>200)&&(S7_tt<1000))//短按{S7_tt=0;P2=0X80;P0=0XFD;}else if(S7_tt>5000)//长按{S7_tt=0;P2=0X80;P0=0XFE;}      }if(S6_flag==1)//按下之后,时间增加{S6_tt++;}else if(S6_flag==0)//松开按键{if((S6_tt>200)&&(S6_tt<1000))//短按{Smg[0]=1;S6_tt=0;}else if(S6_tt>5000)//长按{Smg[1]=2;S6_tt=0;}      }if(S11_flag==1)//按下之后,时间增加{S11_tt++;}else if(S11_flag==0)//松开按键{if((S11_tt>200)&&(S11_tt<1000))//短按{S11_tt=0;P2=0X80;P0=0XFB;}else if(S11_tt>5000)//长按{S11_tt=0;P2=0X80;P0=0XF7;}      }if(S10_flag==1)//按下之后,时间增加{S10_tt++;}else if(S10_flag==0)//松开按键{if((S10_tt>200)&&(S10_tt<1000))//短按{Smg[2]=3;S10_tt=0;}else if(S10_tt>5000)//长按{Smg[3]=4;S10_tt=0;}      }
}void Keyscan16()
{   P3=0X7F;P42=1;P44=0;P35=1;P34=1;if(P30==0){Delayms(5);if(P30==0){if(S7_flag==0)S7_flag=1;}while(!P30);}else if(P30==1)//S7松开{S7_flag=0;if(P31==0){Delayms(5);if(P31==0){if(S6_flag==0)S6_flag=1;}while(!P31);}else if(P31==1)//S6松开{S6_flag=0;}}P3=0XBF;P42=0;P44=1;P35=1;P34=1;if(P30==0){Delayms(5);if(P30==0){if(S11_flag==0)S11_flag=1;}while(!P30);}else if(P30==1)//S7松开{S11_flag=0;if(P31==0){Delayms(5);if(P31==0){if(S10_flag==0)S10_flag=1;}while(!P31);}else if(P31==1)//S6松开{S10_flag=0;}}
}void Timer0Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0xCD;       //设置定时初始值TH0 = 0xD4;       //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0=1;EA=1;
}void timer2() interrupt 12
{P2|=0XC0;P2&=0XDF;P0=(1<<Smg_num);P2|=0XE0;P2&=0XFF;P0=tab[Smg[Smg_num]];if(++Smg_num==8)Smg_num=0;
}void Timer2Init(void)      //1毫秒@11.0592MHz
{AUXR |= 0x04;     //定时器时钟1T模式T2L = 0xCD;     //设置定时初始值T2H = 0xD4;       //设置定时初始值AUXR |= 0x10;     //定时器2开始计时IE2|=0X04;EA=1;
}void Allinit()
{P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}void Delayms(uint ms)
{uint i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--);
}

对于组合按键,在上一篇文章中提到过。

https://blog.csdn.net/ChenWenHaoHaoHao/article/details/124369224

按键的拓展:长按短按 (2)相关推荐

  1. 蓝桥杯按键识别(长按短按,按下与松开)

    先附上代码 主要根据按键是否按下的标志位实现 unsigned char BTNkey_readonce_lors(void) {static unsigned char BTNkey_press_l ...

  2. 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击

    九层妖塔 起于垒土 直接跳转到三行代码 三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击 一.基本理论 0.按键的常见名词:  ①按键抖动  ②按键稳定闭合时间 1.按键的扫描: 2.按键的消抖 ...

  3. 单片机基于独立按键的屏幕翻页/功能选择方案(支持长按,短按,双击操作)

    功能概述 本按键方案硬件部分由两个独立按键组成, 在移植后能够适配市面上绝大部分单片机. 独立按键分为A, B两键, 轻击A键代表上一页, 轻击B键代表下一页, 同时开发者可自由定义双击, 长按操作的 ...

  4. STM32-蓝桥杯嵌入式之三行按键检测(按键的长、短,单击、双击)

    STM32-蓝桥杯嵌入式之三行按键检测(按键的长.短,单击.双击) 目录 STM32-蓝桥杯嵌入式之三行按键检测(按键的长.短,单击.双击) 一.检测按键下降沿分析 二.检测按键上升沿分析 三.按键检 ...

  5. stm8s跳出中断程序c语言,stm8s103 利用中断判断长按短按,长按可以实现进入低功耗 短按1-2s跳出低功耗进入工作,实际情况是短按立马跳出低功耗,请各位大侠帮忙看看。附程序...

    声明 #include  "STM8S103F2P.h" #define uint  unsigned int #define uchar unsigned char #defin ...

  6. 多功能检测按键 单按 长按 多个按键 响应方式

    //这是我对以前发表过的按键检测方式的优化,之前的是:http://blog.csdn.net/chuangwu2009/article/details/9466715 //现在的程序按键有效检测方式 ...

  7. licheepi nano BS8112A触摸按键之长按短按

    上一节中介绍了BS8112A芯片在荔枝派nano上的驱动实现过程.但是现在需要用到触摸按键的长按短按功能,需要稍加修改. 在BS8112A_probe函数中,设置了__clear_bit(EV_REP ...

  8. LeetCode简单题之按键持续时间最长的键

    题目 LeetCode 设计了一款新式键盘,正在测试其可用性.测试人员将会点击一系列键(总计 n 个),每次一个. 给你一个长度为 n 的字符串 keysPressed ,其中 keysPressed ...

  9. 通达信指标能用c语言编写吗_翔博精选指标看长做短,引用周线数据(通达信公式 副图 源码 测试图)...

    问题:怎样才能每天都收到这类文章! 答案:只需点击上方<翔博软件工作室> 做价值的传播者,一路同行,一起成长 免费指标和实战干货持续更新中,欢迎关注 点赞 收藏视频号. 公式源码 看长,故 ...

最新文章

  1. SIEM部署的几条最佳实践
  2. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
  3. Antd-Design List渲染列中Button 点击事件 传递参数
  4. php有意思知识分享,分享几个有意思的数组方法
  5. 数据中心电池室管理之经济实用性方法的探索
  6. [******] 链表问题:将单向链表按某值划分成左边小、中间相等、右边大的形式...
  7. MySQL重启也无法解决的Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  8. 数据分析避坑必读:让人怀疑人生的七大悖论
  9. Description Resource Path LocationType Java compiler level does not match the version of the instal
  10. 深入搜索引擎的关键——索引
  11. 开源版多用户博客系统
  12. 数字电路逻辑符号和逻辑图形符号
  13. HTML5前端基础知识
  14. Spring Cloud学习笔记(二)Restful理解及微服务的Restful调用
  15. 用计算机教学体育,体育教学中计算机的应用
  16. 什么是https证书?
  17. 光线追踪 — 光照模型
  18. Wolfram Mathematica学习笔记1
  19. CSS图片裁剪:实现切角效果
  20. 测试人员需要具备哪些基本技能

热门文章

  1. js获取classname值_js获取和设置DIV元素class值的方法
  2. svn 忽略文件夹和文件的方法
  3. Java入门项目:实现简单学生管理系统(逐个功能详解版)
  4. 栈应用:括号匹配问题
  5. vue拦截器及地址解释
  6. IOS视频直播:高仿腾讯旗下NOW直播映客直播类型
  7. 人工智能实战 第四次作业(DEBUG4FUN团队)
  8. 东北林业大学计算机学院复试题,2016年东北林业大学信息与计算机工程学院程序设计基础(同等学力加试)考研复试题库...
  9. 五种保护VPS服务器的方法
  10. 汉诺塔递归问题的理解