按键长按短按复用_MCS-51

//长按短按复用
void key_int(void)
{
	if (key == 0)
	{
		delay1ms(10);//消除前部抖动
 	if (key == 0)
 	{     
 		flag = 0;//后接switch选择程序
   	}
   	delay1ms(1000);
   	if (key == 0)
   	{
   	    flag = 1;
   	}
   	while(!key);//按键截至到后部抖动前夕
//消除后部抖动-->没必要,消除前+if起到了消除前后抖动+判断是前抖还是后抖
	}	
}
//@12MHz STC-Y1指令集
void delay1ms(uint x) //该函数声明占4个机器周期
{
    uint i, j;            //该语句不占时间
    for (i = 0; i < x : i++) //执行一次10机器周期
        for (j = 0; j< 121; j++); 
}
//定时器计数
int KEY_COUNT = 0;
typedef enum
{
	KEY_SINGLE_PRESSED,
	KEY_LONG_PRESSED,
	KEY_DEFAULT_STATUS,
} key_state_e;

uint8_t ylf_key_scan(void)
{
	static uint8_t press_flag;

	if(!KEY_PIN)
	{
		scs_delay_ms(10);
		if (!KEY_PIN)
		{
			press_flag = 1;
			TR0 = 1;           // 定时器0开始计数
			while(!KEY_PIN);    //
			TR0 = 0;           // 定时器0计数结束
		}
	}
	if (press_flag)
	{
		if (KEY_COUNT >= 100)
		{	
			KEY_COUNT = 0;
			press_flag = 0;			
			return KEY_LONG_PRESSED;

		} else {		
			KEY_COUNT = 0;
			press_flag = 0;	
			return KEY_SINGLE_PRESSED;
		}
	}
	return KEY_DEFAULT_STATUS;
}


int main(void)
{
	init_T0();
	while(1)
	{
		switch(ylf_key_scan())
		{
		case KEY_SINGLE_PRESSED:
			// TO DO
			break;
		case KEY_LONG_PRESSED:
			// TO DO
			break;
		default:
			break;
		}
	}
}

void init_T0(void)//@12MHz
{
    TMOD = 0x01;
	TL0 = 0xF0;		//设置定时初值10ms
	TH0 = 0xD8;		//设置定时初值
    ET0 = 1;
    EA = 1;
}
void int_T1(void) interput 1
{
    KEY_COUNT++;
    TL0 = 0xF0;		//设置定时初值10ms
	TH0 = 0xD8;		//设置定时初值
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值