#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.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间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); //??????�???? SSD1306_WriteCmd (0x10); //??????�???? 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: //初始化 { 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; } }