1.添加了必要的注释和readme文件以提高代码可读性和项目文档化。2.增加了按键按下时LCD屏幕显示功能
This commit is contained in:
@@ -28,48 +28,61 @@
|
||||
#define KEY_CMD (0) /**< 按键事件命令类型 */
|
||||
|
||||
/* ============================================================================
|
||||
* 图片宏定义
|
||||
* 图片与 Flash 宏定义
|
||||
* ============================================================================ */
|
||||
#define BMP_ADDR (0x0803F000) /**< BMP数据在Flash中的存储地址(扇区126) */
|
||||
#define BMP_LEN (3208) /**< BMP数据长度,单位:字节 */
|
||||
#define BMP_ADDR (0x0803F000) /**< BMP 在 Flash 中的存储地址(扇区 126) */
|
||||
#define BMP_LEN (3208) /**< BMP 数据长度(字节) */
|
||||
|
||||
/* ============================================================================
|
||||
* 轮询与超时常量
|
||||
* ============================================================================ */
|
||||
#define RS485_RT_COUNT_MAX (55) /**< 实时轮询计数上限,约 275ms(55×5ms) */
|
||||
#define RS485_ACK_COUNT_MAX (40) /**< 应答超时计数上限,约 200ms(40×5ms) */
|
||||
#define RS485_ACK_OVERTIME_MAX (5) /**< 连续应答超时次数上限,超过则重初始化 RS485 */
|
||||
|
||||
/* ============================================================================
|
||||
* 数据结构定义
|
||||
* ============================================================================ */
|
||||
|
||||
/**
|
||||
* @brief LOGO 图片数据结构体
|
||||
* @note 用于存储从 138 端下发的 BMP 数据及尺寸,或从 Flash 读取的 LOGO
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t bmpdata[3200];
|
||||
uint32_t biWidth;
|
||||
uint32_t biHeight;
|
||||
uint8_t bmpdata[3200]; /**< BMP 点阵数据,最大 3200 字节 */
|
||||
uint32_t biWidth; /**< 图片宽度(像素) */
|
||||
uint32_t biHeight; /**< 图片高度(像素) */
|
||||
} logo_type;
|
||||
|
||||
/**
|
||||
* @brief RS485 轮询与应答状态结构体
|
||||
* @note 用于 Modbus 主站轮询、应答超时检测及命令应答标志管理
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
volatile uint8_t RT_count; /* 实时命令计数器 */
|
||||
volatile uint16_t CMD_ACK; /* 普通命令接收完成标志位 */
|
||||
volatile uint8_t ACK_COUNT_ABLE; //命令发出后计时使能
|
||||
volatile uint8_t ACK_count; /* 应答计时计数器 */
|
||||
volatile uint8_t ACK_OverTime; /* 超时标志位 */
|
||||
volatile uint8_t ACK_OverTimeCnt; /* 超时次数技术器 */
|
||||
{
|
||||
volatile uint8_t RT_count; /**< 实时命令计数,用于定时发送刷新命令 */
|
||||
volatile uint16_t CMD_ACK; /**< 命令接收完成标志(SET=可发下一帧) */
|
||||
volatile uint8_t ACK_COUNT_ABLE; /**< 应答计时使能(发令后置位) */
|
||||
volatile uint8_t ACK_count; /**< 应答等待计数,超 RS485_ACK_COUNT_MAX 即超时 */
|
||||
volatile uint8_t ACK_OverTime; /**< 本次应答超时标志 */
|
||||
volatile uint8_t ACK_OverTimeCnt; /**< 连续应答超时次数,超 RS485_ACK_OVERTIME_MAX 则重初始 */
|
||||
} RS485_POLL_TYPE;
|
||||
|
||||
RS485_POLL_TYPE RS485POLL = {0};
|
||||
|
||||
#define RS485_RT_COUNT_MAX (55) //轮询限值 275ms
|
||||
#define RS485_ACK_COUNT_MAX (40) //应答超时限值 200ms
|
||||
#define RS485_ACK_OVERTIME_MAX (5) // 75ms 应答超时计数最大次数,超过该次数显示通讯异常
|
||||
|
||||
|
||||
RS485_POLL_TYPE RS485POLL = {0}; /**< 全局轮询状态 */
|
||||
|
||||
/* ============================================================================
|
||||
* 私有变量定义
|
||||
* ============================================================================ */
|
||||
static logo_type logo; /**< LOGO图片数据结构体,包含BMP图片数据和尺寸信息 */
|
||||
static uint8_t Picture[3200];
|
||||
static logo_type logo = {0}; /**< LOGO 图片数据(BMP + 宽高) */
|
||||
static uint8_t Picture[3200] = {0}; /**< 接收图片缓冲,前 3200 字节为点阵数据 */
|
||||
|
||||
/* ============================================================================
|
||||
* MODBUS协议处理部分
|
||||
* Modbus 命令与屏幕刷新
|
||||
* ============================================================================ */
|
||||
/**
|
||||
* @brief 发送屏幕刷新命令(特殊格式的Modbus命令)
|
||||
* @param func 功能码(通常为READ_RIGISTER = 0x03)
|
||||
* @brief 发送屏幕刷新命令(特殊格式的 Modbus 命令)
|
||||
* @param func 功能码(通常为读寄存器 READ_REGISTER = 0x03)
|
||||
* @param type 命令类型:RT_CMD(1)=实时刷新,KEY_CMD(0)=按键事件
|
||||
* @param key 按键值(当type=KEY_CMD时有效)
|
||||
* @note 命令帧格式(6字节):
|
||||
@@ -100,19 +113,12 @@ void RS485_RefreshScreenCMD(uint8_t func, uint8_t type, uint8_t key)
|
||||
}
|
||||
|
||||
|
||||
///* ============================================================================
|
||||
// * 屏幕刷新处理 远程处理图片
|
||||
// * ============================================================================ */
|
||||
/**
|
||||
* @brief 发送屏幕刷新命令
|
||||
* @brief 发送屏幕刷新命令并重置轮询状态
|
||||
* @param type 命令类型:RT_CMD(1)=实时刷新,KEY_CMD(0)=按键事件
|
||||
* @param key 按键值(当type=KEY_CMD时有效)
|
||||
* @note 发送屏幕刷新命令到138端,请求更新屏幕显示
|
||||
* 命令发送后:
|
||||
* - 重置命令应答标志
|
||||
* - 重置实时数据计数
|
||||
* - 使能应答计数
|
||||
* - 重置应答计数值
|
||||
* @param key 按键值(type=KEY_CMD 时有效)
|
||||
* @note 向 138 端发送屏幕刷新命令;发送后重置 CMD_ACK、RT_count,
|
||||
* 使能 ACK_COUNT_ABLE 并清零 ACK_count。
|
||||
* @retval 无
|
||||
*/
|
||||
void RefreshScreen(uint8_t type, uint8_t key)
|
||||
@@ -125,8 +131,13 @@ void RefreshScreen(uint8_t type, uint8_t key)
|
||||
RS485POLL.ACK_COUNT_ABLE = SET; /* 使能应答计数 */
|
||||
RS485POLL.ACK_count = 0; /* 重置应答计数值 */
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
* LOGO 与 BMP 处理
|
||||
* ============================================================================ */
|
||||
|
||||
/**
|
||||
* @brief 在LCD屏幕上显示LOGO图片
|
||||
* @brief 在 LCD 屏幕上显示 LOGO 图片
|
||||
* @note 调用Display_BMP函数将全局变量logo中的BMP图片数据显示在LCD屏幕上
|
||||
* 显示位置:屏幕居中(由Display_BMP函数自动计算)
|
||||
* 图片尺寸:使用logo结构体中的biWidth和biHeight
|
||||
@@ -185,6 +196,12 @@ void BMP_Get(void)
|
||||
logo.biHeight = ptr->biHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从 Flash 读取 LOGO 并显示,延时约 2 秒
|
||||
* @note 调用 BMP_Get 从 Flash 读取 LOGO,再 LOGO_Printf 显示;
|
||||
* 每次显示后 delay 4×500ms = 2s
|
||||
* @retval 无
|
||||
*/
|
||||
void NL_LOGO_Printf(void)
|
||||
{
|
||||
BMP_Get();
|
||||
@@ -193,9 +210,14 @@ void NL_LOGO_Printf(void)
|
||||
delay_ms(500);
|
||||
delay_ms(500);
|
||||
delay_ms(500);
|
||||
}
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
* Modbus 主处理与轮询
|
||||
* ============================================================================ */
|
||||
|
||||
/**
|
||||
* @brief Modbus通信主处理函数-远程处理图片
|
||||
* @brief Modbus 通信主处理函数(远程处理图片)
|
||||
* @param key 按键值(KEY_TYPE类型)
|
||||
* @note 采用138端处理图片,整体传上来显示的方式刷图
|
||||
* 处理流程:
|
||||
@@ -338,17 +360,30 @@ uint8_t RS485_Process(KEY_TYPE key, uint8_t flag)
|
||||
return ConnectFlg;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 轮询计数处理(需在 5ms 周期定时器中调用)
|
||||
* @note RT_count 递增,用于定时发实时刷新命令;若 ACK_COUNT_ABLE 置位,
|
||||
* 则 ACK_count 递增,用于应答超时判断。
|
||||
* @retval 无
|
||||
*/
|
||||
void Process_Count(void)
|
||||
{
|
||||
RS485POLL.RT_count++;
|
||||
if(RS485POLL.ACK_COUNT_ABLE)
|
||||
{
|
||||
RS485POLL.ACK_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Modbus 轮询与应答相关变量初始化
|
||||
* @note 清零 ACK_OverTime、ACK_count、ACK_OverTimeCnt,关闭 ACK_COUNT_ABLE,
|
||||
* 置位 CMD_ACK 表示可发送。上电或通信异常恢复后调用。
|
||||
* @retval 无
|
||||
*/
|
||||
void Process_Init(void)
|
||||
{
|
||||
/* 清除控制字和应答相关标志 */
|
||||
/* 清除超时与应答相关标志 */
|
||||
RS485POLL.ACK_OverTime = RESET; /* 重置应答超时标志 */
|
||||
RS485POLL.ACK_COUNT_ABLE = RESET; /* 禁用应答计数 */
|
||||
RS485POLL.ACK_count = 0; /* 重置应答计数 */
|
||||
|
||||
Reference in New Issue
Block a user