|
代码没反应!!!
按键处理函数:
长按点亮LED1
短按点亮LED1
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LONG_time 4 //定义长按设置键的时间
uchar Keycount; //设置按键时长计数器
uchar skpttime; //设置按键时长
uchar longflag; //设置长按标志
bit skpflag; //设置按键按下标志
sbit SETKEY =P2^0; //多功能按键(短按,长按)
sbit LED1 =P2^1;
sbit LED2 =P2^2;
void delay1ms(uchar ms)
{
while(ms--) //每循环一次,约延迟1ms
{
uchar i;
for(i=0;i<250;i++) //循环250次,在12M晶振时约延时1ms
{
_nop_(); //执行一条_nop_()指令为一个机器周期
_nop_();
_nop_();
_nop_();
}
}
}
/*------------按键处理程序--------------------------*/
void KEY_Short() /*(短按k2)*/
{
LED1=1;
LED2=0;
}
void KEY_Long() /*(长按k2)*/
{
LED1=0;
LED2=1;
}
/*----------检测及处理多功能设置按键KEY-------------*/
void setkeyscan()
{
if(skpflag) //判断是否已经有键按下未被处理
{
if(Keycount>LONG_time) //如果是长按则执行长按键设置功能
{
KEY_Long();
skpflag=0;
longflag=1;
}
else if((skpttime>0)&&(skpttime<=LONG_time))//否则如果是短按则执行短按的功能,都不是直接跳过
{
KEY_Short();
skpflag=0;
}
}
else
{
if(!SETKEY) //按下设置键
{
delay1ms(10); //键盘防抖
if((!SETKEY)&&longflag==0)
{
Keycount=0; //初始化按键时长计数器
skpttime=0; //初始化按键时长
skpflag=1; //标志已经有键被按下
longflag=0;
}
}else
{
longflag=0;
}
}
}
void key_init()
{
Keycount=0; //初始化功能键按下时长计数器
skpttime=0; //初始化功能键按下的总时长
SETKEY=1; //KEY设置为输入端口
longflag=0;
LED1=0;
LED2=0;
}
/*---------------主函数--------------------*/
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
key_init();
while(1)
{
setkeyscan();
}
}
/*************定时器中断函数****************/
void Timer0(void) interrupt 1
{
if(skpflag)
{
Keycount++;
if(SETKEY)
skpttime=Keycount;
}
}
|
|