导航

按键_长按_短按

#define led P1//流水灯显示驱动端口
char ledtable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//显示状态数组
sbit k1=P3^4;//按键1
sbit k2=P3^5;//按键2
char times,times1;//定时变量
void main(void)
{
char i;//数组访问下标变量
TMOD=0X11;//同时开通两个定时器
TH0=(65535-15535)/256;//定时器初值设定,50000*1us=50ms
TL0=(65535-15535)%256;
TH1=(65535-15535)/256;
TL1=(65535-15535)%256;
ET0=1;//同时开通两个定时器的中断允许位
ET1=1;
EA=1;//开通总中断允许位
while(1)
{
times=0;//初始化长按时间变量
if(k1==0||k2==0)//k1或者k2按下
{
delay(5);//防止按键抖动
if(k1==0||k2==0)
{
led=ledtable[i];//灯光显示
i++;//每次短按切换到下一个状态
if(i==8) i=0;//到达最后一个状态从新开始
}
while(k1==0||k2==0)//防止非长按,频繁动作
{
TR0=1;//定时器0开始计数
if(times==40)//按键2秒之后判断为长按
{
TR0=0;//定时器0停止计数
led=ledtable[i];//显示状态
i++;//切换
if(i==8) i=0;//从新开始显示
times1=0;//定时器1计时初始化
while(1)
{
TR1=1;//开启定时器1
if(times1==3) //当定时时间到,关掉定时器1计数,退出循环。
{
TR1=0;break;
}
}
}
}
}
}
}
void timer_interrupt() interrupt 1 //定时器0中断,入口序号1,进入中断后重设初值,计时值加1
{
TH0=(65535-15535)/256;
TL0=(65535-15535)%256;
times++;
}
void timer1_interrupt() interrupt 3 //入口序号:INT0 T0 INT1 T1 SERIAL
{
TH0=(65535-15535)/256;
TL0=(65535-15535)%256;
times1++;
}

posted on 2017-01-13 22:04  刘梢  阅读(169)  评论(0编辑  收藏  举报