int main(void)
{
OLED_Init();//OLED初始化
MPU6050_Init(); //MPU6050初始化
Timer4_Init();
while(1)
{
OLED_ShowSignedNum(1,1,Angle_X_Final,5);
OLED_ShowSignedNum(1,8,Angle_Y_Final,5);
OLED_ShowSignedNum(2,1,aacx,5);
OLED_ShowSignedNum(3,1,aacy,5);
OLED_ShowSignedNum(4,1,aacz,5);
OLED_ShowSignedNum(2,8,gyrox,5);
OLED_ShowSignedNum(3,8,gyroy,5);
OLED_ShowSignedNum(4,8,gyroz,5);
}
}
定时器每0.02秒进行一次卡尔曼运算,卡尔曼函数中调用了i2c读取mpu6050的函数,将返回值交由卡尔曼运算,主函数循环中是i2c通信的OLED,当使用有符号显示函数是一切正常,有符号显示函数如下
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{
uint8_t i;
uint32_t Number1;
if (Number >= 0)
{
OLED_ShowChar(Line, Column, '+');
Number1 = Number;
}
else
{
OLED_ShowChar(Line, Column, '-');
Number1 = -Number;
}
for (i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
}
}
但是数据是含小数的,于是我写的了个小数显示的函数
void OLED_ShowDecimelNum(uint8_t Line, uint8_t Column, float Number, uint8_t Length, uint8_t DecLength)
{
uint8_t i;
float Number1;
uint32_t Number_Temp = 0,DecNumber_Temp = 0;
if (Number >= 0)
{
OLED_ShowChar(Line, Column, '+');
Number1 = Number;
}
else
{
OLED_ShowChar(Line, Column, '-');
Number1 = -Number;
}
//整数部分
Number_Temp = (uint32_t)Number1;
for (i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i + 1, Number_Temp / OLED_Pow(10, Length - i - 1) % 10 + '0');
}
//小数点
OLED_ShowChar(Line, Column + Length + 1, '.');
//小数部分
DecNumber_Temp = (uint32_t)((Number1 - Number_Temp)*(OLED_Pow(10,DecLength)));
for (i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i + Length + 1 + 1, DecNumber_Temp / OLED_Pow(10, DecLength - i - 1) % 10 + '0');
}
}
结果运行之后就卡住了,想了好久都不明白为什么?
单纯运行这个小数显示函数又是正常的,这个问题困扰了我两天[哭哭]