2026-07-15 15:57:37 +08:00
|
|
|
|
#ifndef __CONFIG_H__
|
|
|
|
|
|
#define __CONFIG_H__
|
|
|
|
|
|
|
2026-07-15 16:14:30 +08:00
|
|
|
|
#include "stc32g.h"
|
|
|
|
|
|
#include "intrins.h"
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
// 重新定义基础数据类型,便于跨平台和简化代码书写
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef unsigned char u8;
|
|
|
|
|
|
typedef unsigned int u16;
|
|
|
|
|
|
typedef unsigned long u32;
|
|
|
|
|
|
|
2026-07-28 18:03:20 +08:00
|
|
|
|
// STC32G 端口内部上拉控制寄存器地址定义 (属于扩展 XSFR 空间)
|
|
|
|
|
|
#ifndef P3PU
|
|
|
|
|
|
#define P3PU (*(unsigned char volatile xdata *)0xFE13)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2026-07-15 16:14:30 +08:00
|
|
|
|
/* ====== 硬件引脚定义 (sbit) ====== */
|
2026-07-16 17:52:52 +08:00
|
|
|
|
// 振动马达控制端 (推挽输出,与 SPI SCLK 物理共享引脚)
|
|
|
|
|
|
sbit MOTOR = P2^5;
|
|
|
|
|
|
// 侧边按键 ▲ (高阻输入 + 上拉),按下为低电平
|
|
|
|
|
|
sbit KEY_UP = P0^1;
|
|
|
|
|
|
// 侧边按键 ■ (高阻输入 + 上拉),按下为低电平
|
|
|
|
|
|
sbit KEY_CONFIRM = P0^2;
|
|
|
|
|
|
// 侧边按键 ▼ (高阻输入 + 上拉),按下为低电平
|
|
|
|
|
|
sbit KEY_DOWN = P0^3;
|
2026-07-28 18:03:20 +08:00
|
|
|
|
// 电源保持控制引脚 (1:锁存保持电源, 0:切断电源关机)
|
|
|
|
|
|
#define PWR_HOLD P00
|
|
|
|
|
|
// PCF8563 RTC 实时时钟芯片 I2C 通信引脚
|
|
|
|
|
|
#define RTC_SCL P32
|
|
|
|
|
|
#define RTC_SDA P33
|
2026-07-16 17:52:52 +08:00
|
|
|
|
// 物理 SOS 求救按键 (高阻输入 + 上拉),按下为低电平
|
|
|
|
|
|
sbit KEY_SOS = P2^6;
|
|
|
|
|
|
// FCOB 幻彩灯条 DIN 数据控制线
|
|
|
|
|
|
sbit RGB_DIN = P2^3;
|
2026-07-17 19:43:02 +08:00
|
|
|
|
// LR690L 射频芯片休眠/工作控制引脚 (0:开启工作, 1:关闭休眠)
|
|
|
|
|
|
sbit SHUT = P3^5;
|
|
|
|
|
|
// LHS114TC-IF03 屏幕 LEDA 白色背光开启引脚 (1点亮,0熄灭)
|
|
|
|
|
|
sbit SGM_CTRL = P1^7;
|
|
|
|
|
|
// LHS114TC-IF03 屏幕复位脚 (RESET),低电平复位
|
2026-07-16 17:52:52 +08:00
|
|
|
|
sbit LCD_RST = P1^0;
|
2026-07-17 19:43:02 +08:00
|
|
|
|
// LHS114TC-IF03 屏幕数据/指令选择脚 (D/C,1:数据, 0:命令)
|
2026-07-16 17:52:52 +08:00
|
|
|
|
sbit LCD_DCX = P1^1;
|
2026-07-17 19:43:02 +08:00
|
|
|
|
// LHS114TC-IF03 屏幕 SPI 数据脚 (MOSI/SDA)
|
2026-07-16 17:52:52 +08:00
|
|
|
|
sbit LCD_SDI = P1^4;
|
2026-07-17 19:43:02 +08:00
|
|
|
|
// LHS114TC-IF03 屏幕 SPI 时钟脚 (SCLK)
|
2026-07-16 17:52:52 +08:00
|
|
|
|
sbit LCD_SCL = P1^5;
|
2026-07-17 19:43:02 +08:00
|
|
|
|
// LHS114TC-IF03 屏幕 SPI 片选脚 (CS),低电平有效
|
2026-07-28 18:03:20 +08:00
|
|
|
|
sbit LCD_CS = P1^6;
|
|
|
|
|
|
|
|
|
|
|
|
// 充电检测引脚 (TP4054 CHRG 开漏输出,低电平=充电中)
|
|
|
|
|
|
// 硬件连接:TP4054 CHRG → DET → MCU (根据原理图,需 PCB 确认实际引脚)
|
|
|
|
|
|
// 架构文档标注为 P5.4,原理图标注为 P1.7 附近,暂用 P5.4,可根据实测调整
|
|
|
|
|
|
sbit CHRG_DET = P5^4;
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
/* ====== 系统运行状态枚举 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef enum {
|
2026-07-16 17:52:52 +08:00
|
|
|
|
STATE_NORMAL, // 正常时钟待机状态
|
|
|
|
|
|
STATE_ARMED, // 布防状态 (监测传感器警报)
|
|
|
|
|
|
STATE_DISARMED, // 撤防状态 (忽略普通传感器警报)
|
|
|
|
|
|
STATE_PAIR_MENU, // 传感器对码/配置主菜单状态
|
|
|
|
|
|
STATE_PAIR_WAIT, // 等待传感器射频信号状态 (对码搜寻中)
|
|
|
|
|
|
STATE_PAIR_CONFIRM, // 捕获到信号,进入防区微调确认状态
|
|
|
|
|
|
STATE_PAIR_SUCCESS, // 对码成功反馈状态
|
|
|
|
|
|
STATE_PAIR_FAIL, // 对码失败 (超时等) 反馈状态
|
|
|
|
|
|
STATE_ALARM, // 传感器入侵报警状态
|
|
|
|
|
|
STATE_SOS_EMITTED, // 处于 SOS 紧急求救发射状态
|
|
|
|
|
|
STATE_SET_TIME, // 时间调整编辑状态 (修改小时、分钟)
|
|
|
|
|
|
STATE_IPC_BIND, // 摄像机/IPC 绑定发射信号状态
|
|
|
|
|
|
STATE_SLEEP // 低功耗休眠挂起状态
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} SystemState;
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 按键事件类型枚举 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef enum {
|
2026-07-16 17:52:52 +08:00
|
|
|
|
KEY_EVENT_NONE, // 无按键事件
|
|
|
|
|
|
KEY_EVENT_UP_CLICK, // ▲ 键短按释放
|
|
|
|
|
|
KEY_EVENT_DOWN_CLICK, // ▼ 键短按释放
|
|
|
|
|
|
KEY_EVENT_SOS_CLICK, // SOS 键短按释放
|
|
|
|
|
|
KEY_EVENT_UP_LONG, // ▲ 键长按事件 (触发布撤防切换)
|
|
|
|
|
|
KEY_EVENT_DOWN_LONG, // ▼ 键长按事件 (菜单返回)
|
|
|
|
|
|
KEY_EVENT_SOS_LONG, // SOS 键长按事件
|
|
|
|
|
|
KEY_EVENT_UP_DOWN_COMB, // ▲ 与 ▼ 双键组合按下事件
|
|
|
|
|
|
KEY_EVENT_CONFIRM_CLICK, // ■ 确认键短按事件 (保存设置或进入子菜单)
|
2026-07-28 18:03:20 +08:00
|
|
|
|
KEY_EVENT_CONFIRM_LONG, // ■ 确认键长按事件 (打开主菜单)
|
2026-07-31 18:49:03 +08:00
|
|
|
|
KEY_EVENT_POWER_OFF, // 长按 KEY_DOWN 开关机触发事件
|
|
|
|
|
|
KEY_EVENT_SECOND_TICK // 整秒滴答事件,每秒派发一次,各 App 自行决定是否用它累计闲置时长
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} KeyEvent;
|
|
|
|
|
|
|
2026-07-17 19:43:02 +08:00
|
|
|
|
/* ====== 事件优先级枚举 ====== */
|
|
|
|
|
|
typedef enum {
|
|
|
|
|
|
EVENT_PRIORITY_LOW, // 0: 低优先级:系统内部事件,如定时更新
|
|
|
|
|
|
EVENT_PRIORITY_NORMAL, // 1: 正常优先级:大部分用户交互事件
|
|
|
|
|
|
EVENT_PRIORITY_HIGH, // 2: 高优先级:报警相关事件,插队到队首
|
|
|
|
|
|
EVENT_PRIORITY_URGENT // 3: 紧急优先级:SOS等,插队到队首
|
|
|
|
|
|
} EventPriority;
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 系统事件结构体定义 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef struct {
|
2026-07-16 17:52:52 +08:00
|
|
|
|
KeyEvent key_event; // 关联的按键事件类型
|
2026-07-17 19:43:02 +08:00
|
|
|
|
EventPriority priority; // 事件优先级
|
2026-07-16 17:52:52 +08:00
|
|
|
|
u32 extra_data; // 随事件携带的额外数据 (如 24 位射频源地址等)
|
|
|
|
|
|
u8 extra_size; // 额外数据的有效字节大小 (0~4)
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} SystemEvent;
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 事件分发处理结果枚举 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef enum {
|
2026-07-16 17:52:52 +08:00
|
|
|
|
EVENT_HANDLED, // 事件已成功处理,不再继续向后传递
|
|
|
|
|
|
EVENT_IGNORED // 事件未被处理,允许继续传递给后台应用或丢弃
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} EventResult;
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 应用程序 ID 枚举 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef enum {
|
2026-07-31 18:05:23 +08:00
|
|
|
|
APP_ID_HOME, // 待机时钟主页应用程序 (开机默认首屏)
|
|
|
|
|
|
APP_ID_MENU, // 系统设置主菜单应用程序 (顶层 4 项列表)
|
|
|
|
|
|
APP_ID_SET_CLOCK, // 时间设置应用程序 (menu_app 子应用)
|
|
|
|
|
|
APP_ID_PAIR, // 无线传感器对码学习应用程序 (menu_app 子应用)
|
|
|
|
|
|
APP_ID_IPC_BIND, // 摄像头一键绑定应用程序 (menu_app 子应用)
|
|
|
|
|
|
APP_ID_ALARM, // 报警接收与波形反馈应用程序
|
|
|
|
|
|
APP_ID_SOS, // 紧急呼救与无线发射应用程序
|
|
|
|
|
|
APP_ID_MAX // 应用程序最大数量上限,用于数组大小
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} AppID;
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 应用程序类型枚举 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef enum {
|
2026-07-16 17:52:52 +08:00
|
|
|
|
APP_TYPE_FOREGROUND, // 前台应用:独占 OLED 屏幕显示并优先接收按键/射频事件
|
|
|
|
|
|
APP_TYPE_BACKGROUND // 后台应用:无屏幕显示,静默监听前台未处理的系统事件
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} AppType;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 无线传感器 Flash 存储槽位结构体 ====== */
|
2026-07-15 15:57:37 +08:00
|
|
|
|
typedef struct {
|
2026-07-16 17:52:52 +08:00
|
|
|
|
unsigned char is_used; // 槽位是否已使用标志 (0x01:已启用, 其他:空闲)
|
|
|
|
|
|
unsigned char addr[3]; // 绑定的 24 位无线传感器 EV1527 硬件地址
|
|
|
|
|
|
unsigned char type; // 传感器设备类型 (0:门磁, 1:红外PIR, 2:烟感, 3:燃气, 4:水浸)
|
|
|
|
|
|
unsigned char zone; // 防区编号 (例如 1~99,0 代表 24小时紧急防区)
|
|
|
|
|
|
unsigned char name_gbk[16];// 传感器的自定义名称 (GBK 编码,用于屏幕显示)
|
2026-07-15 15:57:37 +08:00
|
|
|
|
} Sensor_Slot;
|
|
|
|
|
|
|
2026-07-16 17:52:52 +08:00
|
|
|
|
/* ====== 全局变量 extern 外部声明 ====== */
|
|
|
|
|
|
extern SystemState current_state; // 系统当前整体运行状态
|
|
|
|
|
|
extern u8 current_hour; // 当前系统时间:小时
|
|
|
|
|
|
extern u8 current_min; // 当前系统时间:分钟
|
|
|
|
|
|
extern u8 current_sec; // 当前系统时间:秒
|
2026-07-31 19:43:43 +08:00
|
|
|
|
extern u8 current_day; // 当前系统日期:日
|
|
|
|
|
|
extern u8 current_month; // 当前系统日期:月
|
|
|
|
|
|
extern u8 current_year; // 当前系统日期:年 (0~99,代表 2000~2099)
|
|
|
|
|
|
extern u8 current_weekday; // 当前系统日期:星期 (0=周日, ..., 6=周六)
|
2026-07-16 17:52:52 +08:00
|
|
|
|
extern volatile u8 clock_updated; // 时钟分钟更新标志 (1表示需要刷新待机页时间)
|
2026-07-31 18:49:03 +08:00
|
|
|
|
extern volatile bit second_tick_flag; // 整秒滴答标志位,每秒置 1,由主循环转换为 KEY_EVENT_SECOND_TICK 事件
|
2026-07-16 17:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
extern u8 menu_select; // 当前菜单高亮的选中项索引
|
|
|
|
|
|
extern u32 captured_addr; // 对码或报警时,当前捕获到的传感器 24 位射频地址
|
|
|
|
|
|
extern u8 captured_type; // 正在配对的传感器类型
|
|
|
|
|
|
extern u8 alarm_sensor_slot; // 当前触发警报的传感器在数据库列表中的槽位索引
|
|
|
|
|
|
|
|
|
|
|
|
extern Sensor_Slot xdata sensor_list[16];// 传感器数据库数组 (存储在 xdata 区,共 16 个槽位)
|
|
|
|
|
|
|
|
|
|
|
|
// 系统滴答与定时计数器 (均为 1ms 中断服务中更新)
|
|
|
|
|
|
extern volatile u16 ms_tick; // 毫秒滴答计数器 (0~999循环)
|
|
|
|
|
|
extern volatile u32 pair_timeout_ms; // 对码等待搜寻超时毫秒计数器
|
|
|
|
|
|
extern volatile u16 alarm_timer_ms; // 报警振动与闪烁定时计数器
|
|
|
|
|
|
extern volatile u16 motor_timer_ms; // 马达单次震动定时计时器
|
|
|
|
|
|
extern volatile bit alarm_flash_flag; // 报警屏幕红框闪烁的周期标志位 (0或1)
|
|
|
|
|
|
|
|
|
|
|
|
// 按键长按与消抖状态机计数器
|
|
|
|
|
|
extern volatile u16 key_scan_timer; // 按键扫描 10ms 分频计数器
|
|
|
|
|
|
extern volatile u16 key_up_hold; // ▲ 键持续按下计时器
|
|
|
|
|
|
extern volatile u16 key_down_hold; // ▼ 键持续按下计时器
|
|
|
|
|
|
extern volatile u16 key_confirm_hold; // ■ 确认键持续按下计时器
|
|
|
|
|
|
extern volatile u16 key_sos_hold; // SOS 键持续按下计时器
|
|
|
|
|
|
extern volatile u16 comb_hold; // 组合键持续按下计时器
|
|
|
|
|
|
|
|
|
|
|
|
// 常量定义
|
|
|
|
|
|
#define MAIN_Fosc 24000000UL // STC32G 主频工作频率定义 (24.0 MHz)
|
|
|
|
|
|
#define CLONED_ADDR 0x37A86UL // 手环自身克隆发射的默认 24 位射频出厂 ID 地址
|
|
|
|
|
|
|
|
|
|
|
|
#endif // __CONFIG_H__
|