51单片机 按键长短按识别

warning: 这篇文章距离上次修改已过1376天,其中的内容可能已经有所变动。

开发板模块原理图:

独立按键模块独立按键模块

LED模块原理图LED模块原理图

效果:长按K1按键,D1状态取反,D2亮,D3暗;短按K1按键,D2暗,D3亮

我用的开发板是普中51-A4

#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;

sbit k1=P3^1;     //定义P31口是k1
sbit led=P2^0;     //定义P20口是led
sbit led2=P2^1;     //定义P20口是led2
sbit led3=P2^2;     //定义P20口是led3

/*******************************************************************************
* 函 数 名         : delay
* 函数功能           : 延时函数,i=1时,大约延时1000us
*******************************************************************************/
void delay(u16 i)   //延迟1ms 误差 0us
{
    unsigned char a,b,c;
    while(i--){
        for(c=1;c>0;c--)
            for(b=142;b>0;b--)
                for(a=2;a>0;a--);
    }
}

/*******************************************************************************
* 函 数 名         : keypros
* 函数功能           : 按键处理函数,判断按键K1短按还是长按
*******************************************************************************/
u8 keypros()
{
    u8 t= 0; //按下时间
    while(1){
        if(!k1){
            t++; //已经按下了
            delay(10);
            if(t>=100){ //按下超过1秒
                led=~led;
                return 1; //长按触发
            }
        }else{
            return 0; //按下不足一秒
        }
        
    }
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能         : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{    
    led=1;
    while(1)
    {    
        if(!k1){
            delay(10);
            if(!k1){
                switch(keypros()){
                    case 1:
                        led2 = 0;
                        led3 = 1;
                        break;
                    case 0 :
                        led2 = 1;
                        led3 = 0;
                        break;
                }
            }
            while(!k1);     //检测按键是否松开
        }
    }
}
最后修改于:2021年02月22日 16:01

添加新评论