OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10424|回复: 10

c语言如何用延时程序控制按键的长按(大于3s)

[复制链接]

18

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-11-5
在线时间
0 小时
发表于 2013-11-8 10:57:16 | 显示全部楼层 |阅读模式
if(key0==0)
  {
  delay1s();
  delay1s();
  delay1s();
  if(key0==0)
   {
    while(!key0)
    {
      k4=1;
     }
    }
当按下开关key0大于3s 时,k4接通,这样写对不对?还有简单的没?大侠们帮帮忙指导一下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-11-8 11:16:47 | 显示全部楼层
这个!!!!……

程序不要执行其他东西了
回复 支持 反对

使用道具 举报

18

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-11-5
在线时间
0 小时
 楼主| 发表于 2013-11-8 11:51:27 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
1、  最初状态:K1/K2/K3/K4均断开。

2、  后面板复位开关1和2,以及总电源开关均需实时检测是否按下,短按(小于2s),长按(大于3s)。

3、  当服务器+5V为0时,且此时K1为断开,此时按下机器总开关(短按,长按),执行如下操作:K1一直接通,K4接通1s,然后断开。

当服务器+5V为0时,且此时K1为接通,此时按下机器总开关(短按),执行如下操作:K1仍接通,K4接通1s,然后断开。

当服务器+5V为0时,且此时K1为接通,此时按下机器总开关(长按),执行如下操作:K1断开,K4无动作。

当服务器+5V为1时,且此时K1为断开,此时按下机器总开关(短按),执行如下操作:K1接通,K4无动作。

当服务器+5V为1时,且此时K1为断开,此时按下机器总开关(长按),执行如下操作:K1无动作,K4接通4s后,断开。

当服务器+5V为1时,且此时K1为接通,此时按下机器总开关(短按),执行如下操作:K1无动作,K4无动作。

当服务器+5V为1时,且此时K1为接通,此时按下机器总开关(长按),执行如下操作:K1等待3S后断开,K4接通4S后,断开。

当+5v为1时,或K1接通时,K5接通。当+5v为0时,且K1断开时,K5断开。

4、  当K1接通时,后面板复位开关1短按时,K1断掉1S后,接通;长按时,K2接通3S后,断开。

5、  当+5V为1时,后面板复位开关2短按时,K3接通1S后,断开;长按时,K3接通1S后,断开。





机器总开关对应的控制口是P0.0;

后面板复位开关2(服务器)对应的控制口是P0.1;

后面板复位开关1(路由器)对应的控制口是P0.2;

服务器电源+5V对应的控制口是P0.3;

总电源指示(k5)对应的控制口是P2.0;

服务器power(k4)对应的控制口是P2.1;

服务器reset(k3)对应的控制口是P2.2;

无线上网行为管理路由器reset(k2)对应的控制口是P2.3;

无线上网行为管理路由器(k1)对应的控制口是P2.4;

P0.4反馈k1(继电器开关的闭合状态),低电平时继电器闭合,高电平时继电器断开。

《芯片为AT89C51》

这是整个要求,纠结啊花了2个星期就整出来一部分,尤其是开关长按,望给个答案
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-10-26
在线时间
0 小时
发表于 2013-11-8 11:52:55 | 显示全部楼层
你这个程序有一点问题就是:
当你按下key0 3秒后你再次检测,还是处于接通时k4接通,但是在这3秒过程中如果松开键而在3秒后再次按键仍然条件有效会执行k4=0;另外,如果你的key0键一直按着就会进入一个接通循环,也就是在key0按下时会一直执行k4=0;所以你这个程序部合适
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-10-26
在线时间
0 小时
发表于 2013-11-8 11:56:30 | 显示全部楼层
楼主,明白了没
回复 支持 反对

使用道具 举报

18

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-11-5
在线时间
0 小时
 楼主| 发表于 2013-11-8 11:59:18 | 显示全部楼层
回复【5楼】伊然:
---------------------------------
哦,知道了,那请问该如何修改呢?
回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-10-26
在线时间
0 小时
发表于 2013-11-8 13:18:43 | 显示全部楼层
STM32每个I\O口都能够配置中断,你需要在中断程序中写置位条件,根据三秒后的置位与按键置位同时合法才能产生k4=1;具体程序我就不写了
回复 支持 反对

使用道具 举报

20

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
334
金钱
334
注册时间
2012-8-21
在线时间
27 小时
发表于 2013-11-8 13:26:01 | 显示全部楼层
按键三个状态,
松开,
按下
长按,
自己去弄逻辑关系吧,
啊哈哈
回复 支持 反对

使用道具 举报

16

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-6-7
在线时间
6 小时
发表于 2014-1-4 10:11:30 | 显示全部楼层
加个定时器
按下消抖后开定时器
主程序用while等待松手
没到三秒出while后复位定时器
超过三秒定时器中断里置位一个变量、定时器复位
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-2-13
在线时间
0 小时
发表于 2014-2-14 16:03:12 | 显示全部楼层
void anxx()interrupt 0 //按键扫描中断,aj,as全局变量,com为I/O,aj_0中断入口引脚
{
uchar a,x,y;   //定义a缓存:xY数轴 
aj=0;
as=0;
ys10us(5000);     //延时25ms
if(!AJ_0){
a=COM;  //保护现场
y=a&0x0f;   //判断y数轴准备
switch(y){    //查表
case 0x07:x=4;break;
case 0x0b:x=3;break;
case 0x0d:x=2;break;
case 0x0e:x=1;break;
default: {   //查表失败
x=0;
break;
}
}
if(x&&(!AJ_0)){      //判断y=0?准备判断X数据
for(aj=0,y=0;y<4;++y){
switch(y){
case 0:COM=0x7f;break;
case 1:COM=0xbf;break;
case 2:COM=0xdf;break;
case 3:COM=0xef;break;
default:{
COM=a|0x0f;             //查表错误
aj=0;
as=0;
y=0;
}
}
ys10us(10);                     //去抖延时
while(!AJ_0){
for(;!aj;) { //防止二次计数
aj=y*4+x;               //求面值
}
for(as=0;!AJ_0;as++)        //求按键时间
ys10us(50000);  //1S

}
COM=a|0x0f; //恢复初次按键状态
}
else{    //按键扫描错误返回
aj=0;
as=0;
COM=a|0x0f;
}
}
让生活更简单
回复 支持 反对

使用道具 举报

18

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-11-5
在线时间
0 小时
 楼主| 发表于 2014-2-14 16:38:58 | 显示全部楼层
貌似好复杂,还是用中断吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表