基于51独立按键长按短按程序
简单长短按键程序

/*数码管采用定时器0中断显示,避免长按时的闪烁长按测试功能说明;键1长按,前两个数码管数值加,键1短按,后两个数码管数值加数码管显示用定时器0中断2ms 显示*/#include <reg52.h>#define uchar unsigned char //定义unsigned char 类型名为uchar#define uint unsigned int //定义unsigned int 类型名为uintsbit k1=P1^0; //按键引脚定义uchar num_1=0,num_2=0;uchar t0_num=0;uint k1_num=0;uchar tmp[6];uchar disp_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管编码0--9uchar disp_bit[6]={0x7f,0xbf,0xef,0xf7,0xfd,0xfe};//位选void delay(uint ms) //延时约x 微秒, 用作按键去抖或者长按判断{char j;for(;ms>0;ms--)for(j=200;j >0;j--);}void clock_init() /*定时器0 2ms 初始化*/{TMOD=0x01;TL0=0x30; //2*1000=(65536-初值)*(12/12) 默认晶振12MHZTH0=0xf8;TR0=1;ET0=1;EA=1;}void key_judge() /*按键1 的长按和短按判断*/{if(k1==0) //判断是否键1按下{delay(10); //去抖10 msif(k1==0){while(!k1) //未释放前进入按键计时{k1_num++;delay(10);//每加一次,时间10 ms}if(k1_num>=200)//当计数为200时,则已按下200*10 =20000 ms = 2 秒, 即判断为长按{k1_num=0;num_1++; //长按,第一个数加1 , 加超过99 清零if(num_1>=100) num_1=0;}else//否则为短按{k1_num=0;num_2++; //长按,第二个数加1if(num_2>=100) num_2=0;}}}}/*-------------------主函数--------*/void main(){clock_init(); //定时器0初始化,只做一次while(1){key_judge(); //用最简单的方法---查询,判读是否按键1 被按下}}void t0_disp(void) interrupt 1/***每2ms进一次中断,显示一个数码管***/ {TL0=0x30;TH0=0xf8; //重装初值tmp[0]=num_1/10; //数据分位保存在数组中tmp[1]=num_1%10;tmp[2]=num_2/10;tmp[3]=num_2%10;P2=disp_bit[t0_num]; //位选P0=disp_table[tmp[t0_num]]; //数码管段选t0_num++;if(t0_num>=4) t0_num=0; //循环显示}。
单片机按键连按长按汇编程序

