wangyong9512
发表于 2023-8-19 19:25:58
感谢{:4_174:}
tang01
发表于 2023-8-31 10:12:17
请把汉字取模教程图片贴上
电子DIY小家
发表于 2023-8-31 11:24:10
tang01 发表于 2023-8-31 10:12
请把汉字取模教程图片贴上
1楼图片有取模软件的设置 的参数啊
pangshijz
发表于 2023-12-14 08:31:37
学习了,感谢分享
pangshijz
发表于 2023-12-15 08:25:03
感谢分享
bogejiayou
发表于 2023-12-15 14:29:30
感谢分享,飞跑去拿手上的开发板试试。
浦江一水
发表于 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)));
}
再上机试试看...未必正确,仅供参考....
myliuyu
发表于 2023-12-24 22:09:38
mark一下,虽然暂时用不上
NTC
发表于 2023-12-25 20:38:04
浦江一水 发表于 2023-12-24 21:07
"电子DIY小家"老师的OLED12864驱动,写得简练, 算法巧妙, 值得学习,十分感谢.
验证,正确
Rs428
发表于 2024-2-7 21:35:03
大佬厉害,今天移植到stc8h 硬件spi上面看看,改了一点点适配sh1106,到时候发出来会附上此贴地址