This repository has been archived on 2024-12-31. You can view files and clone it, but cannot push or open issues or pull requests.
mfps/App/Src/oled2.c

1717 lines
44 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

#include "oled2.h"
#include "app.h"
/*******************************************模拟I2C***********************************************************/
static void i2c_Delay(void)
{
uint8_t i;
/* 
下面的时间是通过逻辑分析仪测试得到的。
工作条件CPU主频72MHz MDK编译环境1级优化
循环次数为10时SCL频率 = 205KHz
循环次数为7时SCL频率 = 347KHz SCL高电平时间1.5usSCL低电平时间2.87us
循环次数为5时SCL频率 = 421KHz SCL高电平时间1.25usSCL低电平时间2.375us
*/
for (i = 0; i < 10; i++)
;
}
void i2c_Start(void)
{
/* 当SCL高电平时SDA出现一个下跳沿表示I2C总线启动信号 */
BSP_I2C_SDA_1();
BSP_I2C_SCL_1();
i2c_Delay();
BSP_I2C_SDA_0();
i2c_Delay();
BSP_I2C_SCL_0();
i2c_Delay();
}
void i2c_Stop(void)
{
/* 当SCL高电平时SDA出现一个上跳沿表示I2C总线停止信号 */
BSP_I2C_SDA_0();
BSP_I2C_SCL_1();
i2c_Delay();
BSP_I2C_SDA_1();
}
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
/* 先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
BSP_I2C_SDA_1();
}
else
{
BSP_I2C_SDA_0();
}
i2c_Delay();
BSP_I2C_SCL_1();
i2c_Delay();
BSP_I2C_SCL_0();
if (i == 7)
{
BSP_I2C_SDA_1(); // 释放总线
}
_ucByte <<= 1; /* 左移一个bit */
i2c_Delay();
}
}
uint8_t i2c_ReadByte(void)
{
uint8_t i;
uint8_t value;
/* 读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
BSP_I2C_SCL_1();
i2c_Delay();
if (BSP_I2C_SDA_READ())
{
value++;
}
BSP_I2C_SCL_0();
i2c_Delay();
}
return value;
}
uint8_t i2c_WaitAck(void)
{
uint8_t re;
BSP_I2C_SDA_1(); /* CPU释放SDA总线 */
i2c_Delay();
BSP_I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
i2c_Delay();
if (BSP_I2C_SDA_READ()) /* CPU读取SDA口线状态 */
{
re = 1;
}
else
{
re = 0;
}
BSP_I2C_SCL_0();
i2c_Delay();
return re;
}
void i2c_Ack(void)
{
BSP_I2C_SDA_0(); /* CPU驱动SDA = 0 */
i2c_Delay();
BSP_I2C_SCL_1(); /* CPU产生1个时钟 */
i2c_Delay();
BSP_I2C_SCL_0();
i2c_Delay();
BSP_I2C_SDA_1(); /* CPU释放SDA总线 */
}
void i2c_NAck(void)
{
BSP_I2C_SDA_1(); /* CPU驱动SDA = 1 */
i2c_Delay();
BSP_I2C_SCL_1(); /* CPU产生1个时钟 */
i2c_Delay();
BSP_I2C_SCL_0();
i2c_Delay();
}
void i2c_CfgGpio(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
I2Cx_SCL_GPIO_CLK_ENABLE();
I2Cx_SDA_GPIO_CLK_ENABLE();
/**I2C2 GPIO Configuration
PB10 ------> I2C2_SCL
PB9 ------> I2C2_SDA
*/
GPIO_InitStruct.Pin = BSP_I2C_SCL_PIN | BSP_I2C_SDA_PIN;
;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BSP_GPIO_PORT_I2C, &GPIO_InitStruct);
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
i2c_Stop();
}
/*******************************************模拟I2C***********************************************************/
//static uint8_t sendBuffer[2] = {0};
//void OLED2_Send(uint8_t *data, uint8_t len)//发送数据 8bit * len
//{
// //HAL_I2C_Master_Transmit(&hi2c1, SSD1306_I2C_ADDR| 0x00, data, len,10);//1000
//}
//void SSD1306_WriteCmd(uint8_t cmd)//发送命令 [0x00;cmd]
//{
// sendBuffer[0] = 0x00;
// sendBuffer[1] = cmd;
// OLED2_Send(sendBuffer, 2);
// delay_us(50);
//}
void SSD1306_WriteCmd(uint8_t cmd)
{
// sendBuffer[0] = 0x00;
// sendBuffer[1] = cmd;
// HAL_I2C_Master_Transmit(&hi2c1,SSD1306_I2C_ADDR,sendBuffer, 2,20);
i2c_Start();
i2c_SendByte(SSD1306_I2C_ADDR | 0x00);
i2c_Ack();
i2c_SendByte(0x00); //cmd
i2c_Ack();
i2c_SendByte(cmd);
i2c_Ack();
i2c_Stop();
}
void SSD1306_WriteData(uint8_t data)
{
// sendBuffer[0] = 0x40;
// sendBuffer[1] = data;
// OLED2_Send(sendBuffer, 2);
i2c_Start();
i2c_SendByte(SSD1306_I2C_ADDR | 0x00);
i2c_Ack();
i2c_SendByte(0x40); //data
i2c_Ack();
i2c_SendByte(data);
i2c_Ack();
i2c_Stop();
}
//SSD1306???
void OLED2_Init(void)
{
delay_us(500000);
//SSD1306????,?????????
SSD1306_WriteCmd(0xAE);//--display off
SSD1306_WriteCmd(0x00);//--set low column address
SSD1306_WriteCmd(0x10);//--set high column address
SSD1306_WriteCmd(0x40);//--set start line address
SSD1306_WriteCmd(0xB0);//--set page address
SSD1306_WriteCmd(0x81);// contract control
SSD1306_WriteCmd(0xFF);//--128
// SSD1306_WriteCmd(0xA1);//set segment re-map 0 to 127
SSD1306_WriteCmd(0xA0);//左右翻转
SSD1306_WriteCmd(0xA6);//set normal display
SSD1306_WriteCmd(0xA8);//set multiplex ratio(1 to 64)
SSD1306_WriteCmd(0x3F);//--1/32 duty
// SSD1306_WriteCmd(0xC8);//Com scan direction
SSD1306_WriteCmd(0xC0);//上下翻转
SSD1306_WriteCmd(0xD3);//set display offset
SSD1306_WriteCmd(0x00);//no offset
SSD1306_WriteCmd(0xD5);//set display clock divide ratio/oscillator frequency
SSD1306_WriteCmd(0x80);//
SSD1306_WriteCmd(0xD8);//set area color mode off
SSD1306_WriteCmd(0x05);//
SSD1306_WriteCmd(0xD9);//Set Pre-Charge Period
SSD1306_WriteCmd(0xF1);//
SSD1306_WriteCmd(0xDA);//set com pin hardware configuartion
SSD1306_WriteCmd(0x12);//
SSD1306_WriteCmd(0xDB);//set Vcomh
SSD1306_WriteCmd(0x30);//0x20,0.77xVcc
SSD1306_WriteCmd(0x8D);//set charge pump enable
SSD1306_WriteCmd(0x14);//
SSD1306_WriteCmd(0xAF);//--turn on oled panel
OLED_Clear();
}
//????:????????
void OLED_SetPos(uint8_t x, uint8_t y)
{
//??3???????????????
SSD1306_WriteCmd(0xb0+y); //????? 0xb0~0xb7
SSD1306_WriteCmd(((x&0xf0)>>4)|0x10); //???????
SSD1306_WriteCmd((x&0x0f)); //???????
}
//??OLED??
void OLED_DisplayOn(void)
{
SSD1306_WriteCmd(0X8D); //SET DCDC??
SSD1306_WriteCmd(0X14); //DCDC ON
SSD1306_WriteCmd(0XAF); //DISPLAY ON
}
//??OLED??
void OLED_DisplayOff(void)
{
SSD1306_WriteCmd(0X8D); //SET DCDC??
SSD1306_WriteCmd(0X10); //DCDC OFF
SSD1306_WriteCmd(0XAE); //DISPLAY OFF
}
//????,???,????????!??????
//int clr_i = 0;
//uint8_t clr_n = 0;
void OLED_Clear(void)
{
// clr_i *= (clr_i<8);
int i;
uint8_t n;
for(i=0;i<8;i++)
{
SSD1306_WriteCmd (0xb0+i); //?????(0~7)
SSD1306_WriteCmd (0x00); //??????<3F>????
SSD1306_WriteCmd (0x10); //??????<3F>????
for(n = 0;n < 128;n++)
SSD1306_WriteData(0);
} //????
// clr_i++;
}
//???????????,??????
//x:0~127,y:0~7
//Char_Size:???? 16/12
//uint8_t sc_i = 0;
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size,uint8_t color)
{
uint8_t c=0,i=0;
// uint8_t c = 0;
c=chr-' ';//???????
if(x>MAX_COLUMN-1)
{
x=0;
y=y+2;
}
if(Char_Size ==16)
{
if(color == 0)
{
OLED_SetPos(x,y);
for(i=0;i<8;i++)
{
SSD1306_WriteData(F8X16[c*16+i]);//??????
}
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
{
SSD1306_WriteData(F8X16[c*16+i+8]);//??????
}
}
if(color == 1)
{
OLED_SetPos(x,y);
for(i=0;i<8;i++)
{
SSD1306_WriteData(~F8X16[c*16+i]);//??????
}
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
{
SSD1306_WriteData(~F8X16[c*16+i+8]);//??????
}
}
}
else
{
OLED_SetPos(x,y);
for(i=0;i<6;i++)
{
SSD1306_WriteData(F6x8[c][i]);
}
// sc_i *= (sc_i<6);
// OLED_SetPos(x,y);
// SSD1306_WriteData(F6x8[c][sc_i]);
// sc_i++;
}
}
//???????
void OLED_ShowString(uint8_t x,uint8_t y,char *str,uint8_t Char_Size,uint8_t color)
{
unsigned char j=0;
while (str[j]!='\0')
{
OLED_ShowChar(x,y,str[j],Char_Size,color);
x+=8;
if(x>120)
{
x=0;
y+=2;
}
j++;//????????page,??0-7
}
}
//????
//?????16*16???,??????4???
//index:?????????
void OLED_ShowCN(uint8_t x,uint8_t y,uint8_t index,uint8_t color)
{
uint8_t t;
if(color == 0)
{
OLED_SetPos(x,y);
for(t=0;t<16;t++)
{
SSD1306_WriteData(Hzk[index][t]);
}
OLED_SetPos(x,y+1);
for(t=0;t<16;t++)
{
SSD1306_WriteData(Hzk[index][t+16]);
}
}
if(color == 1)
{
OLED_SetPos(x,y);
for(t=0;t<16;t++)
{
SSD1306_WriteData(~Hzk[index][t]);
}
OLED_SetPos(x,y+1);
for(t=0;t<16;t++)
{
SSD1306_WriteData(~Hzk[index][t+16]);
}
}
}
char str_print2[16] = {0},str_print3[5] = {0};
float Xads_temp2[2] = {0},T_temp2[2] = {0},OC1_temp[2] = {0},OC2_temp[2] = {0};
char disp_step2 = 0;
void OLED_DisplayTest(void)
{
switch(disp_step2)
{
case 0 :// 初始化
{
OLED2_Init();
disp_step2++;
}
break;
case 1 :// 显示不动
{
disp_step2++;
OLED_ShowString(0,0,(char *)("Pos"),16,0); //(x,y,char,size,color), color{0正常1反显},x{0-128},y{}
sprintf(str_print2, "%.2f",X_ads1220 ); // 电阻尺
OLED_ShowString(0,2,str_print2,16,0);
OLED_ShowString(0,4,(char *)("Temp"),16,0);
sprintf(str_print3, "%.2f",TEMP_M1820 ); //温度
OLED_ShowString(40,6," ",16,0);
OLED_ShowString(48,2,(char *)("mv"),16,0);
}
break;
case 2 :// 显示动的部分
{
//位置
Xads_temp2[0] = X_ads1220;
if(Xads_temp2[1] - Xads_temp2[0] > 0.001 )
{
OLED_ShowString(40,2," ",16,0);
sprintf(str_print2, "%.2f",Xads_temp2[0]*100 ); // 电阻尺
OLED_ShowString(0,2,str_print2,16,0);
Xads_temp2[1] = Xads_temp2[0];
}
//温度
T_temp2[0] = TEMP_M1820;
if(T_temp2[1] != T_temp2[0])
{
sprintf(str_print2, "%.2f",T_temp2[1] ); //温度
OLED_ShowString(40,6," ",16,0);
OLED_ShowString(0,6,str_print2,16,0);
T_temp2[1] = T_temp2[0];
}
}
break;
default ://
{
disp_step2 = 0;
}
break;
}
}
char oled_p = 0,oled_s[2] = {0},oled_en = 1,oled_s_motorok[2] = {0},oled_s_magnetok[2] = {0}; //界面选择指针暂存
char magnet_select[2] = {0},magnet_s_ok[2] = {0}; //磁条规格切换、确认取消指针
char para_flag = 0,motor_flag1 = 0,motor_flag2 = 0,magnet_flag = 0; //界面标记,用于区分只显示一次和需要刷新的内容
unsigned int step_temp[2] = {1,1},smp_intr_temp[2] = {0},smp_dpth_temp[2] = {0}; //步长、采样间隔、采样深度暂存
char run_mode_temp[2] = {0},magnetx_temp[2] = {0}; //运行模式(点动,循环)暂存,磁条规格暂存
signed int magnetv_temp[2] = {0}; //磁感应读数暂存
float x_magnet_temp[2] = {0}; //磁条校准位置暂存
int direc_temp[2] = {1,1}; //反向暂存
uint16_t flash_wrt[6] = {0},flash_rd[6] = {0}; //0:#25中点,1:#50中点,2:#110中点
char magnet_motor_sw = 0; //磁条校准时电机运动开关
void OLED_MenuTest(void)
{
switch(oled_p)
{
case 0: //初始化
{
OLED2_Init();
oled_p++;
}
break;
case 1: //显示不动的内容
{
OLED_Clear(); //刷新
para_flag = 0;
OLED_ShowCN(0,0,2,0); //正常“参”第0页
OLED_ShowCN(24,0,3,0); //正常“数”第0页
OLED_ShowCN(48,0,4,0); //正常“监”第0页
OLED_ShowCN(72,0,5,0); //正常“测”第0页
OLED_ShowCN(0,2,6,0); //正常“电”第2页
OLED_ShowCN(24,2,7,0); //正常“机”第2页
OLED_ShowCN(48,2,8,0); //正常“控”第2页
OLED_ShowCN(72,2,9,0); //正常“制”第2页
OLED_ShowCN(0,4,10,0); //正常“磁”第4页
OLED_ShowCN(24,4,11,0); //正常“条”第4页
OLED_ShowCN(48,4,12,0); //正常“采”第4页
OLED_ShowCN(72,4,13,0); //正常“样”第4页
OLED_ShowCN(0,6,10,0); //正常“磁”第6页
OLED_ShowCN(24,6,11,0); //正常“条”第6页
OLED_ShowCN(48,6,51,0); //正常“校”第6页
OLED_ShowCN(72,6,52,0); //正常“准”第6页
if(oled_s[0] == 0) OLED_ShowChar(112,0,'<',16,0); //判断当前光标位置
if(oled_s[0] == 1) OLED_ShowChar(112,2,'<',16,0);
if(oled_s[0] == 2) OLED_ShowChar(112,4,'<',16,0);
if(oled_s[0] == 3) OLED_ShowChar(112,6,'<',16,0);
oled_p++;
}
break;
case 2: //菜单选择
{
if(oled_s[0] != oled_s[1]) //光标位置是否发生变化
{
if(oled_s[0] == 0) //当前选择第0行
{
OLED_ShowChar(112,0,'<',16,0);
if(oled_s[1] == 1) OLED_ShowChar(112,2,' ',16,0); //刷新之前所在行1
if(oled_s[1] == 3) OLED_ShowChar(112,6,' ',16,0); //刷新之前所在行3
oled_s[1] = oled_s[0];
}
if(oled_s[0] == 1) //当前选择第1行
{
OLED_ShowChar(112,2,'<',16,0);
if(oled_s[1] == 0) OLED_ShowChar(112,0,' ',16,0); //刷新之前所在行0
if(oled_s[1] == 2) OLED_ShowChar(112,4,' ',16,0); //刷新之前所在行2
oled_s[1] = oled_s[0];
}
if(oled_s[0] == 2)
{
OLED_ShowChar(112,4,'<',16,0);
if(oled_s[1] == 1) OLED_ShowChar(112,2,' ',16,0);
if(oled_s[1] == 3) OLED_ShowChar(112,6,' ',16,0);
oled_s[1] = oled_s[0];
}
if(oled_s[0] == 3)
{
OLED_ShowChar(112,6,'<',16,0);
if(oled_s[1] == 2) OLED_ShowChar(112,4,' ',16,0);
if(oled_s[1] == 0) OLED_ShowChar(112,0,' ',16,0);
oled_s[1] = oled_s[0];
}
}
if( (oled_s[0] == 0) && (oled_en == 1) ) //进入参数观测
{
oled_en = 0;
oled_p = 3;
}
if( (oled_s[0] == 1) && (oled_en == 1) ) //进入电机控制
{
oled_en = 0;
oled_p = 4;
}
if( (oled_s[0] == 2) && (oled_en == 1) ) //进入磁性传感器采样设置
{
oled_en = 0;
oled_p = 9;
}
if( (oled_s[0] == 3) && (oled_en == 1) ) //进入磁条校准界面
{
oled_en = 0;
oled_p = 12;
}
}
break;
case 3: //参数显示,发生变化时刷新
{
if(para_flag == 0) //只显示一次
{
para_flag = 1;
OLED_Clear();
OLED_ShowCN(0,0,6,0); //正常“电”第0页
OLED_ShowCN(16,0,14,0); //正常“阻”第0页
OLED_ShowCN(32,0,15,0); //正常“尺”第0页
OLED_ShowChar(96,0,' ',16,0); //刷新第六位
sprintf(str_print2, "%d",(int)X_ads1220 );
OLED_ShowString(56,0,str_print2,16,0); //电阻尺ADC值
// OLED_ShowString(112,0,"mv",16,0); //mv
OLED_ShowCN(0,2,16,0); //正常“温”第2页
OLED_ShowCN(16,2,17,0); //正常“度”第2页
if( TEMP_M1820 > 50) TEMP_M1820 = 25.00;
sprintf(str_print3, "%.1f",TEMP_M1820 );
OLED_ShowString(56,2,str_print3,16,0); //温度值
OLED_ShowCN(0,4,10,0); //正常“磁”第4页
OLED_ShowCN(16,4,11,0); //正常“条”第4页
if( abs(vol_data) > 500) vol_data = 500;
sprintf(str_print2, "%d",vol_data );
OLED_ShowString(56,4,str_print2,16,0); //磁条感应值
if(ocin1 == 1)
{
OLED_ShowString(0,6,"-----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(0,6,18,0); //正常“限”第4页
OLED_ShowCN(16,6,19,0); //正常“位”第4页
OLED_ShowChar(32,6,'1',16,0); //'1'
}
if(ocin2 == 1)
{
OLED_ShowString(72,6,"-----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(72,6,18,0); //正常“限”第6页
OLED_ShowCN(88,6,19,0); //正常“位”第6页
OLED_ShowChar(104,6,'2',16,0); //'2'
}
}else //变化时刷新
{
Xads_temp2[0] = X_ads1220; //位置变化幅度是否大于1mv
if( (Xads_temp2[1] - Xads_temp2[0] >= 1) || (Xads_temp2[0] - Xads_temp2[1] >= 1))
{
sprintf(str_print2, "%d",(int)Xads_temp2[0] ); // 电阻尺
OLED_ShowString(72,0," ",16,0); //刷新第3-4位
OLED_ShowString(56,0,str_print2,16,0);
Xads_temp2[1] = Xads_temp2[0];
}
T_temp2[0] = TEMP_M1820; //温度是否变化
if((T_temp2[1] != T_temp2[0]) && (T_temp2[1] < 50))
{
sprintf(str_print3, "%.1f",T_temp2[1] ); //温度
OLED_ShowString(56,2,str_print3,16,0);
OLED_ShowChar(72,2,'.',16,0); //刷新小数点,防止乱码
T_temp2[1] = T_temp2[0];
}
magnetv_temp[0] = vol_data; //磁条位置是否变化
if( abs(vol_data) > 500) vol_data = 500;
if(magnetv_temp[1] != magnetv_temp[0])
{
OLED_ShowString(64,4," ",16,0);
sprintf(str_print2, "%d",vol_data );
OLED_ShowString(56,4,str_print2,16,0); //磁条感应值
magnetv_temp[1] = magnetv_temp[0];
}
OC1_temp[0] = ocin1; //位置开关1
if( OC1_temp[1] != OC1_temp[0] )
{
if(OC1_temp[0] == 1)
{
OLED_ShowString(0,6,"-----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(0,6,18,0); //正常“限”第4页
OLED_ShowCN(16,6,19,0); //正常“位”第4页
OLED_ShowChar(32,6,'1',16,0); //'1'
}
OC1_temp[1] = OC1_temp[0];
}
OC2_temp[0] = ocin2; //位置开关2
if( OC2_temp[1] != OC2_temp[0] )
{
if(OC2_temp[0] == 1)
{
OLED_ShowString(72,6,"-----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(72,6,18,0); //正常“限”第6页
OLED_ShowCN(88,6,19,0); //正常“位”第6页
OLED_ShowChar(104,6,'2',16,0); //'2'
}
OC2_temp[1] = OC2_temp[0];
}
}
if(oled_en == 1) //OK键按下后返回菜单
{
oled_en = 0;
oled_p = 1;
para_flag = 0;
}
}
break;
case 4: //电机控制,设定运动模式
{
if(motor_flag1 == 0) //只进入一次
{
motor_flag1 = 1;
OLED_Clear();
OLED_ShowCN(0,0,22,0); //正常“运”第0页
OLED_ShowCN(16,0,23,0); //正常“动”第0页
OLED_ShowCN(32,0,24,0); //正常“模”第0页
OLED_ShowCN(48,0,25,0); //正常“式”第0页
if(Run_Mode == 0) //反显当前运动模式
{
OLED_ShowCN(72,0,26,1); //反显“点”第0页
OLED_ShowCN(88,0,27,1); //反显“动”第0页
}
if(Run_Mode == 1)
{
OLED_ShowCN(72,0,28,1); //反显“循”第0页
OLED_ShowCN(88,0,29,1); //反显“环”第0页
}
if(Run_Mode == 2)
{
OLED_ShowCN(72,0,50,1); //反显“复”第0页
OLED_ShowCN(88,0,19,1); //反显“位”第0页
}
run_mode_temp[0] = Run_Mode;
run_mode_temp[1] = Run_Mode;
OLED_ShowCN(0,2,22,0); //正常“运”第2页
OLED_ShowCN(16,2,23,0); //正常“动”第2页
OLED_ShowCN(32,2,30,0); //正常“步”第2页
OLED_ShowCN(48,2,31,0); //正常“长”第2页
sprintf(str_print3, "%d",Run_mm ); //显示当前的Run_mm值
OLED_ShowString(72,2,str_print3,16,0);
OLED_ShowString(96,2,"mm",16,0);
step_temp[0] = Run_mm;
step_temp[1] = Run_mm;
OLED_ShowCN(0,4,22,0); //正常“运”第4页
OLED_ShowCN(16,4,23,0); //正常“动”第4页
OLED_ShowCN(32,4,32,0); //正常“方”第4页
OLED_ShowCN(48,4,33,0); //正常“向”第4页
if(motor_direc == 2) //显示当前方向
{
OLED_ShowCN(72,4,35,0); //正常“反”第4页
}
if(motor_direc == 1)
{
OLED_ShowCN(72,4,34,0); //正常“正”第4页
}
direc_temp[0] = motor_direc;
direc_temp[1] = motor_direc;
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}else
{
if(run_mode_temp[0] != run_mode_temp[1]) //运动模式变化时刷新
{
if(run_mode_temp[0] == 0)
{
OLED_ShowCN(72,0,26,1); //反显“点”第0页
OLED_ShowCN(88,0,27,1); //反显“动”第0页
}
if(run_mode_temp[0] == 1)
{
OLED_ShowCN(72,0,28,1); //反显“循”第0页
OLED_ShowCN(88,0,29,1); //反显“环”第0页
}
if(run_mode_temp[0] == 2)
{
OLED_ShowCN(72,0,50,1); //反显“复”第0页
OLED_ShowCN(88,0,19,1); //反显“位”第0页
}
run_mode_temp[1] = run_mode_temp[0];
}
}
if( oled_en == 1 ) //运动模式确认后取消反显
{
oled_en = 0;
motor_flag1 = 0;
if(run_mode_temp[0] == 0)
{
OLED_ShowCN(72,0,26,0); //正常“点”第0页
OLED_ShowCN(88,0,27,0); //正常“动”第0页
}
if(run_mode_temp[0] == 1)
{
OLED_ShowCN(72,0,28,0); //正常“循”第0页
OLED_ShowCN(88,0,29,0); //正常“环”第0页
}
if(run_mode_temp[0] == 2)
{
OLED_ShowCN(72,0,50,0); //正常“复”第0页
OLED_ShowCN(88,0,19,0); //正常“位”第0页
}
oled_p = 5; //完成模式选择后跳转至步长设定
}
}
break;
case 5: //电机控制,设定运动步长
{
if(run_mode_temp[0] == 0) //仅允许在点动模式下修改步长
{
if(motor_flag1 == 0)
{
motor_flag1 = 1;
sprintf(str_print3, "%d",Run_mm );
OLED_ShowString(72,2,str_print3,16,1);
step_temp[0] = Run_mm;
step_temp[1] = Run_mm;
}else
{
if(step_temp[0] != step_temp[1]) //步长变动时刷新通过按键调整key.c→key_act()
{
OLED_ShowString(80,2," ",16,0);
sprintf(str_print3, "%d",step_temp[0] );
OLED_ShowString(72,2,str_print3,16,1);
}
step_temp[1] = step_temp[0];
}
if(oled_en == 1) //步长确定后取消反显
{
oled_en = 0;
motor_flag1 = 0;
OLED_ShowString(72,2,str_print3,16,0);
oled_p = 6;
}
}
if(run_mode_temp[0] == 1) //循环模式默认步长为1mm方向受业务流程函数控制
{
step_temp[0] = 1;
step_temp[1] = 1;
OLED_ShowString(80,2," ",16,0);
sprintf(str_print3, "%d",step_temp[0] );
OLED_ShowString(72,2,str_print3,16,0);
oled_p = 7;
}
if(run_mode_temp[0] == 2) //复位模式默认为反向运动至起点
{
step_temp[0] = 1;
step_temp[1] = 1;
OLED_ShowString(72,2,"--",16,0);
OLED_ShowCN(72,4,35,0); //正常“反”第4页
oled_p = 7;
}
}
break;
case 6: //点动模式下修改方向
{
if(motor_flag1 == 0)
{
motor_flag1 = 1;
if(direc_temp[0] == 1)
{
OLED_ShowCN(72,4,34,1); //反显“正”第4页
}
if(direc_temp[0] == 2)
{
OLED_ShowCN(72,4,35,1); //反显“反”第4页
}
}else
{
if(direc_temp[0] !=direc_temp[1] )
{
if(direc_temp[0] == 1)
{
OLED_ShowCN(72,4,34,1); //反显“正”第4页
}
if(direc_temp[0] == 2)
{
OLED_ShowCN(72,4,35,1); //反显“反”第4页
}
direc_temp[1] = direc_temp[0];
}
}
if(oled_en == 1) //确认后取消反显
{
oled_en = 0;
motor_flag1 = 0;
if(direc_temp[0] == 1)
{
OLED_ShowCN(72,4,34,0); //正常“正”第4页
}
if(direc_temp[0] == 2)
{
OLED_ShowCN(72,4,35,0); //正常“反”第4页
}
oled_p = 7;
}
}
break;
case 7: //内容确认OK后写入并运行取消则不写入并返回菜单
{
if(motor_flag1 == 0)
{
motor_flag1 = 1;
oled_s_motorok[0] = 0;
oled_s_motorok[1] = 0;
OLED_ShowCN(0,6,38,1); //反显“取”第6页
OLED_ShowCN(16,6,39,1); //反显“消”第6页
}else
{
if(oled_s_motorok[0] != oled_s_motorok[1]) //确认或取消选择
{
if(oled_s_motorok[0] == 0)
{
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,1); //反显“取”第6页
OLED_ShowCN(16,6,39,1); //反显“消”第6页
}
if(oled_s_motorok[0] == 1)
{
OLED_ShowCN(80,6,36,1); //反显“确”第6页
OLED_ShowCN(96,6,37,1); //反显“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}
oled_s_motorok[1] = oled_s_motorok[0];
}
}
if((oled_en == 1) && (oled_s_motorok[0] == 0)) //取消后初始化暂存数据,并返回主菜单
{
oled_en = 0;
motor_flag1 = 0;
Motor_Run = 0;
run_mode_temp[0] = 0;
run_mode_temp[1] = 0;
step_temp[0] = 1;
step_temp[1] = 1;
direc_temp[0] = 1;
direc_temp[1] = 1;
oled_p = 1;
}
if((oled_en == 1) && (oled_s_motorok[0] == 1)) //确认后将暂存数据写入对应参数
{
oled_en = 0;
motor_flag1 = 0;
if(run_mode_temp[0] != 2) //点动或循环,按照设定值开始运行
{
Motor_Run = 1;
Run_Mode = run_mode_temp[0];
Run_mm = step_temp[0];
motor_direc = direc_temp[0];
}else //复位后初始化暂存数据
{
Motor_Run = 2;
run_mode_temp[0] = 0;
run_mode_temp[1] = 0;
step_temp[0] = 1;
step_temp[1] = 1;
direc_temp[0] = 1;
direc_temp[1] = 1;
}
oled_p = 8; //运动期间跳转至下一步
}
}
break;
case 8: //运行状态显示,运行中...../已完成!
{
if(motor_flag2 == 0)
{
motor_flag2 = 1;
OLED_Clear();
OLED_ShowCN(0,0,22,0); //正常“运”第0页
OLED_ShowCN(16,0,40,0); //正常“行”第0页
OLED_ShowCN(32,0,41,0); //正常“中”第0页
OLED_ShowString(48,0,".....",16,0);
OLED_ShowCN(0,2,6,0); //正常“电”第2页
OLED_ShowCN(16,2,14,0); //正常“阻”第2页
OLED_ShowCN(32,2,15,0); //正常“尺”第2页
sprintf(str_print2, "%.2f",X_ads1220 );
OLED_ShowString(56,2,str_print2,16,0); //电阻尺ADC值
// OLED_ShowString(112,2,"mv",16,0); //mv
OLED_ShowCN(0,4,18,0); //正常“限”第4页
OLED_ShowCN(16,4,19,0); //正常“位”第4页
OLED_ShowChar(32,4,'1',16,0); //'1'
OLED_ShowCN(0,6,18,0); //正常“限”第6页
OLED_ShowCN(16,6,19,0); //正常“位”第6页
OLED_ShowChar(32,6,'2',16,0); //'2'
if(ocin1 == 1)
{
OLED_ShowString(56,4,"----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(56,4,20,0); //正常“到”第4页
OLED_ShowCN(72,4,21,0); //正常“达”第4页
}
if(ocin2 == 1)
{
OLED_ShowString(56,6,"----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(56,6,20,0); //正常“到”第6页
OLED_ShowCN(72,6,21,0); //正常“达”第6页
}
}else
{
Xads_temp2[0] = X_ads1220; //电阻尺位置
if( (Xads_temp2[1] - Xads_temp2[0] > 1) || (Xads_temp2[0] - Xads_temp2[1] > 1))
{
sprintf(str_print2, "%.2f",Xads_temp2[0] );
OLED_ShowString(56,2,str_print2,16,0);
OLED_ShowChar(112,2,' ',16,0);
Xads_temp2[1] = Xads_temp2[0];
}
OC1_temp[0] = ocin1; //位置开关1
if( OC1_temp[1] != OC1_temp[0] )
{
if(OC1_temp[0] == 1)
{
OLED_ShowString(56,4,"----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(56,4,20,0); //正常“到”第4页
OLED_ShowCN(72,4,21,0); //正常“达”第4页
}
OC1_temp[1] = OC1_temp[0];
}
OC2_temp[0] = ocin2; //位置开关2
if( OC2_temp[1] != OC2_temp[0] )
{
if(OC2_temp[0] == 1)
{
OLED_ShowString(56,6,"----",16,0); //未到达,显示“----”
}else
{
OLED_ShowCN(56,6,20,0); //正常“到”第6页
OLED_ShowCN(72,6,21,0); //正常“达”第6页
}
OC2_temp[1] = OC2_temp[0];
}
if(Motor_Run == 0) //运动完成后都会进入静止模式
{
OLED_ShowCN(0,0,42,0); //正常“已”第0页
OLED_ShowCN(16,0,43,0); //正常“完”第0页
OLED_ShowCN(32,0,44,0); //正常“成”第0页
OLED_ShowString(48,0,"! ",16,0);
}
}
if(oled_en == 1) //按下OK后返回主菜单
{
oled_en = 0;
Runmotor_step = 0;
Motor_Run = 0;
oled_p = 1;
motor_flag2 = 0;
}
}
break;
case 9: //磁感应传感模块采样设置设置采样间隔ms
{
if(magnet_flag == 0)
{
magnet_flag = 1;
OLED_Clear();
smp_intr_temp[0] = magnet_tx[3]; //初始化暂存数据
smp_intr_temp[1] = magnet_tx[3];
smp_dpth_temp[0] = magnet_tx[5];
smp_dpth_temp[1] = magnet_tx[5];
OLED_ShowCN(32,0,12,1); //反显“采”第0页
OLED_ShowCN(48,0,13,1); //反显“样”第0页
OLED_ShowCN(64,0,45,1); //反显“设”第0页
OLED_ShowCN(80,0,46,1); //反显“置”第0页
OLED_ShowString(0,0," ",16,1);
OLED_ShowString(96,0," ",16,1);
OLED_ShowCN(0,2,12,0); //正常“采”第2页
OLED_ShowCN(16,2,13,0); //正常“样”第2页
OLED_ShowCN(32,2,47,0); //正常“间”第2页
OLED_ShowCN(48,2,48,0); //正常“隔”第2页
sprintf(str_print2, "%d",smp_intr_temp[0] );
OLED_ShowString(72,2,str_print2,16,1);
OLED_ShowString(96,2,"ms",16,0);
OLED_ShowCN(0,4,12,0); //正常“采”第4页
OLED_ShowCN(16,4,13,0); //正常“样”第4页
OLED_ShowCN(32,4,49,0); //正常“深”第4页
OLED_ShowCN(48,4,17,0); //正常“度”第4页
sprintf(str_print2, "%d",smp_dpth_temp[0] );
OLED_ShowString(72,4,str_print2,16,0);
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}else
{ //采样间隔是否变化,按键调整
if(smp_intr_temp[0] != smp_intr_temp[1])
{
OLED_ShowString(80,2," ",16,0);
sprintf(str_print3, "%d",smp_intr_temp[0] );
OLED_ShowString(72,2,str_print3,16,1);
smp_intr_temp[1] = smp_intr_temp[0];
}
}
if(oled_en == 1) //确认后取消反显
{
oled_en = 0;
magnet_flag = 0;
OLED_ShowString(80,2," ",16,0);
sprintf(str_print3, "%d",smp_intr_temp[0] );
OLED_ShowString(72,2,str_print3,16,0);
oled_p = 10;
}
}
break;
case 10: //磁感应传感模块采样设置,设置采样深度
{
if(magnet_flag == 0)
{
magnet_flag = 1;
sprintf(str_print3, "%d",smp_dpth_temp[0] );
OLED_ShowString(72,4,str_print3,16,1);
}else
{ //采样深度是否变化,按键调整
if(smp_dpth_temp[0] != smp_dpth_temp[1])
{
OLED_ShowString(80,4," ",16,0);
sprintf(str_print3, "%d",smp_dpth_temp[0] );
OLED_ShowString(72,4,str_print3,16,1);
smp_dpth_temp[1] = smp_dpth_temp[0];
}
}
if(oled_en == 1) //确认后取消反显
{
oled_en = 0;
magnet_flag = 0;
OLED_ShowString(80,4," ",16,0);
sprintf(str_print3, "%d",smp_dpth_temp[0] );
OLED_ShowString(72,4,str_print3,16,0);
oled_p = 11;
}
}
break;
case 11: //磁感应传感模块设置确认
{
if(magnet_flag == 0)
{
magnet_flag = 1;
oled_s_magnetok[0] = 0;
oled_s_magnetok[1] = 0;
OLED_ShowCN(0,6,38,1); //反显“取”第6页
OLED_ShowCN(16,6,39,1); //反显“消”第6页
}else
{
if(oled_s_magnetok[0] != oled_s_magnetok[1])
{
if(oled_s_magnetok[0] == 0)
{
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,1); //反显“取”第6页
OLED_ShowCN(16,6,39,1); //反显“消”第6页
}
if(oled_s_magnetok[0] == 1)
{
OLED_ShowCN(80,6,36,1); //反显“确”第6页
OLED_ShowCN(96,6,37,1); //反显“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}
oled_s_magnetok[1] = oled_s_magnetok[0];
}
}
if(oled_en == 1)
{
if(oled_s_magnetok[0] == 0) //取消后初始化暂存数组
{
oled_en = 0;
magnet_flag = 0;
smp_intr_temp[0] = magnet_tx[3];
smp_intr_temp[1] = magnet_tx[3];
smp_dpth_temp[0] = magnet_tx[5];
smp_dpth_temp[1] = magnet_tx[5];
oled_p = 1;
}
if(oled_s_magnetok[0] == 1) //确认后将暂存数据写入magnet_tx
{
oled_en = 0;
magnet_flag = 0;
magnet_tx[3] = smp_intr_temp[0];
magnet_tx[5] = smp_dpth_temp[0];
HAL_GPIO_WritePin(RS485_EN1_GPIO_Port,RS485_EN1_Pin,GPIO_PIN_SET); //使能485发送发送结束后在回调函数中拉低
HAL_UART_Transmit_IT(&huart2, magnet_tx ,7); //485发送发送完成后在回调函数中再次使能接收
oled_p = 1;
}
}
}
break;
case 12:
{
if(magnet_flag == 0)
{
magnet_flag = 1;
OLED_Clear();
STMFLASH_Read(FLASH_SAVE_ADDR,flash_rd,6); //读取当前flash内容
for(char i = 0;i < 6;i++) flash_wrt[i] = flash_rd[i]; //初始化写入flash的内容
OLED_ShowCN(0,0,10,0); //正常“磁”第0页
OLED_ShowCN(16,0,11,0); //正常“条”第0页
if(magnet_select[0] == 0) OLED_ShowString(72,0,"#25 ",16,1);
if(magnet_select[0] == 1) OLED_ShowString(72,0,"#50 ",16,1);
if(magnet_select[0] == 2) OLED_ShowString(72,0,"#110",16,1);
OLED_ShowCN(0,2,53,0); //正常“当”第2页
OLED_ShowCN(16,2,54,0); //正常“前”第2页
OLED_ShowCN(32,2,41,0); //正常“中”第2页
OLED_ShowCN(48,2,26,0); //正常“点”第2页
if(magnet_select[0] == 0)
{
sprintf(str_print2, "%d",flash_rd[0] ); //#25的中点
OLED_ShowString(72,2,str_print2,16,0);
}
if(magnet_select[0] == 1)
{
sprintf(str_print2, "%d",flash_rd[1] ); //#50的中点
OLED_ShowString(72,2,str_print2,16,0);
}
if(magnet_select[0] == 2)
{
sprintf(str_print2, "%d",flash_rd[2] ); //#110的中点
OLED_ShowString(72,2,str_print2,16,0);
}
OLED_ShowCN(0,4,45,0); //正常“设”第4页
OLED_ShowCN(16,4,46,0); //正常“置”第4页
OLED_ShowCN(32,4,41,0); //正常“中”第4页
OLED_ShowCN(48,4,26,0); //正常“点”第4页
sprintf(str_print2, "%d",(uint16_t)X_ads1220 ); //当前位置
OLED_ShowString(72,4,str_print2,16,0);
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}
else
{
if(magnet_select[0] != magnet_select[1])
{
if(magnet_select[0] == 0) OLED_ShowString(72,0,"#25 ",16,1);
if(magnet_select[0] == 1) OLED_ShowString(72,0,"#50 ",16,1);
if(magnet_select[0] == 2) OLED_ShowString(72,0,"#110",16,1);
magnet_select[1] = magnet_select[0];
}
if(oled_en == 1)
{
oled_en = 0;
magnet_flag = 0;
if(magnet_select[0] == 0)
{
OLED_ShowString(72,0,"#25 ",16,0); //确定后取消反显
sprintf(str_print2, "%d",flash_rd[0] ); //#25的中点
OLED_ShowString(72,2,str_print2,16,0);
}
if(magnet_select[0] == 1)
{
OLED_ShowString(72,0,"#50 ",16,0);
sprintf(str_print2, "%d",flash_rd[1] ); //#50的中点
OLED_ShowString(72,2,str_print2,16,0);
}
if(magnet_select[0] == 2)
{
OLED_ShowString(72,0,"#110 ",16,0);
sprintf(str_print2, "%d",flash_rd[2] ); //#50的中点
OLED_ShowString(72,2,str_print2,16,0);
}
oled_p = 13;
}
}
}
break;
case 13:
{
if(magnet_flag == 0)
{
magnet_flag = 1;
sprintf(str_print2, "%d",(uint16_t)Xads_temp2[0] ); //反显当前位置
OLED_ShowString(72,4,str_print2,16,1);
}
else
{
//位置
Xads_temp2[0] = X_ads1220;
if( (Xads_temp2[1] - Xads_temp2[0] > 1) || (Xads_temp2[0] - Xads_temp2[1] > 1))
{
sprintf(str_print2, "%d",(uint16_t)Xads_temp2[0] );
OLED_ShowString(72,4,str_print2,16,1);
Xads_temp2[1] = Xads_temp2[0];
}
if(magnet_motor_sw == 0) //电机停止
{
Motor_Run = 0;
motor_direc = 1;
Run_Mode = 0;
}
if(magnet_motor_sw == 1) //电机循环正向步进
{
Run_Step = 0;
Run_mm = 15;
motor_direc = 1;
Motor_Run = 1;
Run_Mode = 0;
}
if(magnet_motor_sw == 2) //电机循环反向步进
{
Run_Step = 0;
Run_mm = 15;
motor_direc = 2;
Motor_Run = 1;
Run_Mode = 0;
}
}
if(oled_en == 1) //确认当前位置后,取消反显
{
oled_en = 0;
magnet_flag = 0;
Run_mm = 1; //退出电机控制,各参数初始化
Motor_Run = 0;
Run_Mode = 0;
motor_direc = 1;
Runmotor_step = 0;
sprintf(str_print2, "%d",(uint16_t)Xads_temp2[0] );
OLED_ShowString(72,4,str_print2,16,0);
oled_p = 14;
}
}
break;
case 14:
{
if(magnet_flag == 0)
{
magnet_flag = 1;
if(magnet_s_ok[0] == 0 )
{
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,1); //反显“取”第6页
OLED_ShowCN(16,6,39,1); //反显“消”第6页
}
if(magnet_s_ok[0] == 1 )
{
OLED_ShowCN(80,6,36,1); //反显“确”第6页
OLED_ShowCN(96,6,37,1); //反显“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}
}
else
{
if(magnet_s_ok[0] != magnet_s_ok[1] )
{
if(magnet_s_ok[0] == 0 )
{
OLED_ShowCN(80,6,36,0); //正常“确”第6页
OLED_ShowCN(96,6,37,0); //正常“认”第6页
OLED_ShowCN(0,6,38,1); //反显“取”第6页
OLED_ShowCN(16,6,39,1); //反显“消”第6页
}
if(magnet_s_ok[0] == 1 )
{
OLED_ShowCN(80,6,36,1); //反显“确”第6页
OLED_ShowCN(96,6,37,1); //反显“认”第6页
OLED_ShowCN(0,6,38,0); //正常“取”第6页
OLED_ShowCN(16,6,39,0); //正常“消”第6页
}
magnet_s_ok[1] = magnet_s_ok[0];
}
}
if((oled_en == 1) && (magnet_s_ok[0] == 1)) //确认后将“设置中点”处的值写入flash
{
oled_en = 0;
magnet_flag = 0;
if(magnet_select[0] == 0) flash_wrt[0] = (uint16_t)Xads_temp2[0]; //#25中点
if(magnet_select[0] == 1) flash_wrt[1] = (uint16_t)Xads_temp2[0]; //#50中点
if(magnet_select[0] == 2) flash_wrt[2] = (uint16_t)Xads_temp2[0]; //#110中点
STMFLASH_Write(FLASH_SAVE_ADDR,flash_wrt,6); //写入flash
magnet_middle = flash_rd[0]; //修改当前的中点,默认以#25的中点为标准
magnet_s_ok[0] = 0;
magnet_s_ok[1] = 0;
magnet_select[0] = 0;
magnet_select[1] = 0;
oled_p = 1;
}
if((oled_en == 1) && (magnet_s_ok[0] == 0)) //取消后直接返回
{
oled_en = 0;
magnet_flag = 0;
magnet_s_ok[0] = 0;
magnet_s_ok[1] = 0;
magnet_select[0] = 0;
magnet_select[1] = 0;
oled_p = 1;
}
}
break;
default:
{
}
break;
}
}
char disp_new = 0;
uint8_t speed_select = 2; //[0 1 2 3 4]->[很慢、较慢、适中、较快、很快]
uint8_t speed_select_prv = 1;
uint8_t speed_ensure = 0;
uint8_t direc_select = 0;
uint8_t direc_select_prv = 0;
void OLED_Menu_New(void)
{
switch (disp_new)
{
case 0: //初始化
{
tmc5160_operate(0,0);
OLED_Clear();
OLED_ShowCN(0,0,56,0); //正常“匀”第0页
OLED_ShowCN(32,0,57,0); //正常“速”第0页
OLED_ShowCN(64,0,5,0); //正常“测”第0页
OLED_ShowCN(96,0,58,0); //正常“试”第0页
OLED_ShowCN(0,2,57,0); //正常“速”第2页
OLED_ShowCN(20,2,17,0); //正常“度”第2页
speed_set(MEDIUM_SPEED);
OLED_ShowCN(0,4,32,0); //正常“方”第4页
OLED_ShowCN(20,4,33,0); //正常“向”第4页
disp_new++;
}
break;
case 1: //显示内容初始化
{
switch (speed_select)
{
case 0:
{
OLED_ShowCN(50,2,61,1); //反显“很”第2页
OLED_ShowCN(66,2,60,1); //反显“慢”第2页
}
break;
case 1:
{
OLED_ShowCN(50,2,62,1); //反显“较”第2页
OLED_ShowCN(66,2,60,1); //反显“慢”第2页
}
break;
case 2:
{
OLED_ShowCN(50,2,63,1); //反显“适”第2页
OLED_ShowCN(66,2,41,1); //反显“中”第2页
}
break;
case 3:
{
OLED_ShowCN(50,2,62,1); //反显“较”第2页
OLED_ShowCN(66,2,59,1); //反显“快”第2页
}
break;
case 4:
{
OLED_ShowCN(50,2,61,1); //反显“很”第2页
OLED_ShowCN(66,2,59,1); //反显“快”第2页
}
break;
default:
break;
}
speed_select_prv = speed_select;
if(direc_select == 0) OLED_ShowCN(50,4,34,1); //反显“正”第4页
if(direc_select == 1) OLED_ShowCN(50,4,35,1); //反显“反”第4页
direc_select_prv = direc_select;
disp_new++;
}
break;
case 2: //菜单选择,确定后取消反显
{
if(speed_select != speed_select_prv)
{
switch (speed_select)
{
case 0:
{
OLED_ShowCN(50,2,61,1); //反显“很”第2页
OLED_ShowCN(66,2,60,1); //反显“慢”第2页
}
break;
case 1:
{
OLED_ShowCN(50,2,62,1); //反显“较”第2页
OLED_ShowCN(66,2,60,1); //反显“慢”第2页
}
break;
case 2:
{
OLED_ShowCN(50,2,63,1); //反显“适”第2页
OLED_ShowCN(66,2,41,1); //反显“中”第2页
}
break;
case 3:
{
OLED_ShowCN(50,2,62,1); //反显“较”第2页
OLED_ShowCN(66,2,59,1); //反显“快”第2页
}
break;
case 4:
{
OLED_ShowCN(50,2,61,1); //反显“很”第2页
OLED_ShowCN(66,2,59,1); //反显“快”第2页
}
break;
default:
break;
}
speed_select_prv = speed_select;
}
if(direc_select != direc_select_prv)
{
if(direc_select == 0) OLED_ShowCN(50,4,34,1); //反显“正”第4页
if(direc_select == 1) OLED_ShowCN(50,4,35,1); //反显“反”第4页
direc_select_prv = direc_select;
}
if(speed_ensure == 1)
{
speed_ensure = 0;
switch (speed_select)
{
case 0:
{
OLED_ShowCN(50,2,61,0); //正常“很”第2页
OLED_ShowCN(66,2,60,0); //正常“慢”第2页
speed_set(SLOW_SPEED);
}
break;
case 1:
{
OLED_ShowCN(50,2,62,0); //正常“较”第2页
OLED_ShowCN(66,2,60,0); //正常“慢”第2页
speed_set(MEDIUM_SLOW_SPEED);
}
break;
case 2:
{
OLED_ShowCN(50,2,63,0); //正常“适”第2页
OLED_ShowCN(66,2,41,0); //正常“中”第2页
speed_set(MEDIUM_SPEED);
}
break;
case 3:
{
OLED_ShowCN(50,2,62,0); //正常“较”第2页
OLED_ShowCN(66,2,59,0); //正常“快”第2页
speed_set(MEDIUM_FAST_SPEED);
}
break;
case 4:
{
OLED_ShowCN(50,2,61,0); //正常“很”第2页
OLED_ShowCN(66,2,59,0); //正常“快”第2页
speed_set(FAST_SPEED);
}
break;
default:
break;
}
if(direc_select == 0) OLED_ShowCN(50,4,34,0); //正常“正”第4页
if(direc_select == 1) OLED_ShowCN(50,4,35,0); //正常“反”第4页
disp_new++;
}
}
break;
case 3: //控制电机
{
uniform_motion();
if(speed_ensure == 1) //电机停止
{
tmc5160_operate(0,0);
GREEN_ON;
BLUE_ON;
speed_ensure = 0;
disp_new = 1;
}
}
break;
default:
break;
}
}