求助:单片机一键长按与短按按键实现的c程序有问题
时间:10-02
整理:3721RD
点击:
单片机一键长按与短按按键实现的c程序有问题,实在不知道是哪里有问题,请帮助修改一下,谢谢!
功能如下:长按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++;
}
功能如下:长按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++;
}
兄弟,问题解决了没有?
我有个问题请教下,本人正在做一个移动插卡音箱并带收音功能的产品开发。一个键短按实现播放/暂停,较长按实现进入下一个台,超长按实现自动搜台。
程序中缺少一个TR0=0;TH0=(65536-1000)/256; //装初值1ms一次中断
TL0=(65536-1000)%256;就是说短按了后没有关闭中断并重装
