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