signal_generator/User/driver/uart_lcd.c

514 lines
24 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: wangxujie wangxujie@wuxismart.com
* @Date: 2025-03-10 15:05:20
* @LastEditors: wangxujie wangxujie@wuxismart.com
* @LastEditTime: 2025-08-01 16:19:35
* @FilePath: \signal_generator\User\driver\uart_lcd.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include "uart_lcd.h"
#include "usart.h"
#include "lwip.h"
#include "tim.h"
#include "ad7124.h"
extern ip4_addr_t ipaddr;
uart_lcd_t uart_lcd_state = {0};
lcd_makecurve_t lcd_makecurve_data = {0}; // 绘制曲线数据界面ID 1控件ID 14
lcd_set_button_t lcd_set_button1_data = {0}; // 输出通道文本按钮界面ID 0控件ID 1
lcd_set_button_t lcd_set_button2_data = {0}; // 第一路AO输出箭头按钮界面ID 0控件ID 2
lcd_set_button_t lcd_set_button3_data = {0}; // 第二路AO输出箭头按钮界面ID 0控件ID 3
lcd_set_button_t lcd_set_button4_data = {0}; // SW1状态按钮界面ID 1控件ID 1
lcd_set_button_t lcd_set_button5_data = {0}; // SW2状态按钮界面ID 1控件ID 2
lcd_set_txt_t lcd_set_txt1_data = {0}; // 文本设置数据界面ID 1控件ID 5
lcd_set_txt_t lcd_set_txt2_data = {0}; // 文本设置数据界面ID 1控件ID 6
lcd_set_txt_t lcd_set_txt3_data = {0}; // 文本设置数据界面ID 1控件ID 7
lcd_set_slidervalue_t lcd_set_slidervalue1_data = {0}; // 进度条设置数据界面ID 0控件ID 4
lcd_set_slidervalue_t lcd_set_slidervalue2_data = {0}; // 进度条设置数据界面ID 0控件ID 5
lcd_switchscreen_t lcd_switchscreen_data = {0}; // 切换画面数据
extern float current_buff[2];
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
static void uart_lcd_page_init(lcd_switchscreen_t *screen_data)
{
screen_data->cmd_head = LCD_CMD_HEAD;
screen_data->cmd_type = LCD_CMD_TYPE;
screen_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SWITCH_SCREEN;
screen_data->cmd_screen_id = LCD_SCREEN_ID_CRUUENT; // 默认切换到主界面
screen_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_button_init(lcd_set_button_t *button_data, uint16_t screen_id, uint16_t ctrl_id)
{
button_data->cmd_head = LCD_CMD_HEAD;
button_data->cmd_type = LCD_CMD_TYPE;
button_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SET_BUTTON;
button_data->cmd_screen_id = screen_id;
button_data->cmd_ctrl_id = ctrl_id;
button_data->cmd_button_status = 0; // 默认按钮状态为未按下
button_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_slidervalue_init(lcd_set_slidervalue_t *slidervalue_data, uint16_t screen_id, uint16_t ctrl_id)
{
slidervalue_data->cmd_head = LCD_CMD_HEAD;
slidervalue_data->cmd_type = LCD_CMD_TYPE;
slidervalue_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SET_SLIDERVALUE;
slidervalue_data->cmd_screen_id = screen_id;
slidervalue_data->cmd_ctrl_id = ctrl_id;
slidervalue_data->cmd_slidervalue = 0; // 默认滑块数值为0
slidervalue_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_markcurve_init(lcd_makecurve_t *curve_data, uint16_t screen_id, uint16_t ctrl_id)
{
curve_data->cmd_head = LCD_CMD_HEAD;
curve_data->cmd_type = LCD_CMD_TYPE;
curve_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_MAKE_CURVE;
curve_data->cmd_screen_id = screen_id;
curve_data->cmd_ctrl_id = ctrl_id;
curve_data->cmd_curve_channel = 0; // 曲线通道
curve_data->cmd_data_len = 1; // 数据长度
memset(curve_data->cmd_data, 0, sizeof(curve_data->cmd_data)); // 清空数据内容
curve_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_txt_init(lcd_set_txt_t *txt_data, uint16_t screen_id, uint16_t ctrl_id)
{
txt_data->cmd_head = LCD_CMD_HEAD;
txt_data->cmd_type = LCD_CMD_TYPE;
txt_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SET_TXT;
txt_data->cmd_screen_id = screen_id;
txt_data->cmd_ctrl_id = ctrl_id;
txt_data->cmd_txt_data = 0.0f; // 默认文本内容为0.0
txt_data->cmd_tail = LCD_CMD_TAIL;
}
/**
* @brief 设置LCD按钮状态
*
* 该函数用于设置LCD上的按钮状态。
*
* @param button_data 按钮数据指针,指向包含按钮设置信息的结构体
*/
static void uart_lcd_set_button_status(lcd_set_button_t *button_data, uint8_t status)
{
if (button_data == NULL)
{
return;
}
while (uart_lcd_state.lcd_flag != 0)
{
}
button_data->cmd_button_status = status; // 设置按钮状态
static uint8_t uart_lcd_button_data[sizeof(lcd_set_button_t)] = {0};
uart_lcd_button_data[0] = button_data->cmd_head; // 帧头
uart_lcd_button_data[1] = button_data->cmd_type; // 命令类型
uart_lcd_button_data[2] = button_data->cmd_ctrl_type; // 控制类型
uart_lcd_button_data[3] = (button_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位
uart_lcd_button_data[4] = button_data->cmd_screen_id & 0xFF; // 画面ID低位
uart_lcd_button_data[5] = (button_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位
uart_lcd_button_data[6] = button_data->cmd_ctrl_id & 0xFF; // 控件ID低位
uart_lcd_button_data[7] = button_data->cmd_button_status; // 按钮状态
uart_lcd_button_data[8] = (button_data->cmd_tail >> 24) & 0xFF; // 帧尾
uart_lcd_button_data[9] = (button_data->cmd_tail >> 16) & 0xFF; // 帧尾
uart_lcd_button_data[10] = (button_data->cmd_tail >> 8) & 0xFF; // 帧尾
uart_lcd_button_data[11] = button_data->cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_lcd_button_data, sizeof(lcd_set_button_t));
}
/**
* @brief 设置LCD屏幕上的滑块数值
*
* 该函数通过UART接口向LCD屏幕发送命令以设置特定滑块控件的数值。
*
* @param slidervalue_data 指向包含滑块设置数据的指针
* @param value 要设置的滑块数值
*/
static void uart_lcd_set_slidervalue(lcd_set_slidervalue_t *slidervalue_data, uint32_t value)
{
if (slidervalue_data == NULL)
{
return;
}
while (uart_lcd_state.lcd_flag != 0)
{
}
slidervalue_data->cmd_slidervalue = value; // 设置滑块数值
static uint8_t uart_lcd_slidervalue_data[sizeof(lcd_set_slidervalue_t)] = {0};
uart_lcd_slidervalue_data[0] = slidervalue_data->cmd_head; // 帧头
uart_lcd_slidervalue_data[1] = slidervalue_data->cmd_type; // 命令类型
uart_lcd_slidervalue_data[2] = slidervalue_data->cmd_ctrl_type; // 控制类型
uart_lcd_slidervalue_data[3] = (slidervalue_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位
uart_lcd_slidervalue_data[4] = slidervalue_data->cmd_screen_id & 0xFF; // 画面ID低位
uart_lcd_slidervalue_data[5] = (slidervalue_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位
uart_lcd_slidervalue_data[6] = slidervalue_data->cmd_ctrl_id & 0xFF; // 控件ID低位
uart_lcd_slidervalue_data[7] = (slidervalue_data->cmd_slidervalue >> 24) & 0xFF; // 滑块数值高位
uart_lcd_slidervalue_data[8] = (slidervalue_data->cmd_slidervalue >> 16) & 0xFF; // 滑块数值高位
uart_lcd_slidervalue_data[9] = (slidervalue_data->cmd_slidervalue >> 8) & 0xFF; // 滑块数值低位
uart_lcd_slidervalue_data[10] = slidervalue_data->cmd_slidervalue & 0xFF; // 滑块数值低位
uart_lcd_slidervalue_data[11] = (slidervalue_data->cmd_tail >> 24) & 0xFF; // 帧尾
uart_lcd_slidervalue_data[12] = (slidervalue_data->cmd_tail >> 16) & 0xFF; // 帧尾
uart_lcd_slidervalue_data[13] = (slidervalue_data->cmd_tail >> 8) & 0xFF; // 帧尾
uart_lcd_slidervalue_data[14] = slidervalue_data->cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_lcd_slidervalue_data, sizeof(lcd_set_slidervalue_t));
}
/**
* @brief 设置LCD屏幕上的文本内容
*
* 该函数用于通过UART接口向LCD屏幕发送文本内容。
*
* @param txt_data 指向lcd_set_txt_t结构体的指针用于存储文本数据
* @param value 浮点数类型的文本内容
*/
static void uart_lcd_set_txt(lcd_set_txt_t *txt_data, float value)
{
if (txt_data == NULL)
{
return;
}
while (uart_lcd_state.lcd_flag != 0)
{
}
txt_data->cmd_txt_data = value; // 设置文本内容
static uint8_t uart_lcd_txt_data[sizeof(lcd_set_txt_t)] = {0};
uart_lcd_txt_data[0] = txt_data->cmd_head; // 帧头
uart_lcd_txt_data[1] = txt_data->cmd_type; // 命令类型
uart_lcd_txt_data[2] = txt_data->cmd_ctrl_type; // 控件类型
uart_lcd_txt_data[3] = (txt_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位
uart_lcd_txt_data[4] = txt_data->cmd_screen_id & 0xFF; // 画面ID低位
uart_lcd_txt_data[5] = (txt_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位
uart_lcd_txt_data[6] = txt_data->cmd_ctrl_id & 0xFF; // 控件ID低位
// 将浮点数转换为字符串形式
char txt_value_str[16] = {0};
snprintf(txt_value_str, sizeof(txt_value_str), "%.2f", txt_data->cmd_txt_data);
// 将字符串内容复制到数据包中
size_t txt_len = strlen(txt_value_str);
for (size_t i = 0; i < txt_len; ++i)
{
uart_lcd_txt_data[7 + i] = txt_value_str[i]; // 文本内容
}
uart_lcd_txt_data[7 + txt_len] = 0xFF; // 帧尾
uart_lcd_txt_data[8 + txt_len] = 0xFC; // 帧尾
uart_lcd_txt_data[9 + txt_len] = 0xFF; // 帧尾
uart_lcd_txt_data[10 + txt_len] = 0xFF; // 帧尾
dma_usart_send(&huart4, uart_lcd_txt_data, 11 + txt_len);
}
static void uart_lcd_current_channel1(void)
{
// 输出文本按钮状态0第一路AO状态1第二路AO状态0
// lcd_set_button1_data.cmd_button_status = 0; // 第一路AO输出文本按钮状态为未按下
uart_lcd_set_button_status(&lcd_set_button1_data, 0);
// lcd_set_button2_data.cmd_button_status = 1; // 第一路AO输出箭头按钮状态为按下
uart_lcd_set_button_status(&lcd_set_button2_data, 1);
// lcd_set_button3_data.cmd_button_status = 0; // 第二路AO输出箭头按钮状态为未按下
uart_lcd_set_button_status(&lcd_set_button3_data, 0);
}
static void uart_lcd_current_channel2(void)
{
// 输出文本按钮状态1第一路AO状态0第二路AO状态1
// lcd_set_button1_data.cmd_button_status = 1;
uart_lcd_set_button_status(&lcd_set_button1_data, 1);
// lcd_set_button2_data.cmd_button_status = 0;
uart_lcd_set_button_status(&lcd_set_button2_data, 0);
// lcd_set_button3_data.cmd_button_status = 1;
uart_lcd_set_button_status(&lcd_set_button3_data, 1);
}
/**
* @brief 通过UART向LCD屏幕绘制IP地址
*
* 此函数通过UART接口向LCD屏幕发送IP地址以便在屏幕上显示。
*
* @note 此函数假定已经正确初始化了UART接口并且LCD屏幕已经正确连接到UART接口。
*/
void uart_lcd_draw_ipaddr(void)
{
uint8_t ip_addr[24] = {0};
// 串口发送的固定值为串口屏指令指定的帧头帧尾
ip_addr[0] = 0xEE; // 帧头
ip_addr[1] = 0xB1;
ip_addr[2] = 0x10; // 命令码,此处为文本控件文本设置指令
ip_addr[3] = 0x00; // 画面ID高位地址
ip_addr[4] = 0x00; // 画面ID低位地址
ip_addr[5] = 0x00; // 控件ID高位地址
ip_addr[6] = 0x03; // 控件ID低位地址
char *ip_addr_str = ipaddr_ntoa(&ipaddr);
MEMCPY(ip_addr + 7, (uint8_t *)ip_addr_str, strlen(ip_addr_str));
ip_addr[7 + strlen(ip_addr_str)] = 0xFF; // 帧尾,下列都为帧尾
ip_addr[8 + strlen(ip_addr_str)] = 0xFC;
ip_addr[9 + strlen(ip_addr_str)] = 0xFF;
ip_addr[10 + strlen(ip_addr_str)] = 0xFF;
dma_usart_send(&huart4, ip_addr, ARRAY_LEN(ip_addr));
}
void uart_lcd_init(void)
{
// 初始化屏幕
uart_lcd_state.page_num = LCD_SCREEN_ID_CRUUENT;
uart_lcd_page_init(&lcd_switchscreen_data); // 初始化页面数据
uart_lcd_page_switch(uart_lcd_state.page_num); // 切换到第一个页面
// 初始化按钮
uart_lcd_button_init(&lcd_set_button1_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_BUTTON1);
uart_lcd_button_init(&lcd_set_button2_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_BUTTON2);
uart_lcd_button_init(&lcd_set_button3_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_BUTTON3);
uart_lcd_button_init(&lcd_set_button4_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_BUTTON4);
uart_lcd_button_init(&lcd_set_button5_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_BUTTON5);
uart_lcd_state.current_out_channel = 0;
uart_lcd_current_out_channel_switch(uart_lcd_state.current_out_channel);
uart_lcd_set_button_status(&lcd_set_button4_data, 0); // 设置按钮状态
uart_lcd_set_button_status(&lcd_set_button5_data, 0); // 设置按钮状态
// 初始化滑块
uart_lcd_slidervalue_init(&lcd_set_slidervalue1_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_SLIDERVALUE1); // 第一路滑块
uart_lcd_slidervalue_init(&lcd_set_slidervalue2_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_SLIDERVALUE2); // 第二路滑块
uart_lcd_state.current_value[0] = 0;
uart_lcd_state.current_value[1] = 0;
uart_lcd_set_slidervalue(&lcd_set_slidervalue1_data, uart_lcd_state.current_value[0]); // 设置滑块值
uart_lcd_set_slidervalue(&lcd_set_slidervalue2_data, uart_lcd_state.current_value[1]); // 设置滑块值
// 初始化曲线
uart_lcd_markcurve_init(&lcd_makecurve_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_MAKE_CURVE); // 曲线数据初始化
// 初始化文本
uart_lcd_txt_init(&lcd_set_txt1_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_TXT1);
uart_lcd_txt_init(&lcd_set_txt2_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_TXT2);
uart_lcd_txt_init(&lcd_set_txt3_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_TXT3);
uart_lcd_set_txt(&lcd_set_txt1_data, 0.0f); // 设置文本内容
uart_lcd_set_txt(&lcd_set_txt2_data, 0.0f); // 设置文本内容
uart_lcd_set_txt(&lcd_set_txt3_data, 0.0f); // 设置文本内容
}
void uart_lcd_current_out(uint8_t channel)
{
switch (channel)
{
case 0:
uart_lcd_set_slidervalue(&lcd_set_slidervalue1_data, uart_lcd_state.current_value[0]); // 设置滑块值
break;
case 1:
uart_lcd_set_slidervalue(&lcd_set_slidervalue2_data, uart_lcd_state.current_value[1]); // 设置滑块值
break;
default:
uart_lcd_set_slidervalue(&lcd_set_slidervalue1_data, uart_lcd_state.current_value[0]); // 设置滑块值
break;
}
}
void uart_lcd_current_out_channel_switch(uint8_t channel)
{
switch (channel)
{
case 0:
uart_lcd_current_channel1();
break;
case 1:
uart_lcd_current_channel2();
break;
default:
uart_lcd_current_channel1();
break;
}
}
void uart_lcd_page_switch(uint8_t page)
{
while (uart_lcd_state.lcd_flag != 0)
{
}
static uint8_t uart_switchscreen_data[sizeof(lcd_switchscreen_t)] = {0};
lcd_switchscreen_data.cmd_screen_id = (uint16_t)page; // 更新当前页面状态
uart_switchscreen_data[0] = lcd_switchscreen_data.cmd_head; // 帧头
uart_switchscreen_data[1] = lcd_switchscreen_data.cmd_type; // 命令类型
uart_switchscreen_data[2] = lcd_switchscreen_data.cmd_ctrl_type; // 控制类型
uart_switchscreen_data[3] = (lcd_switchscreen_data.cmd_screen_id >> 8) & 0xFF; // 画面ID高位地址
uart_switchscreen_data[4] = lcd_switchscreen_data.cmd_screen_id & 0xFF; // 画面ID低位地址
uart_switchscreen_data[5] = (lcd_switchscreen_data.cmd_tail >> 24) & 0xFF; // 帧尾
uart_switchscreen_data[6] = (lcd_switchscreen_data.cmd_tail >> 16) & 0xFF; // 帧尾
uart_switchscreen_data[7] = (lcd_switchscreen_data.cmd_tail >> 8) & 0xFF; // 帧尾
uart_switchscreen_data[8] = lcd_switchscreen_data.cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_switchscreen_data, sizeof(lcd_switchscreen_t)); // 发送切换画面数据
}
void uart_lcd_ecll_control_current_out(void)
{
if (ec11_data.confirm_key_flag == 0)
{
}
else if (ec11_data.confirm_key_flag == 1) // Confirm button - confirms current output
{
ec11_data.confirm_key_flag_last++;
if (ec11_data.confirm_key_flag_last > 2)
{
current_buff[0] = (float)uart_lcd_state.current_value[0];
current_buff[1] = (float)uart_lcd_state.current_value[1];
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
}
}
else if (ec11_data.confirm_key_flag == 2) // Switch the current output channel
{
ec11_data.confirm_key_flag_last++;
if (ec11_data.confirm_key_flag_last > 2)
{
if (uart_lcd_state.current_out_channel == 1)
{
uart_lcd_state.current_out_channel = 0;
}
else if (uart_lcd_state.current_out_channel == 0)
{
uart_lcd_state.current_out_channel = 1;
}
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
uart_lcd_current_out_channel_switch(uart_lcd_state.current_out_channel);
}
}
else if (ec11_data.confirm_key_flag == 3) // 切换界面
{
if (uart_lcd_state.page_num == 0)
{
uart_lcd_state.page_num = 1;
}
else if (uart_lcd_state.page_num == 1)
{
uart_lcd_state.page_num = 0;
}
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
uart_lcd_page_switch(uart_lcd_state.page_num);
}
}
void uart_lcd_ec11_control_current(void)
{
if (uart_lcd_state.page_num == 0) // 当前页面为电流调节页面时才对EC11编码器进行计数处理
{
ec11_data.direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1);
ec11_data.encode_num = (short)__HAL_TIM_GET_COUNTER(&htim1);
if ((ec11_data.direction == 0) && (ec11_data.encode_num > ec11_data.encode_num_last))
{
if (uart_lcd_state.current_out_channel == 0)
{
uart_lcd_state.current_value[0] += 1;
if (uart_lcd_state.current_value[0] > 20)
{
uart_lcd_state.current_value[0] = 20;
}
}
else if (uart_lcd_state.current_out_channel == 1)
{
uart_lcd_state.current_value[1] += 1;
if (uart_lcd_state.current_value[1] > 20)
{
uart_lcd_state.current_value[1] = 20;
}
}
uart_lcd_current_out(uart_lcd_state.current_out_channel);
}
if ((ec11_data.direction == 1) && (ec11_data.encode_num < ec11_data.encode_num_last))
{
if (uart_lcd_state.current_out_channel == 0)
{
if (uart_lcd_state.current_value[0] < 2)
{
uart_lcd_state.current_value[0] = 0;
}
else
{
uart_lcd_state.current_value[0] -= 1;
}
}
else if (uart_lcd_state.current_out_channel == 1)
{
if (uart_lcd_state.current_value[1] < 2)
{
uart_lcd_state.current_value[1] = 0;
}
else
{
uart_lcd_state.current_value[1] -= 1;
}
}
uart_lcd_current_out(uart_lcd_state.current_out_channel);
}
ec11_data.encode_num_last = ec11_data.encode_num;
}
}
void uart_lcd_makecurvet(lcd_makecurve_t *makecurve_data)
{
static uint8_t uart_makecurve_data[256] = {0}; // 发送数据缓冲区最大长度为256字节
uart_makecurve_data[0] = makecurve_data->cmd_head; // 帧头
uart_makecurve_data[1] = makecurve_data->cmd_type; // 命令类型
uart_makecurve_data[2] = makecurve_data->cmd_ctrl_type; // 控制类型
uart_makecurve_data[3] = (makecurve_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位地址
uart_makecurve_data[4] = makecurve_data->cmd_screen_id & 0xFF; // 画面ID低位地址
uart_makecurve_data[5] = (makecurve_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位地址
uart_makecurve_data[6] = makecurve_data->cmd_ctrl_id & 0xFF; // 控件ID低位地址
uart_makecurve_data[7] = makecurve_data->cmd_curve_channel; // 曲线通道
uart_makecurve_data[8] = (makecurve_data->cmd_data_len >> 8) & 0xFF; // 数据长度高位地址
uart_makecurve_data[9] = makecurve_data->cmd_data_len & 0xFF; // 数据长度低位地址
MEMCPY(uart_makecurve_data + 10, makecurve_data->cmd_data, makecurve_data->cmd_data_len); // 数据内容
uart_makecurve_data[10 + makecurve_data->cmd_data_len] = (makecurve_data->cmd_tail >> 24) & 0xFF; // 帧尾
uart_makecurve_data[11 + makecurve_data->cmd_data_len] = (makecurve_data->cmd_tail >> 16) & 0xFF; // 帧尾
uart_makecurve_data[12 + makecurve_data->cmd_data_len] = (makecurve_data->cmd_tail >> 8) & 0xFF; // 帧尾
uart_makecurve_data[13 + makecurve_data->cmd_data_len] = makecurve_data->cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_makecurve_data, makecurve_data->cmd_data_len + 14);
}
void uart_lcd_refresh_screen(void)
{
char usb_pv_str[128] = {0};
// 刷新屏幕数据
uart_lcd_set_txt(&lcd_set_txt1_data, ad7124_analog[P1_DI1_ADC].current); // 刷新文本内容
if (ad7124_analog[P1_DI1_ADC].current > 2.1f)
{
uart_lcd_set_button_status(&lcd_set_button4_data, 0); // 设置按钮状态
}
else if (ad7124_analog[P1_DI1_ADC].current < 1.2f)
{
uart_lcd_set_button_status(&lcd_set_button4_data, 1); // 设置按钮状态
}
uart_lcd_set_txt(&lcd_set_txt2_data, ad7124_analog[P1_DI2_ADC].current); // 刷新文本内容
if (ad7124_analog[P1_DI2_ADC].current > 2.1f)
{
uart_lcd_set_button_status(&lcd_set_button5_data, 0); // 设置按钮状态
}
else if (ad7124_analog[P1_DI2_ADC].current < 1.2f)
{
uart_lcd_set_button_status(&lcd_set_button5_data, 1); // 设置按钮状态
}
lcd_makecurve_data.cmd_data[0] = (ad7124_analog[P1_AI_ADC].current - 4) * 100 / 16; // 填充数据内容
uart_lcd_makecurvet(&lcd_makecurve_data); // 调用函数发送数据
uart_lcd_set_txt(&lcd_set_txt3_data, ad7124_analog[P1_AI_ADC].current); // 设置文本内容
snprintf(usb_pv_str, sizeof(usb_pv_str), "Current = %.2fmA\t P.V = %.2f\t", (float)(ad7124_analog[P1_AI_ADC].current), (float)(ad7124_analog[P1_AI_ADC].current - 4) * 100 / 16);
size_t txt_len = strlen(usb_pv_str);
for (size_t i = 0; i < txt_len; ++i)
{
usb_uart1.tx_data[i] = usb_pv_str[i]; // 文本内容
}
dma_usart_send(&huart1, usb_uart1.tx_data, txt_len); // 发送USB数据
}
void uart_lcd_makecurve_test(void)
{
lcd_makecurve_data.cmd_data_len = 1; // 假设数据长度为1
// if (uart_lcd_state.page_num == 1)
{
lcd_makecurve_data.cmd_data[0] = (current_buff[1] - 4) * 100 / 16; // 填充数据内容
uart_lcd_makecurvet(&lcd_makecurve_data); // 调用函数发送数据
uart_lcd_set_txt(&lcd_set_txt3_data, current_buff[1]); // 设置文本内容
}
}