You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

223 lines
6.7 KiB

/**
* @file lcd.c
* @author 1722451300@qq.com
* @brief
* @version 0.1
* @date 2021-12-15
*
* @copyright Copyright (c) 2021
*
*/
#include "lcd.h"
volatile char lcd_rxbuff[50] = {0};
volatile int32_t lcd_count = 0;
//volatile int32_t recv_lcd_data_state=0;//1就判断是不是接收完成,0不判断
//volatile int32_t from_lcd_recv_state = 0;
//volatile int32_t lcd_t8_state = 0;
extern volatile int32_t first_set_motor_speed_dsp;
volatile int32_t lcd_issue_motor_speed=0;
volatile int16_t judge_now_foreward_or_reversal_state=0;//正转0,反转1
volatile int32_t first_set_speed_state=0;
extern volatile int32_t speed_dsp_now;//当前电机的速度单位dsp
extern volatile int32_t motor_jerk_state;//1电机处于急停状态
//-----------------------------------------
//-----------------------------------------
void lcd_uart_config(void)
{
/**
* @brief LCD的芯片与上位机的通信 Pro2303LCD段
*
*/
uart1_config();
}
void send_cmd_to_lcd(volatile char buff[20], unsigned int num)
{
/**
* @brief 向LCD发送11命令
*
*/
while (num--)
{
while (!TRMT1)
;
TX1B = *buff;
buff++;
}
}
//---------------------------------------
//---------------------------------------
uint8_t g_lcd_rxbuf_isready = 0;
uint32_t g_process_recv_lcd_data_time = 0;
void recv_from_lcd_data(unsigned char data)
{
/**
* @brief 接收来自lcd的数据
*
*/
g_lcd_rxbuf_isready=true;//进入中断就让他为真
lcd_rxbuff[lcd_count++] = data;
g_process_recv_lcd_data_time= hal_get_irqticket();//记录最后的时间
}
uint32_t judge_recv_lcd_data_finish(uint32_t time)
{
/**
* @brief 接收LCD的数据完成
*/
static uint32_t recv_lcd_data_time = 0;
recv_lcd_data_time = time;
if (hal_has_passedms(recv_lcd_data_time) > 10) {
g_lcd_rxbuf_isready=false;
recv_lcd_data_time = hal_get_ticket();
send_cmd_to_lcd(lcd_rxbuff,lcd_count);//接收完成将数据发给电脑
lcd_count=0;
return 0;
}
}
/**
* @brief 对来自lcd的指令进行分析
* @param buff 指令,num 指令的字节长度
*
*/
uint8_t lcd_data_analyse(volatile char buff[20], unsigned int num)
{
volatile char str[2]={0};
volatile int32_t speed=0;
if(buff[0]!=0x5A || buff[1]!=0xA5)
{
return -1;
}
if(buff[3]==0x83)//如果是就代表着指令要发送给电机控制电机的状态
{
if(buff[4]==0x50&&buff[5]==0x20)//速度指令(包括+-设置停止四种方法)
{
lcd_issue_motor_speed = buff[7]<<8|buff[8];
lcd_issue_motor_speed = lcd_issue_motor_speed*6;//这个是最终lcd下发的电机速度单位dsp
if(first_set_speed_state==0)//第一次是进行速度的设定不需要向电机下发
{
first_set_motor_speed_dsp = lcd_issue_motor_speed;
first_set_speed_state=1;
lcd_issue_motor_speed=0;
}
else
{
lcd_issue_motor_speed = judge_foreward_or_reversal(lcd_issue_motor_speed,judge_now_foreward_or_reversal_state);//判断正转还是反转
}
}
else if(buff[4]==0x50&&buff[5]==0x00)//正转命令
{
judge_now_foreward_or_reversal_state=0;
lcd_issue_motor_speed = judge_foreward_or_reversal(first_set_motor_speed_dsp,0);//判断正转还是反转lcd_issue_motor_speed单位dsp
}
else if(buff[4]==0x50&&buff[5]==0x10)//反转命令
{
judge_now_foreward_or_reversal_state=1;
lcd_issue_motor_speed = judge_foreward_or_reversal(first_set_motor_speed_dsp,1);//判断正转还是反转
//set_motor_speed(lcd_issue_motor_speed);
}
}
else return -1;
}
void lcd_switch_anomaly_page(void)
{
/**
* @brief 电机处于异常时屏幕切换到异常界面,不可点击确定按键
* 5A A5 07 82 00 84 5A 01 00 01
*/
unsigned char anomaly_page_send_lcd_cmd[10]={0};
anomaly_page_send_lcd_cmd[0]=0x5A;
anomaly_page_send_lcd_cmd[1]=0xA5;
anomaly_page_send_lcd_cmd[2]=0x07;
anomaly_page_send_lcd_cmd[3]=0x82;
anomaly_page_send_lcd_cmd[4]=0x00;
anomaly_page_send_lcd_cmd[5]=0x84;
anomaly_page_send_lcd_cmd[6]=0x5A;
anomaly_page_send_lcd_cmd[7]=0x01;
anomaly_page_send_lcd_cmd[8]=0x00;
anomaly_page_send_lcd_cmd[9]=0x08;
send_cmd_to_lcd(anomaly_page_send_lcd_cmd,10);
}
void lcd_switch_anomaly_page_key(void)
{
/**
* @brief 电机处于异常时屏幕切换到异常界面,可点击确定按键
* 5A A5 07 82 00 84 5A 01 00 01
*/
unsigned char anomaly_page_send_lcd_cmd[10]={0};
anomaly_page_send_lcd_cmd[0]=0x5A;
anomaly_page_send_lcd_cmd[1]=0xA5;
anomaly_page_send_lcd_cmd[2]=0x07;
anomaly_page_send_lcd_cmd[3]=0x82;
anomaly_page_send_lcd_cmd[4]=0x00;
anomaly_page_send_lcd_cmd[5]=0x84;
anomaly_page_send_lcd_cmd[6]=0x5A;
anomaly_page_send_lcd_cmd[7]=0x01;
anomaly_page_send_lcd_cmd[8]=0x00;
anomaly_page_send_lcd_cmd[9]=0x07;
send_cmd_to_lcd(anomaly_page_send_lcd_cmd,10);
}
void lcd_actual_speed_set(int32_t now_speed)
{
/**
* @brief 设置屏幕上实际速度值
* 5A A5 05 82 50 90 00 64
*/
volatile unsigned char lcd_show_now_motor_speed[10]={0};
now_speed = now_speed/6;
lcd_show_now_motor_speed[0]=0x5A;
lcd_show_now_motor_speed[1]=0xA5;
lcd_show_now_motor_speed[2]=0x05;
lcd_show_now_motor_speed[3]=0x82;
lcd_show_now_motor_speed[4]=0x50;
lcd_show_now_motor_speed[5]=0x90;
//速度具体值
lcd_show_now_motor_speed[6]=(now_speed>>8)&0xff;//速度高字节
lcd_show_now_motor_speed[7]=now_speed&0xff;//速度低字节
send_cmd_to_lcd(lcd_show_now_motor_speed,8);
}
void lcd_speed_set_val(int32_t now_speed)
{
/**
* @brief 设置屏幕上速度设定值
* 5A A5 05 82 50 20 00 00
*/
unsigned char lcd_show_now_motor_speed[10]={0};
lcd_show_now_motor_speed[0]=0x5A;
lcd_show_now_motor_speed[1]=0xA5;
lcd_show_now_motor_speed[2]=0x05;
lcd_show_now_motor_speed[3]=0x82;
lcd_show_now_motor_speed[4]=0x50;
lcd_show_now_motor_speed[5]=0x20;
//速度具体值
lcd_show_now_motor_speed[6]=0x00;//速度高字节
lcd_show_now_motor_speed[7]=0x00;//速度低字节
send_cmd_to_lcd(lcd_show_now_motor_speed,8);
}
void clear_zero(void)
{
/**
* @brief 发生异常的时候清零
*
*/
lcd_actual_speed_set(0);
lcd_speed_set_val(0);
judge_now_foreward_or_reversal_state=0;
first_set_motor_speed_dsp=0;
lcd_issue_motor_speed=0;
}