完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
if(key0==0)
{ delay1s(); delay1s(); delay1s(); if(key0==0) { while(!key0) { k4=1; } } 当按下开关key0大于3s 时,k4接通,这样写对不对?还有简单的没?大侠们帮帮忙指导一下 |
|
相关推荐
11个回答
|
|
|
|
|
|
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个星期就整出来一部分,尤其是开关长按,望给个答案 |
|
|
|
你这个程序有一点问题就是:
当你按下key0 3秒后你再次检测,还是处于接通时k4接通,但是在这3秒过程中如果松开键而在3秒后再次按键仍然条件有效会执行k4=0;另外,如果你的key0键一直按着就会进入一个接通循环,也就是在key0按下时会一直执行k4=0;所以你这个程序部合适 |
|
|
|
楼主,明白了没
|
|
|
|
哦,知道了,那请问该如何修改呢?
|
|
|
|
STM32每个IO口都能够配置中断,你需要在中断程序中写置位条件,根据三秒后的置位与按键置位同时合法才能产生k4=1;具体程序我就不写了
|
|
|
|
|
|
|
|
|
|
|
|
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; } } |
|
|
|
貌似好复杂,还是用中断吧
|
|
|
|
你的程序根本就不对,
|
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 14:07 , Processed in 1.290731 second(s), Total 101, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号