单片机一键长按与短按按键实现的c程序有问题,实在不知道是哪里有问题,请帮助修改一下,谢谢!

功能如下:长按2秒灯全亮(我用的开发板),短按实现流水灯。程序如下:#include<reg52.h>#include<intrins.h>#defineucharuns... 功能如下:长按2秒灯全亮(我用的开发板),短按实现流水灯。
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint num,flag,gb,ga;
uchar aa=0xfe;
sbit key1=P3^7;
void delayms(uint);
void delayms(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void init() //初始化函数
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-1000)/256; //装初值1ms一次中断
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
void keyscan()
{
if (key1==0) //按键去抖
delayms(10);
if (key1==0) //有按键按下则启动定时器
{
TR0=1;
gb=1;}
if((!key1==0)&&(gb==1))
{TR0=0; //按键弹起则关闭定时器
ga=1;} //ga,gb分别表示按键按下和弹起过程有效标志位
if(num>2000) //长按有效
{ flag=1;num=0;}
while(flag==1)
{ P1=0; //灯全亮
if(key1==0) //有按键按下则退出长按程序
flag=3;
}
if((num<2000)&&(ga==1)) //短按有效
{flag=2;num=0;}
while(flag==2) //流水灯循环亮
{ P1=aa;
delayms(500);
aa=_crol_(aa,1);
if(key1==0) //有按键按下则退出短按程序
flag=3;}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
void T0_time() interrupt 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
num++;
}
展开
 我来答
coolaa
2012-06-03 · TA获得超过408个赞
知道小有建树答主
回答量:165
采纳率:0%
帮助的人:188万
展开全部
这……也太乱了吧?你能从这一大堆的逻辑中理出头绪来,我真佩服死你了。你这长按一处理,后面短按马上也生效了,长按跟没有一样。既然都用上定时器了,就别delay了,那东西只有教材上才会出现,实际应用上很少用到的。用定时器,设个基准时间比如200us一中断,然后设个10ms的按钮扫描时间,就是50个中断,用两个连续的按钮扫描低电平来确定按钮有效性,那个delay就可以88了,教条主义害死人啊。按扭有效后马上对“中断计数”,这个会吧?按钮按下就连加,放开就清0,下次重计数,2秒就是20000次中断,能计到这个数就说明长按有效,没计到这个数就说明短按有效,这样就可以分开处理啦,就这么简单,别老拿定时器开啊关啊。理清思路,别说长按短按,就是双击都可以做出来。
宇宙跳跃
2012-06-03 · 超过23用户采纳过TA的回答
知道答主
回答量:89
采纳率:100%
帮助的人:40.8万
展开全部
因为中后不赋初值,所以就由一开始的一毫秒变为6.55毫秒,相应的,按键时间也变了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式