Browse Source

feature:1.更换按键的BSP(使用定时器0中断/10ms)和TASK,增加长按和短按标志

master
Zhangwen 4 months ago
parent
commit
416609dcd0
  1. 4
      .vscode/settings.json
  2. 18
      source/app/main.c
  3. 44
      source/app/task_btn.c
  4. 23
      source/app/task_btn.h
  5. 14
      source/app/task_key.c
  6. 2
      source/app/task_key.h
  7. 84
      source/bsp/bsp_btn.c
  8. 39
      source/bsp/bsp_btn.h
  9. 2
      source/bsp/bsp_config.h
  10. 5
      source/ctask/time.c

4
.vscode/settings.json

@ -25,6 +25,8 @@
"task_key.h": "c",
"task_game.h": "c",
"app_config.h": "c",
"type_traits": "c"
"type_traits": "c",
"task_btn.h": "c",
"bsp_btn.h": "c"
}
}

18
source/app/main.c

@ -49,11 +49,11 @@ void L0_main_init(void)
//w600任务初始化
// L3_task_gm35_flow_init(W600_ST);
//按键任务初始化
L0_key_init();
// L0_key_init();
//笔头任务初始化
L1_oid_init();
//语音模块初始化
// L3_task_speech_init();
L3_task_speech_init();
//tcp轮询任务初始化
L3_task_tcp_init();
L3_task_tcp_control_init();
@ -91,7 +91,7 @@ void main(void)
{
s_nos_tick.t1s_heartbeat = 0;//置0清空
D_print_heartbeat()
L0_uart0_uc('.');
L0_uart0_uc('.');
}
#if 0
// 串口2的 接收数据 测试
@ -119,7 +119,6 @@ void main(void)
// s_uart1_rec.buf= 传感器数据
/// ff 08 xh xl yh yl zh zl
/// s_uart1_rec.ok =1;
}
/// L2_sd_save();
#endif
/////////////////////////////////////////
@ -149,25 +148,26 @@ void main(void)
L3_task_game_handler(&_s_task_game);
//笔头数据采集
L3_task_oid_handle(&ts_task_oid);
// L3_task_oid_handle(&ts_task_oid);
//WIFI
// L3_uart2_exp_protocol(&s_uart2_at);
L2_task_gm35_flow_handle(&s_task_gm35_flow);
// L2_task_gm35_flow_handle(&s_task_gm35_flow);
//寄存器值监控
L3_task_reglisten_handle(&s_task_reglisten);
// L3_task_reglisten_handle(&s_task_reglisten);
//输出,响应485协议
//L3_task_modbus_handler(&s_uart0_rec);
//语音模块
L3_task_speech_handle(&ts_speech);
// L3_task_speech_handle(&ts_speech);
//按键处理
L3_task_key_handle(&s_task_key_handle);
task_btn();
// L3_task_key_handle(&s_task_key_handle);
//L3_task_modbus_handler2(&s_uart2_rec);
#if 1

44
source/app/task_btn.c

@ -0,0 +1,44 @@
#include "task_btn.h"
#include "../bsp/bsp_btn.h"
#include "../bsp/bsp_config.h"
#include "../msp/UART0.h"
void task_btn(void)
{
switch(g_Key)
{
case KEY_UP:
if(g_KeyActionFlag == LONG_KEY)
{
L0_uart0_uc('#');
L0_uart0_uchex(g_Key);
L0_uart0_0d0a();
g_Key = KEY_NULL;
g_KeyActionFlag = NULL_KEY;
}
else if(g_KeyActionFlag == SHORT_KEY)
{
L0_uart0_uc('@');
L0_uart0_uchex(g_Key);
L0_uart0_0d0a();
LED1 = ~LED1;
g_Key = KEY_NULL;
g_KeyActionFlag = NULL_KEY;
}
break;
case KEY_DOWN:
LED2 = ~LED2;
L0_uart0_uchex(g_Key);
L0_uart0_0d0a();
g_Key = KEY_NULL;
break;
case KEY_PWR:
LED4 = ~LED4;
L0_uart0_uchex(g_Key);
L0_uart0_0d0a();
g_Key = KEY_NULL;
break;
default: break;
}
}

23
source/app/task_btn.h

@ -0,0 +1,23 @@
/**
* 使Key_Scan()2ms,
* 10ms,switch case语句的时间差为10ms
* 10ms的间隙跳过按键抖动
*/
#ifndef _app_task_btn_H
#define _app_task_btn_H
// struct _s_task_key_
// {
// TS_task task;
// vU8 key1_ok;
// vU8 key2_ok;
// vU8 key3_ok;
// vU8 time1;
// vU16 time2;
// vU8 time3;
// };
// extern struct _s_task_key_ s_task_key_handle;
// extern void L0_key_init(void);
// extern void L3_task_key_handle(struct _s_task_key_ *p);
extern void task_btn(void);
#endif

14
source/app/task_key.c