单片机按键连按长按汇编程序;=============================================================== ;程序编写人:兰建文;编写地点:51hei培训机构;时间:6月7日下午星期日;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循;环显示0到9回到0。
若间隔时间大于1秒,显示加1,低电平亮;P2口实现对数码管的片选功能;=============================================================== ;==========================系统程序============================= ;=========================开始初始化============================ SHUCHU EQU P0 ;定义P0口为输出口PIANXUAN EQU P2 ;定义P2口为片选口SHUZI EQU 30H ;设置处理数据存放地址JIANBIT0 BIT 20H.0 ;设置按键标志位XIAN0 BIT 20H.2 ;显示标志位T_BIT BIT 21H.0 ;设置中断定时器0标志位LIANAN BIT 20H.1 ;设置连按标志位BIT4 BIT 20H.2MODE EQU 01HSHU EQU 40H;========================程序开始==============================ORG 00H ;程序开始LJMP START ;跳到STARTORG 0BH ;中断定时器0入口地址JMP T0_1 ;跳到定时器0服务程序ORG 0030H ;入口地址;=========================主程序=============================== START:MOV SP,#60H ;移开指针MOV SHUZI,#00 ;数据初始化MOV DPTR,#TAB ;查表初始化MOV P1,#0F8H ;设置P1.0口为输入CALL INIT ;开中断CLR JIANBIT0 ;按键标志位清0CLR LIANAN ;连按标志位清0CLR BIT4SETB T_BIT ;中断标志位置1MOV SHU,#0MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#200MAIN:JNB T_BIT,MAIN ;等待中断CLR T_BIT ;中断标志位清0JB BIT4,VVINC R3CJNE R3,#25,XXMOV R3,#00MOV R2,#0JMP DDXX:CJNE R2,#3,VVSETB LIANANMOV R2,#00DD:CLR BIT4VV:JB LIANAN,XUNHUAN ;判断是否有连按CC:CALL JISUAN ;计算分离十位和个位CALL DISPLAY ;显示个位和十位JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起JNB P1.3,XIANSHI0 ;若没抬起(P1.3=0)则调到XIANSHI0 SETB BIT4INC R2MOV R3,#0CLR JIANBIT0 ;按键标志位清0CLR XIAN0 ;显示标志位清0JMP MAIN ;返回MAINPANDUAN:JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0 SETB JIANBIT0JMP MAINXIANSHI0:JB XIAN0,MAINSETB XIAN0 ;显示标志位清0CALL JIACHULI ;加处理JMP MAINXUNHUAN:MOV A,SHUCJNE A,#10,KKKMOV SHU,#0CLR LIANANMOV A,SHUKKK: MOVC A,@A+DPTR ;查表MOV SHUCHU,AMOV PIANXUAN,#05INC R4CJNE R4,#50,OUTTINC SHUMOV R4,#0OUTT:JMP MAIN;====================定时中断0服务子程序======================== ;输入:无;输出:无;实现的功能:实现定时20MS,影响标志位T_BIT;=============================================================== T0_1:MOV TMOD,#MODE ;定时器1工作方式1MOV TL0,#0E0H ;设置定时初值MOV TH0,#0B1HSETB T_BIT ;定时标志位清0RETI;========================中断设置子程序========================= ;输入:无;输出:无;实现的功能:初始化设置定时器,设置初值;===============================================================INIT:MOV TMOD,#MODE ;定时器0工作方式1MOV TL0,#0E0HMOV TH0,#0B1HMOV IE,#82H ;开定时器中断0SETB TR0 ;开定时器0RET;========================计算子程序============================= ;输入:30H;输出:"A和B";实现的功能:把30H的数据的十位和个位分离出来;=============================================================== JISUAN:MOV A,SHUZI ;数据放在A中MOV B,#10 ;除数放在B中DIV AB ;商放在A中,余数放在B中RET;========================显示子程序============================= ;输入:"A";输出:"P0口";实现的功能:把A的数输出到P0口显示,十位和个位分开显示;=============================================================== DISPLAY:MOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示十位MOV PIANXUAN,#04H ;片选CALL DELAY ;查表MOV SHUCHU,#0FFH ;关闭数码管MOV A,BMOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示个位MOV PIANXUAN,#05H ;片选CALL DELAY ;延时MOV SHUCHU,#0FFH ;关闭数码管RET;======================加处理子程序============================= ;输入:无;输出:无;实现的功能:把30H地址加1;=============================================================== JIACHULI:MOV A,SHUZICJNE A,#99,L0 ;若A不等于9,则跳到LL MOV A,#00JMP L1L0:INC A ;自加一L1:MOV SHUZI,ARET;========================延时程序===============================;输入;无;输出: 无;实现的功能:延时一段时间;=============================================================== DELAY:MOV R6,#80L7:MOV R7,#80L8:DJNZ R7,L8DJNZ R6,L7RET;=====================共阳查表数据============================== TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;=======================程序结束================================ END一个按键控制一个灯,要求按一下按键,灯亮一直亮,再按一下按键灯灭,要带按键的去抖程序。
我的51单片机之 按键 的 C语言与汇编的编程

