找回密码
 立即注册
楼主: 电子DIY小家

32G12K128驱动OLED12864,SPI或I2C两种方式

  [复制链接]

3

主题

47

回帖

187

积分

注册会员

积分
187
发表于 2023-8-19 19:25:58 | 显示全部楼层
感谢
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-08-06 14:54:39

0

主题

26

回帖

115

积分

注册会员

积分
115
发表于 2023-8-31 10:12:17 | 显示全部楼层
请把汉字取模教程图片贴上

点评

1楼图片有取模软件的设置 的参数啊  详情 回复 发表于 2023-8-31 11:24
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8088

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8088
QQ
发表于 2023-8-31 11:24:10 | 显示全部楼层
tan*** 发表于 2023-8-31 10:12
请把汉字取模教程图片贴上

1楼图片有取模软件的设置 的参数啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:420
  • 最近打卡:2025-06-16 09:00:29

10

主题

214

回帖

1471

积分

金牌会员

积分
1471
发表于 2023-12-14 08:31:37 | 显示全部楼层
学习了,感谢分享
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:420
  • 最近打卡:2025-06-16 09:00:29

10

主题

214

回帖

1471

积分

金牌会员

积分
1471
发表于 2023-12-15 08:25:03 | 显示全部楼层
感谢分享
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-09-24 11:06:27

2

主题

26

回帖

194

积分

注册会员

积分
194
发表于 2023-12-15 14:29:30 | 显示全部楼层
感谢分享,飞跑去拿手上的开发板试试。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:536
  • 最近打卡:2025-06-16 08:31:26

31

主题

351

回帖

3789

积分

荣誉版主

积分
3789
发表于 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)));
        }        


再上机试试看...  未必正确,  仅供参考....



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:237
  • 最近打卡:2025-06-15 02:42:53

8

主题

84

回帖

902

积分

高级会员

积分
902
发表于 2023-12-24 22:09:38 | 显示全部楼层
mark一下,虽然暂时用不上
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:497
  • 最近打卡:2025-06-16 08:06:12

10

主题

130

回帖

710

积分

高级会员

积分
710
发表于 2023-12-25 20:38:04 | 显示全部楼层
浦江*** 发表于 2023-12-24 21:07
"电子DIY小家"老师的OLED12864驱动,写得简练, 算法巧妙, 值得学习,十分感谢.

验证,正确


微信图片_20231225203521.jpg 微信图片_20231225203536.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2024-2-7 21:35:03 | 显示全部楼层
大佬厉害,今天移植到stc8h 硬件spi上面看看,改了一点点适配sh1106,到时候发出来会附上此贴地址
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 03:41 , Processed in 0.161795 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表