标题:
单片机根据按键按下的状态获得按键标志源程序
[打印本页]
作者:
酱油兑啤酒
时间:
2020-3-3 15:47
标题:
单片机根据按键按下的状态获得按键标志源程序
idata KEY_FLAG key_flag;
/************************************************************
* 函数名称:按键扫描
* 描 述:根据按键按下的状态获得按键标志
* 输 入:无
* 输 出:无
************************************************************/
void key_scan(void)
{
uint8_t key_value = 0;
static uint8_t key_temp = 0;
static uint8_t status = KEY_SET;
key_value = P0&0x04;
switch(status)
{
case KEY_SET: if (key_value)
{
time_out = 0;
debounce_time = 320; // 消抖定时时间32ms
status = KEY_UP;
}
break;
case KEY_UP: if (debounce_time_flag)
{
if (key_value == key_temp)
status = KEY_DOWN;
else
status = KEY_SET;
}
break;
case KEY_DOWN: if (key_value == key_temp) // 还是上次的按键值
{
long_time = 10000; // 被按下没开始长按计时
status = KEY_RELEASE;
}
else if (!key_value)
status = KEY_SET;
break;
case KEY_RELEASE: if (!long_time_flag)
{
if ((key_value != key_temp)&&(key_value == 0)) // 放开的时候
{
key_flag.thick++;
time_out = 2000;
long_time = 0;
status = KEY_SET;
}
}
else
{
key_flag.long_press = 1;
if (key_value == 0)
{
status = KEY_SET;
key_flag.long_press = 0;
long_time_flag = 0;
}
}
break;
default:
break;
}
key_temp = key_value;
if (long_time_flag||time_out_flag)
{
key_temp = 0;
}
}
/************************************************************
* 函数名称:按键任务处理
* 描 述:根据按键扫描的结果处理对应的按键任务
* 输 入:无
* 输 出:无
************************************************************/
void key_task(void)
{
/*按键任务*/
if (time_out_flag)
{
time_out_flag = 0;
switch(key_flag.thick)
{
case 1:
user_data_fill(pwm_value); //初始化要发送的5bytes数据
RF_Send_Data_To_hardware(); //RF 开始发送给硬件
key_flag.thick = 0;
break;
default:
key_flag.thick = 0;
break;
}
}
if (key_flag.long_press == 1) // 如果长按释放了,清楚长按标志位
{
user_flag |= 0x01; // PWM调光标志置位
}
else
user_flag &= 0xFE; // PWM调光标志清零
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1