功能描述:
1、单片机识别按键的3个状态:单击、双击、长按识别
2、屏幕显示按键状态
一、Proteus仿真设计
元件清单:
仿真图
仿真运行:
程序框图设计
主程序设计
uchar key_scan()//按键检测,1短按,2双击,3长按
{
if(!k1 &&(key_flag1==0))//按钮按下
{
key_flag1=1;
}
if(key_flag1)
{
delay(1);
if(key_time<500)//按键计时
{
key_time++;
if(!k1 &&(key_flag2==0))
{
key_flag2=1;
key_dat++;
}
if(k1)
key_flag2=0;
}
else
{
key_flag2=0;
if(!k1 &&(key_dat==1))//长按
{
key_dat=0;
if(key_num!=3)
{
key_num=3;
return 3;
}
else
return 0;
}
if(k1 &&(key_dat>0))
{
if(key_num!=key_dat)//单击双击
{
key_num=key_dat;
key_dat=0;
return key_num;
}
}
if(k1)//按键复位
{
key_flag1=0;
key_time=0;
key_dat=0;
}
}
}
return 0;
}
void main()//主函数
{
uchar i=0;
init_1602();//初始化LCD
write_string(1,0,"key:");
TMOD|=0X01;//初始化定时器
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
i=key_scan();//按键检测
if(i>0)
key=i;
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<10)//0.5s
time++;
else
{
time=0;
//显示
switch(key)
{
case 1:write_string(2,0,"single click");break;
case 2:write_string(2,0,"double click");break;
case 3:write_string(2,0,"Long press ");
}
}
TH0=0X3C;
TL0=0XB0;
}
工程渠道【开源】
链接:https://pan.baidu.com/s/1ChGGUYGQgndeB2UhAQHYNw?pwd=yyds 提取码:yyds