@ -91,7 +91,7 @@ void L3_task_key_handle(struct _s_task_key_ *p)
while(!key1)
{
p->time1++;
// L0_uart0_uchex(p->time1);
L0_uart0_uchex(p->time1);
}
}
}
@ -147,11 +147,11 @@ void L3_task_key_handle(struct _s_task_key_ *p)
}
if(p->key2_ok == 1) //if(p->key2_ok) 这里的p->key2_ok总是被赋值为0xFB,原因未知
{
L0_uart0_sendstr("p->key2_ok = ");
L0_uart0_uchex(p->key2_ok);
L0_uart0_0d0a();
if(p->time2>=10)
{
if((p->time2)/100>=20)
{
L0_uart0_sendstr("p->time2 = ");
L0_uart0_ushex(p->time2);
L0_uart0_0d0a();
L0_uart0_sendstr("zbt");
L0_uart0_0d0a();
L0_uart3_sendArray((U8 *)&audio_zbt,9);
@ -202,7 +202,7 @@ void L3_task_key_handle(struct _s_task_key_ *p)
//Lc_delay_ms(10);//按键防抖
if(key3 == 0)
{
p->key3_ok = 1;
p->key3_ok = 1;
while(!key3)
{
p->time3++;

2
source/app/task_key.h

@ -25,7 +25,7 @@ struct _s_task_key_
vU8 key2_ok;
vU8 key3_ok;
vU8 time1;
vU8 time2;
vU16 time2;
vU8 time3;
};
extern struct _s_task_key_ s_task_key_handle;

84
source/bsp/bsp_btn.c

@ -0,0 +1,84 @@
/*
*
* 10ms < T < 1 s, T >1 s
* 使10ms,10ms刚好跳过抖动
* 使switch case语句实现状态之间的跳转
* lock变量用于判断是否是第一次进行按键确认状态
*
*/
#include "bsp_btn.h"
#include "bsp_config.h"
#include "bsp_config.h"
#include "../msp/UART0.h"
extern KEY_STATE KeyState = KEY_CHECK; // 初始化按键状态为检测状态
KEY_TYPE g_KeyActionFlag = NULL_KEY; // 用于区别长按和短按
KEY_VALUE g_Key = KEY_NULL;
u8 g_KeyFlag = 0; // 按键有效标志,0 无效 1 有效
static u8 TimeCnt = 0; //10ms为颗粒
static u8 lock = 0; //lock变量用于判断是否是第一次进行按键确认状态
void Key_Scan(void)
{
static u8 TimeCnt = 0; //10ms为颗粒
static u8 lock = 0;
switch (KeyState)
{
//按键未按下状态,此时判断Key的值
case KEY_CHECK:
if(!Key) //如果按键Key值为0,说明按键开始按下,进入下一个状态
{
KeyState = KEY_COMFIRM;
}
TimeCnt = 0; //计数复位
lock = 0;
break;
//按键按下状态确认:
case KEY_COMFIRM:
if(!Key) //查看当前Key是否还是0,再次确认是否按下
{
if(!lock) lock = 1; //第一次进来置1
TimeCnt ++;
// 多按键判断
if(0 == key1) g_Key = KEY_UP;
else if(0 == key2) g_Key = KEY_DOWN;
else if(0 == key3) g_Key = KEY_PWR;
if(TimeCnt > 200) // 长按 2 s
{
L0_uart0_uc('#');
g_KeyActionFlag = LONG_KEY;
TimeCnt = 0;
lock = 0; //重新检查
KeyState = KEY_RELEASE; // 需要进入按键释放状态
}
// ???????????????????????
}
else
{
if(lock) //不是第一次进入,释放按键才执行
{
g_KeyActionFlag = SHORT_KEY; // 短按
KeyState = KEY_RELEASE; // 需要进入按键释放状态
}
else // 当前Key值为1,确认为抖动,则返回上一个状态
{
KeyState = KEY_CHECK; // 返回上一个状态
}
}
break;
//按键释放状态
case KEY_RELEASE:
if(Key) //当前Key值为1,说明按键已经释放,返回开始状态
{
KeyState = KEY_CHECK;
}
break;
default:
break;
}
}

39
source/bsp/bsp_btn.h

@ -0,0 +1,39 @@
/**
* 使Key_Scan()2ms,
* 10ms,switch case语句的时间差为10ms
* 10ms的间隙跳过按键抖动
*/
#ifndef _bsp_btn_H
#define _bsp_btn_H
// 区分长按和短按
typedef enum
{
NULL_KEY = 0,
SHORT_KEY = 1,
LONG_KEY = 2,
}KEY_TYPE;
// 按键状态:检测、确认、释放
typedef enum
{
KEY_CHECK = 0,
KEY_COMFIRM = 1,
KEY_RELEASE = 2,
}KEY_STATE;
// 按键值
typedef enum
{
KEY_NULL,
KEY_UP,
KEY_DOWN,
KEY_PWR,
}KEY_VALUE;
extern KEY_VALUE g_Key;
extern KEY_TYPE g_KeyActionFlag;
extern void Key_Scan(void);

2
source/bsp/bsp_config.h

@ -178,6 +178,8 @@
#define key1 P32 //音量增大
#define key2 P33 //音量减小
#define key3 P40 //开关机
#define Key (key1 && key2 && key3)
//EEP存储地址定义
#define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes
#define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等

5
source/ctask/time.c

@ -1,5 +1,6 @@
#include "time.h"
#include "../msp/uartx.h"
#include "../bsp/bsp_btn.h"
#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - 1.0 * (clk) / 1000 * (1.0 * timeInUs / 1000) / t)
//#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - (clk) / 1000 * timeInUs / 1000 / t)
@ -39,6 +40,8 @@ void timer0_isrHandle (void) D_SERVE_TIMER0
L1_tick_tick(); ///系统中的1sflag 和以10ms为颗粒的延时使用 为tdelay服务
Key_Scan();
//串口回调
for(i = 0; i < SERIAL_MAX_NUM; i++)
{
@ -48,6 +51,8 @@ void timer0_isrHandle (void) D_SERVE_TIMER0
}
}
#endif
/// BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0);
NOP(); NOP(); NOP();

Loading…
Cancel
Save