TA的每日心情 | 开心 昨天 07:56 |
---|
签到天数: 150 天 [LV.7]常住居民III
高级会员
- 积分
- 690
|
发表于 2023-12-24 21:07:41
|
显示全部楼层
"电子DIY小家"老师的OLED12864驱动,写得简练, 算法巧妙, 值得学习,十分感谢.
然而在 OLED_BuffShowLine() 画线函数中, 感觉算法有点值得商榷之处, 斗胆说说.....
源代码此函数中是这样写的: 原状复制粘贴一下....
//========================================================================
// 函数名称: OLED_BuffShowPoint
// 函数功能: OLED显示一条线
// 入口参数: @x1:x起点 @y1:y起点 @x2:x终点 @y2:y终点
// 函数返回: 无
// 当前版本: VER1.0
// 修改日期: 2023 - 6 - 7
// 当前作者: ZCF
// 其他备注: 写入的是缓存,需要电调用OLED_BuffShow才能显示出来
//========================================================================
void OLED_BuffShowLine( unsigned char x1, unsigned char y1, unsigned char x2,unsigned char y2)
{
unsigned char x,y;
if( x1>x2 )
{
x=x1;x1=x2;x2=x;
y=y1;y1=y2;y2=y;
}
if(x1!=x2)
{
for( x = x1; x <= x2; x++ )
{
if( y2>y1 )
OLED_BuffShowPoint(x, (unsigned char)(y1+(u16)(y2-y1)*(u16)x/(u16)(x2-x1)));
else
OLED_BuffShowPoint(x, (unsigned char)(y1-(u16)(y1-y2)*(u16)x/(u16)(x2-x1)));
}
}
else
{
if( y1>y2 )
{
for( y = y2; y <= y1; y++ )
OLED_BuffShowPoint(x1, y);
}
else
{
for( y = y1; y <= y2; y++ )
OLED_BuffShowPoint(x1, y);
}
}
}
例程中有段演示程序,体现此函数的用法:
//-----------------------------------------显示线-----------------------------------------
OLED_BuffClear(); //清除全部缓存
OLED_BuffShowString(32,0,"画线测试"); //显示数据
OLED_BuffShow(); //将缓存写入显示屏显示
for( i=0;i<6;i++ ) //循环6次
{
OLED_BuffShowLine(4,16+8*i,124,16+8*i); //显示横着6条线
OLED_BuffShow(); //刷新显示
delay_ms(100);
}
for( i=0;i<16;i+=1 ) //循环16次
{
OLED_BuffShowLine(8*i+4,16,8*i+4,56); //显示16条数线
OLED_BuffShow(); //刷新显示
delay_ms(100);
}
运行正常.. 看不出问题....
如果在主函数main中的while(1)在之前. 加入这样几行代码, 用仿真跟踪单步执行试试看....
......
OLED_BuffClear(); //清屏...
OLED_BuffShow(); //刷新显示...
OLED_BuffShowLine(0,0,127,63); //从起点(0,0)到终点(127,63) 画一条斜线...
OLED_BuffShow(); //刷新显示...正常....
OLED_BuffShowPoint(25,25); //在屏幕的(25,25)位置显示一个点, 为接下来所画斜线作为起点....
OLED_BuffShow(); //刷新显示...正常....
OLED_BuffShowLine(25,25,127,63); //从起点(25,25)到终点(127,63) 再画一条斜线...
OLED_BuffShow(); //刷新显示...问题就来了.... 发现: 起点既不在(25,25) 终点也不在(127,63)...
......
很奇怪吧? 感觉是算法问题吧?
经推敲验证发现: 只要x1==x2 或 y1==y2 即画水平线或垂直线, 是没有问题的,
恰巧, 演示中是画表格,不是水平线,就是垂直线. 所以很正常....
而且, 只要起点 x1=0 也没有问题. 所以第一条对角线, 正常显示...
但如果用此函数在其它起始坐标点画斜线的话, 估计大概率是出错的....
如果感觉这是个问题需要解决的话, 那又如何解决呢?
我的想法是这样稍稍修改一下: ( 注意以上和以下源代码中的红色字体部分.... )
for( x = 0; x <= (x2 - x1); x++ )
{ if( y2>y1 )
OLED_BuffShowPoint(x1+x, (unsigned char)(y1+(u16)(y2-y1)*(u16)x/(u16)(x2-x1)));
else
OLED_BuffShowPoint(x1+x, (unsigned char)(y1-(u16)(y1-y2)*(u16)x/(u16)(x2-x1)));
}
再上机试试看... 未必正确, 仅供参考....
|
|