【ESK32-360测评】+LCD库函数BUG测评反馈

szkei   2020-8-14 18:59 楼主

一,上篇使用了LCD库函数显示奥运五色环及合泰测评的图片。帖子链接。

二,函数坐标顺序位置对调。

      继续使用后发现上个测评所用到以下的函数的坐标顺序是对调,出来效果是X,Y坐标对调。    

    1,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ; //画半径参数的圆
    2,void  LCD_LineDraw (u32 X_Location, u32 Y_Location, u32 Length, u32 Direction) ;//画线

    3,void  LCD_PicDraw (u8 X_Location, u16 Y_Location, u8 Height, u16 Width, uc8 *Pptr) ;//显示图片
    4, void  LCD_RectDraw (u32 X_Location, u32 Y_Location, u32 Height, u32 Width) //画方框

三,各个函数输入不同坐标显示。

   1,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ; //画半径参数的圆

        LCD_CircleDraw (50,50,50);

        image-20200814191150-1.png

        LCD_CircleDraw (100,50,50);

      image-20200814191236-2.png

        LCD_CircleDraw (50,100,50);

image-20200814191318-3.png

以上三个输入坐标,只有第一个不察觉到,第二及第三的从标是Y,X的方向显示了。

 2,void  LCD_LineDraw (u32 X_Location, u32 Y_Location, u32 Length, u32 Direction) ;//画线

LCD_LineDraw(0,0,100,0);

image-20200814215959-1.png

LCD_LineDraw(100,0,100,0);

image-20200814220020-2.png

LCD_LineDraw(0,100,100,0);

image-20200814220217-4.png

 

3,void  LCD_PicDraw (u8 X_Location, u16 Y_Location, u8 Height, u16 Width, uc8 *Pptr) ;//显示图片
4, void  LCD_RectDraw (u32 X_Location, u32 Y_Location, u32 Height, u32 Width) //画方框

这二个同样显示显示效果坐标同上二个一样,在此省略。

四,void  LCD_CircleDraw (u32 X_Location, u32 Y_Location, u32 Radius) ,存在严重的BUG。

   1,当Radius输入为0时,存在以下二种情况。

   2,不在while等循环体内,无法正常显示。屏幕没有显示,白色底图一张。

image-20200814220941-1.png 3,当在循环体内,显示杂乱,成一条条直线,直至布满整个屏幕。

image-20200814221148-2.png image-20200814221208-3.png image-20200814221224-4.png

4,进入LCD_CircleDraw函数内,代码如下:

/*********************************************************************************************************//**
  * @brief  Display a circle.
  * @param  X_Location: specify the X position.
  * @param  Y_Location: specify the Y position.
  * @param  Radius: radius of the circle.
  * @retval None
  ***********************************************************************************************************/
void LCD_CircleDraw(u32 X_Location, u32 Y_Location, u32 Radius)
{
  s32  DV;  // Decision Variable
  u32  X_Value;      // Current X Value
  u32  Y_Value;      // Current Y Value
	

  DV = 3 - (Radius << 1);
  X_Value = 0;
  Y_Value = Radius;

  while (X_Value <= Y_Value)
  {
    LCD_StarterSet(X_Location + X_Value, Y_Location + Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location + X_Value, Y_Location - Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - X_Value, Y_Location + Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - X_Value, Y_Location - Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location + Y_Value, Y_Location + X_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location + Y_Value, Y_Location - X_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - Y_Value, Y_Location + X_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - Y_Value, Y_Location - X_Value);
    LCD_WriteRAMWord(Color_Text);

    if (DV < 0)
    {
      DV += (X_Value << 2) + 6;
    }
    else
    {
      DV += ((X_Value - Y_Value) << 2) + 10;
      Y_Value--;
    }
    X_Value++;
  }
}

5,查看分析,发现是Y_Value--,没有先判断为是否为0。如果是0,执行后Y_Value的值等于 2^32 - 1 = 4294967295,一直不断循环执行下去。只要先判断不为0时,才能执行Y_Value--,这样才不会一直循环执行下去。修改代码如下:

/*********************************************************************************************************//**
  * @brief  Display a circle.
  * @param  X_Location: specify the X position.
  * @param  Y_Location: specify the Y position.
  * @param  Radius: radius of the circle.
  * @retval None
  ***********************************************************************************************************/
void LCD_CircleDraw(u32 X_Location, u32 Y_Location, u32 Radius)
{
  s32  DV;  // Decision Variable
  u32  X_Value;      // Current X Value
  u32  Y_Value;      // Current Y Value
	

  DV = 3 - (Radius << 1);
  X_Value = 0;
  Y_Value = Radius;

  while (X_Value <= Y_Value)
  {
    LCD_StarterSet(X_Location + X_Value, Y_Location + Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location + X_Value, Y_Location - Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - X_Value, Y_Location + Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - X_Value, Y_Location - Y_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location + Y_Value, Y_Location + X_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location + Y_Value, Y_Location - X_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - Y_Value, Y_Location + X_Value);
    LCD_WriteRAMWord(Color_Text);

    LCD_StarterSet(X_Location - Y_Value, Y_Location - X_Value);
    LCD_WriteRAMWord(Color_Text);

    if (DV < 0)
    {
      DV += (X_Value << 2) + 6;
    }
    else
    {
      DV += ((X_Value - Y_Value) << 2) + 10;
			if(Y_Value > 0){ //增加Y_Value非0判断
				Y_Value--;
			}
    }
    X_Value++;
  }
}

6,修正代码后运行正常,如下图。

image-20200814223720-1.png

五,建议逻辑正确性。

   在进行加减法操作时,一定要加上判断及执行结果界限值,否则容易人为错误引入BUG。

本帖最后由 szkei 于 2020-8-14 22:41 编辑

回复评论 (1)

分析的很好

 

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2020-8-15 17:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复