标题:
单片机双击 单击 长按的按键判断 C51源程序与原理图
[打印本页]
作者:
郭一港
时间:
2018-5-15 10:42
标题:
单片机双击 单击 长按的按键判断 C51源程序与原理图
分享51单片机实现的双击 单击 长按 的按键判断 C51代码
电路原理图如下:
0.jpg
(38.39 KB, 下载次数: 67)
下载附件
2018-5-15 18:28 上传
单片机源程序如下:
#include<reg51.h>
sbit key = P3^0;
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit key_over = P3^2;
unsigned char x = 0,y = 0;
///////////////---------子函数声明-----------////////////
void init(void); //初始化定时器0
void delay(unsigned int a); //延时
void key_main(void); //按键事件判断
///////////////-----------主函数-----------//////////
void main()
{
init();
key_main();
}
void init(void) //初始化定时器0
{
TMOD = 0x01;
IT0 = 1; ///低电平有效
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
EX0 = 1;
key = 1; //初始化按键
P2 = 0x00;
}
void key_main(void) //按键事件判断
{
while(1)
{
new:if(key == 0)
{
delay(10);
if(key == 0)
{
TR0 = 1;
while(key == 0); ///第一次按键释放
TR0 = 0;
if(x>16) //判断是否为长按
{
x = 0;
led3 = 1;
goto new;
}
x = 0;
TR0 = 1;
while(x<=6) //在第一次按键事件完成后,若0.5秒内无按键事件,则为单击,否则是双击
{
if(key == 0)
{
delay(10);
if(key == 0)
{
TR0 = 0;
x = 0;
while(key == 0);
led2 = 1;
goto new;
}
}
}
TR0 = 0;
if(x != 0)
{
x = 0;
led1 = 1;
goto new;
}
}
}
}
}
void delay(unsigned int a) //延时
{
unsigned int i;
for(a;a>0;a--)
for(i=110;i>0;i--)
;
}
void time(void) interrupt 1 ///定时器0
{
ET0 = 0;
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
x += 1;
}
ET0 = 1;
}
void over(void) interrupt 0 ///外部中断
{
ET0 = 0;
{
if(led1 == 1)
led1 = 0;
if(led2 == 1)
led2 = 0;
if(led3 == 1)
led3 = 0;
}
ET0 = 1;
}
复制代码
所有资料51hei提供下载:
双击长按判断.rar
(34.42 KB, 下载次数: 85)
2018-5-15 10:41 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
tianqi911
时间:
2018-9-21 15:31
谢谢。下载下来学习。
作者:
ienui810404
时间:
2018-10-9 12:38
来学习
作者:
dantu1314
时间:
2019-2-26 10:50
来学习,谢谢楼主
作者:
zyx123
时间:
2019-2-26 10:55
来学习,谢谢楼主
作者:
雕刻时光爱雅
时间:
2020-4-2 11:05
非常好
作者:
雕刻时光爱雅
时间:
2020-4-2 11:37
来学习,谢谢群主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1