1.添加了必要的注释和readme文件以提高代码可读性和项目文档化。2.增加了按键按下时LCD屏幕显示功能

This commit is contained in:
2026-01-25 15:42:48 +08:00
parent 373b31adfd
commit 6a861cee4e
30 changed files with 2311 additions and 50645 deletions

View File

@@ -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) /**< BMPFlash 中的存储地址(扇区 126 */
#define BMP_LEN (3208) /**< BMP 数据长度字节 */
/* ============================================================================
* 轮询与超时常量
* ============================================================================ */
#define RS485_RT_COUNT_MAX (55) /**< 实时轮询计数上限,约 275ms55×5ms */
#define RS485_ACK_COUNT_MAX (40) /**< 应答超时计数上限,约 200ms40×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; /* 重置应答计数 */

View File

@@ -1,16 +1,56 @@
/******************************************************************************
* @file MODBUS.h
* @brief Modbus RTU 协议通信处理模块头文件
* @details 本文件声明了 Modbus RTU 通信相关的接口函数包括主处理、LOGO 显示、
* 轮询计数与初始化等。配合 MODBUS.c 使用,通过 RS485 与从站通信。
* @author 阜阳师范大学物电学院
* @version V0.01
* @date 2026.1.23
* @note 通信协议Modbus RTU
* 通信接口RS485
* 主站地址0x01
******************************************************************************/
#ifndef MODBUS_H__
#define MODBUS_H__
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "key.h"
/* ============================================================================
* 函数声明
* ============================================================================ */
/**
* @brief Modbus 通信主处理函数(远程图片处理)
* @param key 按键值KEY_TYPE用于上报按键事件
* @param flag 连接标志(传入当前连接状态,用于更新)
* @note 处理接收帧、按键上报、定时刷新、应答超时等;采用 138 端处理图片、
* 整体上传显示的方式刷图。需在周期任务中调用。
* @retval 更新后的连接标志1=已连接0=未连接/超时)
*/
uint8_t RS485_Process(KEY_TYPE key, uint8_t flag);
void NL_LOGO_Printf(void);
void Process_Count(void);
void Process_Init(void);
#endif // end of ADC_H definition
/**
* @brief 从 Flash 读取 LOGO 并显示
* @note 调用 BMP_Get 读 Flash再 LOGO_Printf 显示,合计延时约 2s
* @retval 无
*/
void NL_LOGO_Printf(void);
/**
* @brief 轮询计数处理(需在 5ms 周期定时器中调用)
* @note 递增 RT_count若 ACK_COUNT_ABLE 置位则递增 ACK_count用于超时检测
* @retval 无
*/
void Process_Count(void);
/**
* @brief Modbus 轮询与应答相关变量初始化
* @note 清零超时、应答计数等标志,置位 CMD_ACK 允许发送。上电或重新建立通信前调用
* @retval 无
*/
void Process_Init(void);
#endif /* MODBUS_H__ */