349|1

8

帖子

0

资源

一粒金砂(中级)

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

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

一,上篇使用了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。

赞赏

1

查看全部赞赏


回复

7548

帖子

20

资源

版主

分析的很好

 

个人签名虾扯蛋

回复
您需要登录后才可以回帖 登录 | 注册

关闭
站长推荐上一条 1/5 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表