上传了一个工程代码,目前发现是不是初始化的原因了,在按键扫描那输出这个结构体的数据,初始化中输出一次,结果是被修改了
- #include "key.h"
- #include "uart.h"
-
- #ifdef HAS_KEYS
-
- Key_t xdata g_keys[NUM_KEYS] = {
- #ifdef KEY1
- {KEY1},
- #endif // KEY1
- #ifdef KEY2
- {KEY2},
- #endif // KEY2
- #ifdef KEY3
- {KEY3},
- #endif // KEY3
- #ifdef KEY4
- {KEY4},
- #endif // KEY4
- #ifdef KEY5
- {KEY5},
- #endif // KEY5
- #ifdef KEY6
- {KEY6},
- #endif // KEY6
- };
-
- void keyInit(void)
- {
- UART_sendBytes(RS485_USE_UART, (u8 *)g_keys, sizeof(Key_t) * NUM_KEYS);
- }
-
- bit read_key(const u8 key_code)
- {
- switch (key_code)
- {
- #ifdef KEY1
- case KEY1:
- return !KEY1_PIN;
- #endif
- #ifdef KEY2
- case KEY2:
- return !KEY2_PIN;
- #endif
- #ifdef KEY3
- case KEY3:
- return !KEY3_PIN;
- #endif
- #ifdef KEY4
- case KEY4:
- return !KEY4_PIN;
- #endif
- #ifdef KEY5
- case KEY5:
- return !KEY5_PIN;
- #endif
- #ifdef KEY6
- case KEY6:
- return !KEY6_PIN;
- #endif
- default:
- return 0; // 无效键码
- }
- }
- void keyScan(void)
- {
- // 按键消抖计数
- static u8 keys_debounce[NUM_KEYS] = {0}, test = 0;
- bit key_stable_sta, key_sta;
- Key_t *key = NULL;
- u8 i;
-
- #ifdef SW_KTDY01
- WKTCL = 0xFF;
- WKTCH = 0x87;
- NOP2();
- MCU_IDLE();
- NOP2();
- #endif
-
- #ifdef KEY_ISP
- if (!KEY_ISP_PIN)
- {
- IAP_CONTR = 0x60; // in system programe ISP
- NOP2();
- }
- #endif // KEY_ISP
- if (test++ > 20)
- {
- test = 0;
- UART_sendBytes(RS485_USE_UART, (u8 *)g_keys, sizeof(Key_t) * NUM_KEYS);
- }
- for (i = 0; i < NUM_KEYS; i++)
- {
- key = &g_keys[i];
- key_sta = read_key(key->key_code);
-
- // 消抖处理 连续3次一致才认为按键有效
- if (key_sta)
- {
- if (keys_debounce[i] < 3)
- keys_debounce[i]++;
- }
- else
- {
- if (keys_debounce[i] > 0)
- keys_debounce[i]--;
- }
- key_stable_sta = keys_debounce[i] >= 3 ? 1 : 0;
-
- if (key_stable_sta)
- {
- if (key->state == 0)
- {
- // 按键按下时,初始化
- key->state = 1;
- key->press_time = 0;
- key->long_flag = 0;
- key->short_flag = 0;
- key->lock_flag = 0;
- }
- else
- {
- // 持续按下时,计时
- if (key->press_time < LONG_PRESS_TIME)
- key->press_time++;
-
- // 检查是否达到长按阈值且未触发过
- if (key->press_time >= LONG_PRESS_TIME && !key->long_flag && !key->lock_flag)
- {
- key->long_flag = 1; // 标记长按事件待处理
- key->lock_flag = 1;
- }
- }
- }
- else
- { // 释放按键
- if (key->state == 1)
- {
- if (!key->long_flag && !key->lock_flag && key->press_time >= SHORT_PRESS_TIME && key->press_time < LONG_PRESS_TIME)
- {
- key->short_flag = 1;
- }
- // 释放按键时, 重置按键状态
- key->state = 0;
- key->press_time = 0;
- key->lock_flag = 0;
- }
- }
- }
- }
-
- void keyService(void)
- {
- int i;
- Key_t *key = NULL;
- for (i = 0; i < NUM_KEYS; i++)
- {
- key = &g_keys[i];
- if (key->short_flag)
- {
- key->short_flag = 0;
- // Key_onClick(key->key_code);
- UART_sendBytes(RS485_USE_UART, (u8 *)key, sizeof(Key_t));
- }
- if (key->long_flag)
- {
- key->long_flag = 0;
- // Key_onLongPress(key->key_code);
- }
- }
- }
- #endif // HAS_KEYS
复制代码
运行时输出结果
- [09:02:22.359]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00 初始化函数输出的结果,下方所有输出是在扫描函数1秒输出一次
- [09:02:22.583]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:22.804]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:23.024]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:23.244]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:23.465]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:23.685]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:23.905]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:24.126]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:24.346]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:24.566]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:24.786]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:25.007]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:02:25.227]收←◆00 00 00 02 00 00 03 00 00 04 00 00 05 00 00
复制代码 将xdata修改为idata或删除就输出的结果是正常的
- [09:12:25.479]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:25.699]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:25.919]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:26.139]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:26.360]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:26.580]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:26.800]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:27.021]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
- [09:12:27.241]收←◆01 00 00 02 00 00 03 00 00 04 00 00 05 00 00
复制代码
|