函数计算机按键没反应,单片机key按键处理函数-长按和短按没反应

本文介绍了如何在单片机中处理按键的短按和长按功能。通过设置按键时长计数器、长按标志和短按标志,实现对多功能设置按键的检测和处理。当检测到按键按下并超过预设时长时,会触发相应的长按或短按功能,如LED状态的改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define LONG_time  4        //定义长按设置键的时间

uchar        Keycount;                    //设置按键时长计数器

uchar        skpttime;                    //设置按键时长

uchar        longflag;                    //设置长按标志

bit                skpflag;                                //设置按键按下标志

sbit        SETKEY =P2^0;   //多功能按键(短按,长按)

sbit  LED1   =P2^1;

sbit  LED2   =P2^2;

void delay1ms(uchar ms)

{

while(ms--)                                                   //每循环一次,约延迟1ms

{

uchar i;

for(i=0;i<250;i++)     //循环250次,在12M晶振时约延时1ms

{

_nop_();                               //执行一条_nop_()指令为一个机器周期

_nop_();

_nop_();

_nop_();

}

}

}

/*------------按键处理程序--------------------------*/

void KEY_Short()          /*(短按k2)*/

{

LED1=1;

LED2=0;

}

void KEY_Long()           /*(长按k2)*/

{

LED1=0;

LED2=1;

}

/*----------检测及处理多功能设置按键KEY-------------*/

void setkeyscan()

{

if(skpflag)                                                                                //判断是否已经有键按下未被处理

{

if(Keycount>LONG_time)                        //如果是长按则执行长按键设置功能

{

KEY_Long();

skpflag=0;

longflag=1;

}

else if((skpttime>0)&&(skpttime<=LONG_time))//否则如果是短按则执行短按的功能,都不是直接跳过

{

KEY_Short();

skpflag=0;

}

}

else

{

if(!SETKEY)                                                                //按下设置键

{

delay1ms(10);                                                //键盘防抖

if((!SETKEY)&&longflag==0)

{

Keycount=0;                                          //初始化按键时长计数器

skpttime=0;                                                //初始化按键时长

skpflag=1;                                                //标志已经有键被按下

longflag=0;

}

}else

{

longflag=0;

}

}

}

void key_init()

{

Keycount=0;                                                  //初始化功能键按下时长计数器

skpttime=0;                                                        //初始化功能键按下的总时长

SETKEY=1;                                                          //KEY设置为输入端口

longflag=0;

LED1=0;

LED2=0;

}

/*---------------主函数--------------------*/

void main()

{

TMOD=0X01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

key_init();

while(1)

{

setkeyscan();

}

}

/*************定时器中断函数****************/

void Timer0(void) interrupt 1

{

if(skpflag)

{

Keycount++;

if(SETKEY)

skpttime=Keycount;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值