Browse Source

feature: 添加按键非阻塞模式读取

bfysop-v2
mr.zhangsan 12 months ago
parent
commit
1aedc5880f
  1. 20
      keilp/cc_as_stc02_ps5ws.uvprojx
  2. 3
      source/app/main.c
  3. 6
      source/app/main.h
  4. 113
      source/app/task_btn_nonblock.c
  5. 35
      source/app/task_btn_nonblock.h
  6. 6
      source/app/task_rfid.c
  7. 138
      source/bsp/bsp_key nonblock.c
  8. 12
      source/bsp/bsp_key_nonblock.h

20
keilp/cc_as_stc02_ps5ws.uvprojx

@ -370,11 +370,6 @@
<FileType>1</FileType>
<FilePath>..\source\app\task_bled.c</FilePath>
</File>
<File>
<FileName>task_btn.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_btn.c</FilePath>
</File>
<File>
<FileName>task_nfc_auth.c</FileName>
<FileType>1</FileType>
@ -385,6 +380,11 @@
<FileType>1</FileType>
<FilePath>..\source\app\task_low_power.c</FilePath>
</File>
<File>
<FileName>task_btn_nonblock.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\task_btn_nonblock.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -455,11 +455,6 @@
<FileType>1</FileType>
<FilePath>..\source\bsp\rs485.c</FilePath>
</File>
<File>
<FileName>bsp_key.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_key.c</FilePath>
</File>
<File>
<FileName>bsp_config_delay.c</FileName>
<FileType>1</FileType>
@ -475,6 +470,11 @@
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_led.c</FilePath>
</File>
<File>
<FileName>bsp_key nonblock.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_key nonblock.c</FilePath>
</File>
</Files>
</Group>
<Group>

3
source/app/main.c

@ -108,7 +108,8 @@ void L0_task_init()
{
//外设初始化
bsp_led_init();
bsp_key_init();
// bsp_key_init();
bsp_key_nonblock_init();
bsp_rfid_init();
//任务初始化

6
source/app/main.h

@ -41,7 +41,8 @@
#include "../bsp/bsp_config.h"
#include "../bsp/bsp_config_delay.h"
#include "../bsp/bsp_led.h"
#include "../bsp/bsp_key.h"
// #include "../bsp/bsp_key.h"
#include "../bsp/bsp_key_nonblock.h"
#include "../bsp/bsp_rfid.h"
#include "../bsp/chipid.h"
#include "../bsp/cs1232.h"
@ -59,7 +60,8 @@
#include "../app/task_rfid.h"
#include "../app/task_rs485.h"
#include "../app/task_bled.h"
#include "../app/task_btn.h"
// #include "../app/task_btn.h"
#include "../app/task_btn_nonblock.h"
#include "../app/task_nfc_auth.h"
#include "../app/task_low_power.h"

113
source/app/task_btn_nonblock.c

@ -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();
}

35
source/app/task_btn_nonblock.h

@ -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

6
source/app/task_rfid.c

@ -89,7 +89,8 @@ U8 verify_mask(U8 *rfid)
int i;
for(i=0;i<6;i++)
{
if(rfid[i] != RFID_READ_MASK[i]){
if(rfid[i] != RFID_READ_MASK[i])
{
return 0;
}
}
@ -101,7 +102,8 @@ U8 verify_mask(U8 *rfid)
//Type:00命令帧 /01响应帧 /02通知帧
//Command: 07指令桢 /22单次读写 /27多次轮询 /28停止轮询 /0C选择 / B6设置功率
//数据长度:00 11
//数据:D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 [EB 98]
//数据:RSSI PC PC EPC0 00 10 71 00 00 52 EPC7 ANT [EB 98]
//数据:D5 20 00 E2 00 10 71 00 00 52 9B 40 [EB 98]
//校验:0C 从Type到数据字段 [02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98] 的所有字节的累加和
//帧尾:7E
void parse_rfid_pkg()

138
source/bsp/bsp_key nonblock.c

@ -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;
}

12
source/bsp/bsp_key_nonblock.h

@ -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…
Cancel
Save