一,上篇使用了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);
LCD_CircleDraw (100,50,50);
LCD_CircleDraw (50,100,50);
以上三个输入坐标,只有第一个不察觉到,第二及第三的从标是Y,X的方向显示了。
2,void LCD_LineDraw (u32 X_Location, u32 Y_Location, u32 Length, u32 Direction) ;//画线
LCD_LineDraw(0,0,100,0);
LCD_LineDraw(100,0,100,0);
LCD_LineDraw(0,100,100,0);
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等循环体内,无法正常显示。屏幕没有显示,白色底图一张。
3,当在循环体内,显示杂乱,成一条条直线,直至布满整个屏幕。
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,修正代码后运行正常,如下图。
五,建议逻辑正确性。
在进行加减法操作时,一定要加上判断及执行结果界限值,否则容易人为错误引入BUG。
本帖最后由 szkei 于 2020-8-14 22:41 编辑