8 changed files with 318 additions and 15 deletions
@ -0,0 +1,113 @@ |
|||
////////////////////////////////////////////////////////////////////////////
|
|||
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
|
|||
///-------------------------------------------------------------------------
|
|||
/// @file bsp_drv.c
|
|||
/// @brief bsp @ driver config
|
|||
///-------------------------------------------------------------------------
|
|||
/// @version 1.0
|
|||
/// @author CC
|
|||
/// @date 20180331
|
|||
/// @note cc_AS_stc02
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
#include "task_btn_nonblock.h" |
|||
#include "../app/app_config.h" |
|||
#include "../bsp/bsp_config.h" |
|||
#include "../msp/uart0.h" |
|||
#include "../bsp/bsp_key_nonblock.h" |
|||
#include "../bsp/bsp_led.h" |
|||
|
|||
S_TASK_BTN _s_task_btn; |
|||
static int i; |
|||
static U8 key; |
|||
|
|||
void L3_task_btn_init(void) |
|||
{ |
|||
L1_task_init(&_s_task_btn.task); |
|||
L3_task_s_go(_s_task_btn,D_task_init); |
|||
} |
|||
|
|||
#define D_TASK_BTN_SCAN 0x50 |
|||
#define D_TASK_BTN_SHAKE 0x51 |
|||
#define D_TASK_BTN_COMPLETE 0x52 |
|||
|
|||
void L3_task_btn_handler(S_TASK_BTN *s) |
|||
{ |
|||
TTSS_Task_init() |
|||
L2_task_go(D_TASK_BTN_SCAN); |
|||
|
|||
TTSS_Task_step(D_TASK_BTN_SCAN) |
|||
//检测是否有按键按下,并记录行、列
|
|||
key = bsp_key_nonblock_scan(&s->row, &s->col); |
|||
if(key != BSP_KEY_NUM_MAX) |
|||
{ |
|||
//检测到的按键按下次数
|
|||
s->times = 0; |
|||
//最大次数阈值,超过阈值停止检测,判定为按键放开
|
|||
s->times_threshold = 100; |
|||
//再次检测(防抖动、检测按键弹起)
|
|||
L2_task_go_Tdelay(D_TASK_BTN_SHAKE, D_Tdelay_5ms); |
|||
} |
|||
|
|||
TTSS_Task_step(D_TASK_BTN_SHAKE) |
|||
//检测当前列是否仍处于按下状态,或者按下超时
|
|||
//此时row仍处于检测状态,不需要再次调用scan_row()
|
|||
if(bsp_key_nonblock_scan_col(s->col) == 0 || s->times > s->times_threshold) |
|||
{ |
|||
L2_task_go_Tdelay(D_TASK_BTN_COMPLETE, 0); |
|||
} |
|||
else |
|||
{ |
|||
s->times ++; |
|||
//每5s检测一次
|
|||
L2_task_go_Tdelay(D_TASK_BTN_SHAKE, D_Tdelay_5ms); |
|||
} |
|||
|
|||
TTSS_Task_step(D_TASK_BTN_COMPLETE) |
|||
//至少一次,防抖动
|
|||
if(s->times > 1) |
|||
{ |
|||
L0_uart0_uc('#'); |
|||
L0_uart0_uchex(key); |
|||
|
|||
//功能按键
|
|||
if(key == 0) |
|||
{ |
|||
//设置功能按键按下
|
|||
R.func_btn = 1; |
|||
//此处代码注释掉:因为低功耗由上位机处理
|
|||
//功能键按下退出低功耗模式
|
|||
//L3_set_power_mode(POWER_NORMAL);
|
|||
} |
|||
//心电模式
|
|||
else if(key == 13) |
|||
{ |
|||
//设置心电模式按下
|
|||
R.xd_mode ^= 1; |
|||
//亮灯
|
|||
R.led_status[key] = R.xd_mode; |
|||
} |
|||
else if(key>=1 && key <=12) |
|||
{ |
|||
//如果不需要授权 or 需要但已经授权
|
|||
if(!(R.auth_flag & 0xF0) || (R.auth_flag & 0x0F)) |
|||
{ |
|||
//L0_uart0_uc('$');
|
|||
//L0_uart0_uchex(key);
|
|||
|
|||
//设置对应的rfid
|
|||
L3_new_rfid(R.rfid_table[key], 0, 0xFF); |
|||
|
|||
//亮灯
|
|||
R.led_status[key] = 1; |
|||
} |
|||
} |
|||
} |
|||
L2_task_go_Tdelay(D_TASK_BTN_SCAN,0); |
|||
|
|||
TTSS_Task_end(); |
|||
} |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,35 @@ |
|||
////////////////////////////////////////////////////////////////////////////
|
|||
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
|
|||
///-------------------------------------------------------------------------
|
|||
/// @file bsp_drv.h
|
|||
/// @brief bsp @ driver config
|
|||
///-------------------------------------------------------------------------
|
|||
/// @version 1.0
|
|||
/// @author CC
|
|||
/// @date 20180331
|
|||
/// @note cc_AS_stc02
|
|||
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
#ifndef _APP_TASK_BTN_NONBLOCK_H |
|||
#define _APP_TASK_BTN_NONBLOCK_H |
|||
|
|||
#include "../ctask/task.h" |
|||
#include "../clib/clib.h" |
|||
|
|||
typedef struct _s_task_btn |
|||
{ |
|||
TS_task task; |
|||
U8 row, col; |
|||
U16 times; |
|||
U16 times_threshold; |
|||
}S_TASK_BTN; |
|||
|
|||
extern S_TASK_BTN _s_task_btn; |
|||
|
|||
extern void L3_task_btn_init(void); |
|||
extern void L3_task_btn_handler(S_TASK_BTN *s); |
|||
|
|||
|
|||
#endif // #ifndef _APP_TASK_BTN_NONBLOCK_H
|
|||
|
@ -0,0 +1,138 @@ |
|||
#include "bsp_key_nonblock.h" |
|||
|
|||
U32 timeout = 0x3FFFFF; |
|||
|
|||
U8 bsp_key_nonblock_init(void) |
|||
{ |
|||
//初始化为高电平
|
|||
KR1 = KR2 = KR3 = KR4 = 1; |
|||
//初始化为高电平
|
|||
KC1 = KC2 = KC3 = KC4 = 1; |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
void bsp_key_nonblock_scan_row(U8 r) |
|||
{ |
|||
KR1 = 1; |
|||
KR2 = 1; |
|||
KR3 = 1; |
|||
KR4 = 1; |
|||
switch(r){ |
|||
case 1: |
|||
KR1 = 0;break; |
|||
case 2: |
|||
KR2 = 0;break; |
|||
case 3: |
|||
KR3 = 0;break; |
|||
case 4: |
|||
KR4 = 0;break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
|
|||
U8 bsp_key_nonblock_scan_col(U8 c) |
|||
{ |
|||
if(c == 1) |
|||
{ |
|||
return (KC1 == 0); |
|||
} |
|||
else if(c == 2) |
|||
{ |
|||
return (KC2 == 0); |
|||
} |
|||
else if(c == 3) |
|||
{ |
|||
return (KC3 == 0); |
|||
} |
|||
else if(c == 4) |
|||
{ |
|||
return (KC4 == 0); |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
U8 bsp_key_nonblock_scan(U8 *row, U8 *col) |
|||
{ |
|||
//扫描第1行
|
|||
bsp_key_nonblock_scan_row(1); |
|||
*row = 1; |
|||
if(bsp_key_nonblock_scan_col(1) > 0){ |
|||
*col = 1; |
|||
return 0; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(2) > 0){ |
|||
*col = 2; |
|||
return 1; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(3) > 0){ |
|||
*col = 3; |
|||
return 2; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(4) > 0){ |
|||
*col = 4; |
|||
return 3; |
|||
} |
|||
|
|||
//扫描第2行
|
|||
bsp_key_nonblock_scan_row(2); |
|||
*row = 2; |
|||
if(bsp_key_nonblock_scan_col(1) > 0){ |
|||
*col = 1; |
|||
return 4; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(2) > 0){ |
|||
*col = 2; |
|||
return 5; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(3) > 0){ |
|||
*col = 3; |
|||
return 6; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(4) > 0){ |
|||
*col = 4; |
|||
return 7; |
|||
} |
|||
|
|||
//扫描第3行
|
|||
bsp_key_nonblock_scan_row(3); |
|||
*row = 3; |
|||
if(bsp_key_nonblock_scan_col(1) > 0){ |
|||
*col = 1; |
|||
return 8; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(2) > 0){ |
|||
*col = 2; |
|||
return 9; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(3) > 0){ |
|||
*col = 3; |
|||
return 10; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(4) > 0){ |
|||
*col = 4; |
|||
return 11; |
|||
} |
|||
|
|||
//扫描第4行
|
|||
bsp_key_nonblock_scan_row(4); |
|||
*row = 4; |
|||
if(bsp_key_nonblock_scan_col(1) > 0){ |
|||
*col = 1; |
|||
return 12; |
|||
} |
|||
if(bsp_key_nonblock_scan_col(2) > 0){ |
|||
*col = 2; |
|||
return 13; |
|||
} |
|||
// if(bsp_key_nonblock_scan_col(KC3) > 0){
|
|||
// return 14;
|
|||
// }
|
|||
// if(bsp_key_nonblock_scan_col(KC4) > 0){
|
|||
// return 15;
|
|||
// }
|
|||
|
|||
return BSP_KEY_NUM_MAX; |
|||
} |
|||
|
@ -0,0 +1,12 @@ |
|||
#ifndef _BSP_KEY_NONBLOCK_H |
|||
#define _BSP_KEY_NONBLOCK_H |
|||
|
|||
#include "bsp_config.h" |
|||
|
|||
#define BSP_KEY_NUM_MAX 99 |
|||
|
|||
extern U8 bsp_key_nonblock_init(void); |
|||
extern U8 bsp_key_nonblock_scan(U8 *row, U8 *col); |
|||
extern U8 bsp_key_nonblock_scan_col(U8 col); |
|||
|
|||
#endif |
Loading…
Reference in new issue