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,到时候发出来会附上此贴地址
页: 1 2 [3] 4 5 6 7 8 9
查看完整版本: 32G12K128驱动OLED12864,SPI或I2C两种方式