P1=0xFF; P3=0xFF; while(1) {
if(KINT0==0) {
LD1=0; } if(KINT1==0) {
LD2=0; } if(KT0==0) {
LD3=0; } if(KT1==0) {
LD4=0; } if(KA2==0) {
LD5=0;
} if(KA1==0) {
KINT0 EQU P3.2; KINT1 EQU P3.3; KT0 EQU P3.4; KT1 EQU P3.5; KA2 EQU P3.6; KA1 EQU P3.7; LD1 EQU P1.0; LD2 EQU P1.1; LD3 EQU P1.2; LD4 EQU P1.3; LD5 EQU P1.4; LD6 EQU P1.5;
LD6=0; } } }
四、独立按键汇编程序: ;**************************************************************** ;每个独立铵键用一只指示灯指示;按复位键可熄灭,made by luqichao ;**************************************************************** ORG 0000H AJMP MAIN ORG 0030H
//字形码:0--f 及小数点
unsigned char code AscLed[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//
{ 0 , 1, 2 , 3 , 4 , 5, 6, 7, 8, 9 }
void main() {
start: LED2=0; //亮数码管 P3=0xFF; KH1=0; if(KL1==0){LEDCODE=AscLed[1];goto start;};//k1 if(KL2==0){LEDCODE=AscLed[2];goto start;};//k2 if(KL3==0){LEDCODE=AscLed[5];goto start;};//k5 KH2=0; if(KL1==0){LEDCODE=AscLed[3];goto start;};//k3 if(KL2==0){LEDCODE=AscLed[4];goto start;};//k4 if(KL3==0){LEDCODE=AscLed[6];goto start;};//k6 KH3=0; if(KL1==0){LEDCODE=AscLed[7];goto start;};//k7 if(KL2==0){LEDCODE=AscLed[8];goto start;};//k8 if(KL3==0){LEDCODE=AscLed[9];goto start;};//k9
基于MCS51系列单片机实现键盘按键与数字动态显示计数器课程设计

毕业设计论文摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
而51单片机是各单片机中最为典型和最有代表性的一种。
本实验是基于MCS51系列单片机所设计的,可以实现键盘按键与数字动态显示并可以用音乐倒数的计数器。
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个计数器,包括以下功能:输出时间,按下键就开始计时,并将时间显示在LCD1602显示器上。
当倒计数为0时,蜂鸣器就发出音乐声响等等。
该计数器系统主要由计数器模块、LCD显示器模块、蜂鸣器模块、键盘模块、复位模块等部分组成。
关键词:AT89C51、键盘、LCD1602显示、蜂鸣器目录摘要 (I)1 项目概述和要求 (1)1.1 单片机基础知识 (1)1.2 单片机的发展趋势 (1)1.3 项目设计任务与要求 (3)2 系统设计 (4)2.1 框图设计 (4)2.2部分硬件方案论述 (4)2.3电路原理图 (4)2.4元件清单 (5)2.4.1AT89C51芯片 (5)2.4.2字符型LCD1602 (6)2.4.3按键控制模块 (8)2.4.4其它元件 (8)3软件设计 (9)3.1 程序流程图 (9)3.2 程序关键问题的部分代码 (11)4 系统的仿真与调试 (16)4.1 硬件调试 (16)4.2 软件调试 (16)4.3 软硬件调试 (16)5总结 (17)参考文献 (18)1 项目概述和要求1.1 单片机基础知识单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲,一块芯片就成了一台计算机。
单片机具有体积小、功能强、应用面广等优点,目前正以前所未见的速度取代着传统电子线路构成的经典系统,蚕食着传统数字电路与模拟电路固有的领地。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
状态转移的独立按键程序

基于状态转移的独立按键程序设计本章所描述的按键程序要达到的目的:检测按键按下,短按,长按,释放。
即通过按键的返回值我们可以获取到如下的信息:按键按下(短按),按键长按,按键连发,按键释放。
不知道大家还记得小时候玩过的电子钟没有,就是外形类似于CALL 机(CALL )的那种,有一个小液晶屏,还有四个按键,功能是时钟,闹钟以及秒表。
在调整时间的时候,短按+键每次调整值加一,长按的时候调整值连续增加。
譬如,用一个智能充电器给你的手机电池充电,刚开始,它是处于快速充电状态,随着电量的增加,电压的升高,当达到规定的电压时候,它会转换到恒压充电。
总而言之,细心观察,你会发现生活中的总总都可以归结为一个个的状态,而状态的变换或者转移总是由某些条件引起同时伴随着一些动作的发生。
我们的按键亦遵循同样的规律,下面让我们来简单的描绘一下它的状态流程转移图。
下面对上面的流程图进行简要的分析。
首先按键程序进入初始状态S1,在这个状态下,检测按键是否按下,如果有按下,则进入按键消抖状态2,在下一次执行按键程序时候,直接由按键消抖状态进入按键按下状态3,在此状态下检测按键是否按下,如果没有按键按下,则返回初始状态S1,如果有则可以返回键值,同时进入长按状态S4,在长按状态下每次进入按键程序时候对按键时间计数,当计数值超过设定阈值时候,则表明长按事件发生,同时进入按键连发状态S5。
如果按键键值为空键,则返回按键释放状态S6,否则继续停留在本状态。
在按键连发状态下,如果按键键值为空键则返回按键释放状态S6,如果按键时间计数超过连发阈值,则返回连发按键值,清零时间计数后继续停留在本状态。
看了这么多,也许你已经有一个模糊的概念了,下面让我们趁热打铁,一起来动手编写按键驱动程序吧。
下面是我使用的硬件的连接图。
硬件连接很简单,四个独立按键分别接在P3^0------P3^3四个I/O上面。
因为51单片机I/O口内部结构的限制,在读取外部引脚状态的时候,需要向端口写1.在51单片机复位后,不需要进行此操作也可以进行读取外部引脚的操作。
基于STC8A8K单片机的智能手表设计

物联网技术 2023年 / 第7期1380 引 言随着智能化时代的到来,智能穿戴设备层出不穷,智能穿戴设备市场也逐渐壮大且具有很大的上升空间[1]。
但市面上的大多数智能可穿戴设备都具有一些缺点,例如功能冗余、电池寿命短、续航时间短以及价格昂贵[2-3]。
基于此背景,设计一个低成本、低功耗且易于推广的智能手表具有重要意义和市场价值[4-5]。
本设计在硬件上以STC8A8K 单片机为控制核心,在软件上以MDK5为系统开发平台,采用C51语言进行程序设计。
由于8051内核功耗很低,使得本文设计的智能手表可长时间待机,还可进入休眠模式以进一步增加续航时间,同时设计有图形用户界面以增强用户的交互感。
在满足手表基本功能的同时,还可以对周边环境参数进行检测以便用户更加了解周边环境情况。
国内许多学者对基于单片机的图形化界面进行了研究。
邢维巍等[6]基于8051单片机设计了GUI 系统,但是由于51单片机本身性能的局限性,他们采用了多处理器结构,其中一个处理器单独负责运行GUI 系统。
丁力等[7]设计了基于STM32F103的测控系统,其中使用图形支持软件uC/GUI 来搭建图形化界面,但是uC/GUI 系统只能在高端单片机(如32位ARM )上运行。
夏继强等[8]设计了一种基于MCS-51单片机和STN6448D-4k 液晶显示模块的GUI 系统。
本设计仅使用单处理器,构建的基于低端单片机的图形化用户界面可以实现窗口、菜单、文本、图像等功能,在运行图形化界面系统的同时还可以进行其他控制工作。
针对市面上众多可穿戴智能设备所存在的不足,本文通过软硬件设计配合传感器实现了低成本、低功耗智能手表的设计,可以满足用户的需求,有较高的实用价值。
1 系统硬件设计1.1 系统硬件总体框架系统硬件模块包括:OLED 显示屏模块用于显示图形化界面与用户进行交互;DS1302时钟模块用于实现实时时钟;BME280温湿度传感器模块用于实现高精度温湿度的测量;按键模块使用独立按键配合有限状态机控制系统。
51单片 矩阵键盘按键程序

}
}
P3=0xfb;//第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key=8;
break;
case 0xdb:key=9;
{
delay(10);
//temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
{
//temp=P3;
switch(P3)
{
case 0xee:key=0;
break;
case 0xde:key=1;
break;
case 0xbe:key=2;
break;
case 0x7e:key=3;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
int keyscan()
{
P3=0xfe;//第一行有别于二三四行
//temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
/*矩阵键盘*/
#include <REG52.H>
sbit du=P2^6;
sbit we=P2^7;
unsigned int i,j,key,temp;
char code table[]={0x3f,0x06,0x5b,0x4f,
基于51单片机按键长按短按效果源程序

基于51单片机按键长按短按效果源程序[复制链接]* 实验名称:多位数按键加减** 晶振:12MHZ* 内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描** 并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DEC=P3^2; //S18#define DataPort P1 //定义数据端口程序中遇到DataPort 则用P1 替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsigned char code HEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0123456789unsigned char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayUs2x(unsigned char t);//函数声明void DelayMs(unsigned char t);void Init_Timer0(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num=0,key_press_num;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DEC=1;Init_Timer0();while (1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下DelayMs(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_ADD){key_press_num++;DelayMs(10); //10x200=2000ms=2sif(key_press_num==200) //大约2s{key_press_num=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_press_num=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DEC)key_press_num++;DelayMs(10);if(key_press_num==200) //大约2s{key_press_num=0;while(!KEY_DEC){if(num>0) //减操作num--;//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作的速度}}}key_press_num=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];// Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
基于51单片机按键长按短按效果源程序

基于51单片机按键长按短按效果源程序[复制链接]* 实验名称:多位数按键加减** 晶振:12MHZ* 内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描** 并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#includ e<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DE C=P3^2; //S18#define DataPo rt P1 //定义数据端口程序中遇到D ataPo rt 则用P1 替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsign ed char code HEYAO_DuanM a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0123456789unsign ed char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsign ed char TempDa ta[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayU s2x(unsign ed char t);//函数声明void DelayM s(unsign ed char t);void Init_T imer0(void);void Displa y(unsign ed char FirstB it,unsign ed char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsign ed char num=0,key_pr ess_n um;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DE C=1;Init_T imer0();while(1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下DelayM s(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_AD D){key_pr ess_n um++;DelayM s(10); //10x200=2000ms=2sif(key_pr ess_n um==200) //大约2s{key_pr ess_n um=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则68/10=6 68%10=8 TempDa ta[0]=HEYAO_DuanM a[num/10];TempDa ta[1]=HEYAO_DuanM a[num%10];DelayM s(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_pr ess_n um=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayM s(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DE C)key_pr ess_n um++;DelayM s(10);if(key_pr ess_n um==200) //大约2s{key_pr ess_n um=0;while(!KEY_DE C){if(num>0) //减操作num--;//分解显示信息,如要显示68,则68/10=6 68%10=8 TempDa ta[0]=HEYAO_DuanM a[num/10];TempDa ta[1]=HEYAO_DuanM a[num%10];DelayM s(50);//用于调节长按循环操作的速度}}}key_pr ess_n um=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则68/10=6 68%10=8 TempDa ta[0]=HEYAO_DuanM a[num/10];TempDa ta[1]=HEYAO_DuanM a[num%10];// Displa y(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsign ed char t,无返回值unsign ed char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayU s2x(unsign ed char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsign ed char t,无返回值unsign ed char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayM s(unsign ed char t){while(t--){//大致延时1mSDelayU s2x(245);DelayU s2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstB it 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
基于MCS-51单片机的独立按键和矩阵按键检测实验

实验三基于MCS-51单片机的独立按键和矩阵按键检测实验一、支撑课程目标目标1:掌握微机和单片机的基本原理、编程技术、中断技术、系统扩展、定时器、串行接口和其他输入/输出接口技术,并且了解典型的单片机应用系统的设计思想和实现方法。
目标2:初步具备自行拟定实验步骤、检查和故障排除、分析和综合实验结果以及撰写实验报告的能力。
目标4:掌握MCS-51单片机/STM32F103单片机系统仿真工具和仿真流程,了解常用实验仪器、设备的基本工作原理,了解其正确使用方法,具备利用电子仪器设备和专业仿真软件对复杂工程问题进行分析和设计的能力。
二、实验类型:验证型( )、设计型(√)、研究创新型()三、预期学生学习的成果1、具有典型按键检测电路原理及消除抖动的必要性的认知。
2、理解程序设计消除抖动的实现过程。
3、掌握独立按键的程序查询检测编程实现。
4、掌握独立按键的中断检测编程实现。
5、理解矩阵键盘的行列扫描检测原理,具有矩阵键盘软硬件设计综合能力。
四、实验原理1、典型按键检测电路典型的按键检测电路具备检测按键的条件:检测引脚处在键按下前和后,要有电平变化,否则按键无法检测。
电路组成包括电源、上拉电阻、按键、接地组成,按下前,检测引脚高电平,按下后检测引脚低电平。
电阻防止按下电源短路,如图1(a)。
GND(a)(b)图 1 按键典型电路及对应检测电压2、按键抖动及消除如图1(b),理想条件下,按键未按下,在检测I/O端口是高电平,按下以后,检测I/O端口是低电平,手松后,按键弹起,检测I/O端口是高电平。
整个按键过程出现高电平到低电平又到高电平,有下降沿,也有上升沿。
实际过程中,由于人手的抖动,检测端电压如图1(c),检测电压出现“毛刺”抖动,假设单片机检测高电平阈值为VH,低电平阈值为VL,一次按键就会出现多次高电平到低电平变化,存在按键误检测可能。
常用消除办法之一:一旦检测到低电平,延迟u毫秒,u选择大于20,再次判断检测端是否是低电平,如果是,就判定为1次按键。
单片机经典长短按程序

单片机经典长短按程序新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unignedcharTrg;unignedcharCont;voidKeyRead(void){unignedcharReadData=PINB^0某ff;//1Trg=ReadData&(ReadData^Cont);//2Cont=ReadData;//3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
单片机按键-长按-短按-连发-双击-抬起-按下

/* 每次定义按键都给出按键编号, 用和按键状态码组成键值 */ /*按键编号定义*/ #define KEY_NUM_ZERO #define KEY_NUM_POWER
((unsigned char)(0x01)) ((unsigned char)(0x02))
/* 按键可以简单分成以下五种状态, 状态和按键编号组合成每个按键 不同状态下的按键值 */ /*按键状态码定义*/ #define KEY_NULL #define SHORT_CLICK #define LONG_CLICK #define DOUBLE_CLICK #define KEY_DOWN #define KEY_UP
(SHORT_CLICK | KEY_NUM_ZERO<<8) (LONG_CLICK | KEY_NUM_ZERO<<8) (DOUBLE_CLICK | KEY_NUM_ZERO<<8) (KEY_DOWN | KEY_NUM_ZERO<<8) (KEY_UP | KEY_NUM_ZERO<<8)
/* 每个按键都包括自己的属性 */ /*按键属性定义*/
typedef struct {
StatEnum_TypeDefstat; unsigned char KeyNum; unsigned short CountMs; unsigned short ShakeTimeMs; unsigned short LongClickTimeMs; unsigned short ContinueSendTimeMs; unsigned short DoubleClickTimeMs; unsigned char (*GetKeyStat)(void); }KeyAttribute_TypeDef;
《STM32单片机仿真开发实例》教学课件 4.4 长短按键

N 按钮按下?
Y
延时25ms
1<变量<40?
Y
N
短按事件
长按事件
变量自增
变量清零
结束
4.4.2 任务程序的编写
即便是采用相同的控制流程,具体实现的方法也不尽相同,这里提供两种具体的实 现方法。
(1)基于系统嘀嗒定时器的程序 (现场操作演示...) (2)基于定时器中断的程序 (现场操作演示...)
(1)长短按键的用途 有些电子产品由于体积限制,按键个数不能太多,需要通过一个按键响应两个甚至 更多个不同的事件,比如可以通过按键时间的不同设定其响应不同的事件,我们不妨
称这种按键为“长短按键”。
(2)长短按键的设计思路 “长短按键”实现的方法有很多,本节为读者介绍一种比较简单的方法,流程力目标:
理解长短按键功能实现的原理 ,能利用软件延时以及定时器中断 技术实现长短按键程序的编写。
任务要求:
仿真电路如图所示,若正常按一 下BTN1按键时D1点亮,若按住 BTN1按键超过1秒则D2点亮,在 D1或D2点亮时按一下BTN2按键则 所有LED都熄灭。
4.4.1 长短按键的用途和设计思路
技能训练(选做):
完成基于定时器阻塞的程序。
To be continued...
51单片机-独立按键

查询方式
单片机不断的扫描键盘判断按键是否动作 特点:硬件简单,但需要单片出中断请求,单片机响应中断请求后转按键 识别程序
特点:硬件复杂,需要中断电路,但不占用CPU资源
单片机处理按键的流程
单片机处理按键动作需要以下步骤:
按键识别
单片机在识别按键时,IO口工作在输入状态:
按键弹起,IO口电平5V
Vcc
按键按下,IO口电平0V
单片机读取IO口的状态
即可知按键的状态
单片机
按键抖动
实际的按键在被按下或抬起时,由于机械 触点的弹性作用,在闭合或断开的瞬间均伴随有 一连串的抖动现象。
理想波形
实际波形
按下抖动
稳定闭合
释放抖动
完整的按键过程包括: 1. 释放状态 2. 按下抖动阶段 3. 完全按下状态 4. 释放抖动阶段 5. 释放状态
按键防抖
防抖措施:
硬件防抖
在按键输出端加RS或施密特触发器 去抖效果好、电路复杂、成本高
软件防抖
利用软件进行延时(10ms) 电路简单、成本低、但占用CPU时间
键盘的工作方式
判断按键是否按下 按键按下时的防抖 识别哪个按键按下,判断键值 判断按键是否放开 送出键值,处理按键动作
练习:单片机按键查询操作,8个按键对应8个LED灯, K1对应D1,K2对应D2,K3对应D3,……,查询按键, 按下某一个按键后对应的LED亮起,再按一次关闭。
基于51单片机的键盘控制系统电路设计

基于51单片机的键盘控制系统电路设计下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!1. 引言单片机作为一种通用的微控制器,广泛应用于各种电子系统的控制中。
8051按键处理程序:单击、长按、连击、组合

最近参考大神的按键处理程序,写了下面这个程序,希望大家指点一下硬件为8051,采用8255扩展接口,功能上,实现单击K1、K2、K3分别使时、分、秒递增;长按K1、K2、K3分别使时、分、秒递减;K1、K2、K3连击使第二个横杠处变为0;组合键K1、K2使第一个横杠处变为0,组合键K2、K3使第一个横杠处变为横杠;组合键K1、K3使第二个横杠处变为横杠。
下图为proteus仿真电路完整程序如下://-----------------------------------------------------------------// 8255实现接口扩展//-----------------------------------------------------------------// PA、PB为输出分别控制段码和位码,PC为输入////-----------------------------------------------------------------#include <reg51.h>#include <absacc.h>#define INT8U unsigned char#define INT16U unsigned int//8255 PA、PB、PC的端口和命令端口定义#define PA XBYTE[0x0000]#define PB XBYTE[0x0001]#define PC XBYTE[0x0002]#define COM XBYTE[0x0003]//上述定义可以这么写//#define PA *(XBYTE + 0x0000)//#define PB *(XBYTE + 0x0001)//#define PC *(XBYTE + 0x0002)//#define COM *(XBYTE + 0x0003)//根据硬件定义按键值#define KEY_V ALUE_1 0x0e#define KEY_V ALUE_2 0x0d#define KEY_V ALUE_3 0x0b#define KEY_NULL 0x0f//按键状态标志#define N_KEY 0x80#define S_KEY 0x40#define D_KEY 0x20#define L_KEY 0x10//状态机状态#define KEY_STATE_INIT 0 //初始状态#define KEY_STATE_WOBBLE 1 //电平抖动状态#define KEY_STATE_PRESS 2 //按键按下状态#define KEY_STATE_CONTINUE 3 //连击状态#define KEY_STATE_LONG 4 //长按状态#define KEY_STATE_RELEASE 5 //释放按键状态INT8U key_JL; //存储单击按键值code INT8U SEG_CODE[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF }; //共阳数码管编码,最后一位为横杠//初始显示的数字12-39-59INT8U Disp_Buf[] = {1,2,10,3,9,10,5,9};//-----------------------------------------------------------------// 8255端口按键处理//-----------------------------------------------------------------//按键底层处理,这里只识别单击和长按static INT8U Key_driver(){static INT8U key_time=0,key_state=KEY_STATE_INIT;INT8U key_temp,key_return=N_KEY;key_temp=PC&0x0f;switch(key_state){case KEY_STA TE_INIT:if(key_temp!=KEY_NULL) key_state=KEY_STATE_PRESS;break;// caseKEY_STA TE_WOBBLE://按键消抖处理,由于是仿真,为了加快按键灵敏度,减短延时时间// key_state=KEY_STA TE_PRESS;break;case KEY_STA TE_PRESS: //按键下,此处不返回值if(key_temp!=KEY_NULL) {key_state=KEY_STA TE_LONG; key_JL=key_temp;}else key_state=KEY_STA TE_INIT;break;case KEY_STA TE_LONG:if(key_temp==KEY_NULL) //单击确认{key_return=S_KEY|key_JL;key_state=KEY_STATE_INIT;}else if(++key_time>=100) //长按等待1s{key_return=L_KEY|key_temp; //返回长按值key_time=0;// key_state=KEY_STATE_RELEASE;key_state=KEY_STATE_INIT;}break;// case KEY_STA TE_RELEASE ://此处如果加上这段程序,长按不会不断递减// if(key_temp==KEY_NULL) key_state=KEY_STA TE_INIT;// break;}return key_return;}//按键处理中层按键判定单击、双击static INT8U Key_Read(){static INT8U key_time_1=0,key_m=KEY_STA TE_INIT;INT8U key_return=N_KEY,key_temp;key_temp=Key_driver();switch(key_m){case KEY_STA TE_INIT:if(key_temp&S_KEY){key_time_1=0;key_m=KEY_STA TE_CONTINUE;}elsekey_return=key_temp;break;case KEY_STA TE_CONTINUE:if(key_temp&S_KEY){key_return=key_temp|D_KEY;key_m=KEY_STATE_INIT;}else{if(++key_time_1>=30){key_return=key_JL|S_KEY;key_time_1=0;key_m=KEY_STA TE_INIT;}}break;}return key_return;}//按键处理顶层static void Key_Process(){INT8U key_temp;INT8U shi,fen,miao;key_temp=Key_Read();switch(key_temp){case 0x4e:shi=Disp_Buf[0]*10+Disp_Buf[1];shi++;if(shi==24) shi=0;Disp_Buf[0]=shi/10;Disp_Buf[1]=shi%10;break;case 0x1e:shi=Disp_Buf[0]*10+Disp_Buf[1];shi--;if(shi==255) shi=23;Disp_Buf[0]=shi/10;Disp_Buf[1]=shi%10;break;case 0x6e:Disp_Buf[5]=0x00; break;case 0x4d:fen=Disp_Buf[3]*10+Disp_Buf[4];fen++;if(fen==60) fen=0;Disp_Buf[3]=fen/10;Disp_Buf[4]=fen%10;break;case 0x1d:fen=Disp_Buf[3]*10+Disp_Buf[4];fen--;if(fen==255) fen=59;Disp_Buf[3]=fen/10;Disp_Buf[4]=fen%10;break;case 0x6d:Disp_Buf[5]=0x00; break;case 0x4b:miao=Disp_Buf[6]*10+Disp_Buf[7];miao++;if(miao==60) miao=0;Disp_Buf[6]=miao/10;Disp_Buf[7]=miao%10;break;case 0x1b:miao=Disp_Buf[6]*10+Disp_Buf[7];miao--;if(miao==255) miao=59;Disp_Buf[6]=miao/10;Disp_Buf[7]=miao%10;break;case 0x6b:Disp_Buf[5]=0x00; break;case 0x1c:Disp_Buf[2]=0x00;break;case 0x1a:Disp_Buf[5]=10; break;case 0x19:Disp_Buf[2]=10; break;default: break;}}INT8U time_scan=0;//-----------------------------------------------------------------// Ö÷³ÌÐò//-----------------------------------------------------------------void main(){INT8U i; //初始化定时中断TMOD=0x01; //定时器T0中断EA=1;ET0=1;TH0=(-1000)/256;TL0=(-1000)%256;TR0=1;COM=0x89; //初始化8255接口while(1){for(i=0;i<8;i++) //数码管显示{PA=0xff;PB=(1<<i);PA=SEG_CODE[Disp_Buf[i]];}if(time_scan==10) //每隔10ms进行一次扫描按键{Key_Process();time_scan=0;}}}//1ms定时中断void T0_time() interrupt 1{TH0=(65536-1000)/256;TL0=(65536-1000)%256;time_scan++;}。
51单片机学习之5独立按键和矩阵键盘

51单片机学习之5独立按键和矩阵键盘51单片机学习之5-独立按键和矩阵键盘第14集键盘的原理键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。
非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)独立键盘的电路图。
因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。
当检测到IO 口为0时即可判断该按键已经按下。
按键按下时会有一个抖动的过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。
因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。
例程:#include;#defineuintunsignedint#defineucharunsignedcharsbitKey=P3^4;//按键sbitLed=P1^0; //Led灯voiddelay(uintz);/********主函数********/voidmain(){while(1){if(!Key){delay(10);//消抖操作if(!Key)Led=0; //按下时Led亮elseLed=1;}}}voiddelay(uintz){uintx,y;for(x=z;x>;0;x--)for(y=110;y>;0;y--);}第15集4*4矩阵键盘上图中,1个按键占用一个IO口,如果有16个按键就占用了16个IO口。
为了减少IO口的使用,就需要用矩阵的方式连线。
如下图矩阵扫描原理从图可以看出P30、P31、P32、P33为行(低四位),P34、P35、P36、P37为列(高四位)。
假设我们按下的是S6按钮。
第一步,我们先确定列,给P3口赋值0xF0=11110000,那么P37、P36、P35、P34都被置1,P33、P32、P31、P30都被置0,当S6被按下时,由于S6按钮的一边P31为0,所以跟S6另一边相连的P35被拉低,即等于0。
单片机按键长短按得识别原理

单⽚机按键长短按得识别原理stm32f103按键长短按得识别原理需要⼀个定时器,⽤来计算按键按下的时间,可以⼀秒钟检测100次, 设置初始化为10ms的中断,⽐如使⽤定时4作为按键时间计算的定时器⽐如我们需要4种模式,轻触,短按,长按,超级长按#define clickTypeTouch 1 //轻触#define clickTypeShort 2 //短按#define clickTypeLong 3 //长按#define clickTypeVeryLong 4 //⾮常长的长按#define timeCntClickTouch 500 //ms内为短按#define timeCntClickShort 1000 //ms内为短按#define timeCntClickLong 2000//ms内,且⼤于短按时间为长按#define timeCntClickVeryLong 5000//ms的按键时间为⾮常长,⽤于进⼊⾼级模式//这⾥时钟选择为APB1的2倍,⽽APB1为36M//arr:⾃动重装值。
//psc:时钟预分频数//这⾥使⽤的是定时器7void TIM4_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = arr; //设置在下⼀个更新事件装⼊活动的⾃动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置⽤来作为TIMx时钟频率除数的预分频值 10Khz的计数频率TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_ITConfig( //使能或者失能指定的TIM中断TIM4,TIM_IT_Update ,ENABLE //使能);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM4, ENABLE); //使能TIMx外设}定时器的初始化然后设置⼀个变量⽤来累计按键按下的时间,没按键按下的时候, ⼀直循环累计时间,从0到溢出,有按键按下的时候,⽴即清空,重新开始累计⾸先初始化按键端⼝void keyIOInit(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //LED0-->PA.8 端⼝配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA}u16 timeKeyPressed; //按键按下的时间 10ms 步进设置两个常量,⽤来区别按键的状态,是按下还是释放#define keyStatusPressed 0#define keyStatusReleased 1定时器的中断,累计时间void TIM4_IRQHandler(void) //中断{if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否:TIM 中断源 {TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源timeKeyPressed+=10; //10ms的中断}}这个键,我叫做设置键,什么时候开始给设置键开始计算按下时间呢?设置键被按下⽽且按键状态还是释放需要⼏个常量标志和⼏个变量u8 statusCntingKeyTime; //是否开始计算按键时间#define statusCnting 1#define statusNotCnting 0//设置键按下,且之前没开始计时的时候,开始计算按下时间if(keySet==keyStatusPressed && statusCntingKeyTime==statusNotCnting ){timeKeyPressed=0; //设置键按下后,重新开始计时statusCntingKeyTime=statusCnting;//开始计算按下时间}当按键松开后,统计⼀下,按下的时间为多长//松⼿后统计按下时间if(keySet==keyStatusReleased && statusCntingKeyTime==statusCnting){statusCntingKeyTime=statusNotCnting;//停⽌计时//轻触if(timeKeyPressed<=timeCntClickTouch ){}//短按else if(timeKeyPressed>=timeCntClickShort &&timeKeyPressed<timeCntClickLong ){}//长按else if(timeKeyPressed>=timeCntClickLong &&timeKeyPressed<timeCntClickVeryLong){}//超级长按else if(timeKeyPressed>=timeCntClickVeryLong){}}。