51单片机 按键长短按识别
warning:
这篇文章距离上次修改已过1376天,其中的内容可能已经有所变动。
开发板模块原理图:
效果:长按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); //检测按键是否松开
}
}
}