【C51009】基于51单片机按键识别

功能描述:

1、单片机识别按键的3个状态:单击、双击、长按识别

2、屏幕显示按键状态

一、Proteus仿真设计

元件清单:

73017943445143d993242dad5f8f2ff0.jpg

 

 

仿真图

9077b4b64ced43cb8d6c9ce495bb847f.jpg

 

 

仿真运行:

45a31ff4c2f1404b959b111d41bc4c68.jpg

 

 

程序框图设计

c8967780860e49379f9ae5bfd16762a7.jpg

 

 

主程序设计

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅_望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值