标题: 0.96寸IIC12864OLED最强单片机例程,通俗易懂,方便引用 [打印本页]

作者: 854100995    时间: 2018-11-16 11:07
标题: 0.96寸IIC12864OLED最强单片机例程,通俗易懂,方便引用
此例程在该模块赠送资料的基础上,新增
32x32字体显示函数,


64x64字体显示函数,

文字和数字反码显示函数(可用于设置位置显示)

变量显示示例(可用于显示程序中定义的变化的变量)

十进制数转字符串并显示示例



附件中共两个程序,一个用于程序存储器较小的单片机上使用(如STC89C52),

一个用于程序存储器13K以上的单片机上使用。

此程序亲测可用于STC全系列单片机(12T和STC1T),STC1T显示时刷新速度更快。


IMG_20181116_104431.jpg (753.34 KB, 下载次数: 194)

IMG_20181116_104431.jpg

IMG_20181116_104438.jpg (739.87 KB, 下载次数: 110)

IMG_20181116_104438.jpg

IMG_20181116_104441.jpg (718.23 KB, 下载次数: 107)

IMG_20181116_104441.jpg

IMG_20181116_104443.jpg (728.71 KB, 下载次数: 113)

IMG_20181116_104443.jpg

IMG_20181116_104531.jpg (696.28 KB, 下载次数: 132)

IMG_20181116_104531.jpg

IMG_20181116_104448.jpg (694.54 KB, 下载次数: 133)

IMG_20181116_104448.jpg

IMG_20181116_104452.jpg (734 KB, 下载次数: 124)

IMG_20181116_104452.jpg

IMG_20181116_104459.jpg (729.38 KB, 下载次数: 115)

IMG_20181116_104459.jpg

IMG_20181116_104505.jpg (714.69 KB, 下载次数: 113)

IMG_20181116_104505.jpg

IMG_20181116_104507.jpg (713.77 KB, 下载次数: 138)

IMG_20181116_104507.jpg

0.png (38.42 KB, 下载次数: 120)

0.png

0.png (14.92 KB, 下载次数: 103)

0.png

0.96寸IIC12864OLED最强例程.zip

192.84 KB, 下载次数: 1161, 下载积分: 黑币 -5


作者: luo713ok    时间: 2018-11-30 13:20
谢谢楼主分享
作者: 1113634577    时间: 2018-12-4 21:54
学习参考
作者: 原来如鸟    时间: 2019-1-2 18:04
谢谢分享,我已经下载学习中,感谢。
作者: SengChuary    时间: 2019-1-2 18:49
好教材,支持!!
作者: hellowC8051    时间: 2019-1-29 08:55
谢谢楼主分享
作者: bg4esa    时间: 2019-2-26 21:07
不错,谢谢分享
作者: johnsbark    时间: 2019-3-23 08:25
谢谢分享,好东西啊
作者: a1357787200    时间: 2019-4-6 13:43
刚好学学
作者: qiuzf    时间: 2019-5-7 17:35
谢谢楼主分享
作者: 陈必成    时间: 2019-5-7 20:05
啥都别说了,就佩服你们这样的人
作者: 陈仕祥    时间: 2019-6-1 09:33
先谢楼主
作者: luhshuay    时间: 2019-6-15 23:00
啥都别说了,就佩服你们这样的人
作者: zhongzl728    时间: 2019-7-20 18:48
谢谢楼主分享
作者: 3760609865    时间: 2019-7-21 14:58
谢谢分享,下来学习学习。
作者: 3760609865    时间: 2019-7-21 15:00
谢谢分享,下来学习学习。
作者: asd安德森    时间: 2019-8-10 13:09
谢谢分享
作者: ahweixiao    时间: 2019-8-23 22:00
这个能用来测试超声波么
作者: whsbk    时间: 2019-9-10 09:50
谢谢分享,iic只要两个数据线可以节省io,正在找stc单片机驱动iic的方法,感谢分享
作者: zxy2266    时间: 2019-9-10 21:11
不知道楼主搞过SSD1305没有,这个芯片的那个宝很少
作者: 3078    时间: 2019-9-16 14:14
xi谢谢楼主分享 拿来学习
作者: ljj200526    时间: 2019-9-17 21:56
下来学习一下,谢谢分享!
作者: 6467778399    时间: 2019-9-26 14:39


学习学习备用
作者: lyl_420819    时间: 2019-10-1 20:29
好资料,下载学习,谢谢分享。
作者: quhong0411    时间: 2019-10-15 16:02
感谢分享,学习中。
作者: caesarvan    时间: 2019-10-24 02:35
谢谢楼主分享
作者: 冷月枫    时间: 2019-10-28 15:51
STC8a8k怎么用不了啊

作者: z805502494    时间: 2019-12-19 21:56
好好,太好了谢谢
作者: waerdeng    时间: 2019-12-20 19:40

不錯,可以分享一下設計,學習一下
作者: adadad123    时间: 2019-12-28 23:30
谢谢楼主分享
作者: 米花卷    时间: 2019-12-29 13:42
虽然没看懂但也觉得不错
作者: bg4rfb    时间: 2019-12-30 12:32
谢谢分享!
作者: hfsdage    时间: 2020-4-1 20:26
感谢楼主分享。
作者: shiyb    时间: 2020-4-1 23:50
多谢,已经下载,学习中
作者: 太阳黑子1    时间: 2020-4-2 17:13
非常好啊,谢谢!
作者: david1011    时间: 2020-4-2 17:37
冷月枫 发表于 2019-10-28 15:51
STC8a8k怎么用不了啊

我也用不了,你现在可以了吗

作者: xmfjfhcel    时间: 2020-4-3 07:57
这个程序我用STC589C52, 会卡死, 我卡死的地方在于SPRINTF这个函数。去掉就可以了。但这个的精华个人觉得就在于用了SPRINTF函数,我不明白为啥我用这个SPRINTF会卡死。 没办法,只好找的这个论坛别的可用的。 程序差不多。这个屏我看着高手们做的程序都头晕,他们太历害了,努力向他们学……
作者: 向日葵单片机    时间: 2020-4-12 09:28
谢谢分享
作者: 51heihuo    时间: 2020-4-12 20:27
谢谢分享,在学习这个屏幕,小字体都搞定了,自己尝试写个大字体32×32的,一直乱码。下载下来学习一下!
作者: yyzf998    时间: 2020-5-2 11:20
楼主强大!威武!为你点赞!
作者: pangjineng    时间: 2020-5-21 12:01
"可用于显示程序中定义的变化的变量"
读起来好别扭
作者: 瓶子    时间: 2020-5-21 13:05
下载一份学习一下
作者: liqingyong    时间: 2020-5-21 15:14
谢谢分享
作者: hhdsdy    时间: 2020-5-22 00:19
下载一个看看,谢谢分享!
作者: wwh2382    时间: 2020-5-22 11:08
怎么图片打开得很慢
作者: hhdsdy    时间: 2020-5-30 16:19
之前没有用过OLED,在淘宝下单一个0.96寸(驱动芯片:SH1106(可兼容SSD1306))的时候刚好看到这个帖子,所以干脆就不用卖家提供的测试程序而直接用这个的,OLED一次点亮,但是最后面有一、两列竖线,8页都有,本以为是程序没有处理好(故意设坑的程序也是有遇到的),但看了下程序没有问题,帖子里也没人反应有这个现象,难道是OLED生成就这样的?但很快就否定了。
上卖家页面看带图的评价里是正常的,那就肯定是程序的问题,翻看到另一个卖家里的介绍,里面的一个内容让我注意到了(就不把图片里的文字打出来了,大家自己看图),这个说得很明白,那就百度查找翻看指令,好像没有列偏移的,直接改设置坐标的程序,整行显示的正常了,显示半行的后面还有,肯定是清屏的还需要改,于是又改了全屏、清屏、初始化里的内容,这才一切正常。



之间百度指令时,设置列地址时,有的说列地址是1到128,也有的认为是0到127(针对1306驱动),有这争论是因为设置坐标子函数的最后一句 OLED_WrCmd((x&0x0f)|0x01);     对 |0x01 有人发出疑问,之前没看指令介绍时我也不理解,看了指令认为是编写错误,指令里并不要求列地址低四位里的D0必须为1,那么|0x01就是画蛇添足,也满足不了加一的目的(D0为0有效果,为1就不变),这个欢迎大家讨论一下。我是认为列地址是0到127的,先不说都是习惯地址从0开始的,就大家初始化时列地址低四位是送0x00而不是0x01就能说明问题,而且英文版里的资料也是这样写的,虽然我看不懂英文。     刚才还说到了全屏和清屏子函数,里面的是OLED_WrCmd(0x01);  也就是说列地址低四位是送0X01,而不是0X00,真有点自相矛盾啊

老眼昏花了,对于0.96寸的6*8字符都看不清了,就不对是0X00还是0X01进行验证了,一列的差别对我来说真的不容易看到,希望有人有兴趣验证一下。另外,楼主既然挂上最强的例程,先不说这几个还未定论的数据,至少程序要能选择是SH1106还是SSD1306的驱动,免得驱动不同还得改好几个地方。

再次谢谢楼主分享的程序!



作者: ii11nnocent    时间: 2020-7-23 16:05
谢谢楼主分享,单片机小白第一次接触这个屏幕,正在学习中。
作者: 这是个用户名    时间: 2020-8-31 13:24
有大佬可以告知一下32*32的字模怎么取吗?自己取的都是乱码,楼主取好的就可以用

作者: 杰瑶电子    时间: 2020-11-10 16:19
可以使用,就是不明白特殊字体怎么弄的
作者: 564988996    时间: 2021-2-25 16:23
楼主强大!威武!为你点赞
作者: guo_hit    时间: 2021-4-27 15:46
这个程序我用STM32, 会卡死, 我卡死的地方在于SPRINTF这个函数。
作者: engineerarui    时间: 2021-4-27 17:24
浅谈LCD、OLED、TFT取模及其程序开发的算法取舍https://blog.csdn.net/yagnruinihao/article/details/47133455

单片机控制OLED12864显示屏之模块化编程
https://blog.csdn.net/yagnruinihao/article/details/115842157
作者: yygdzjs    时间: 2021-5-1 21:17
在某一个宝下单一个0.96寸(驱动芯片:SSD1306).
遇到了 白色条.
找了一段时间,不知道什么原因.
下载,测试一下. 谢谢!
作者: 无聊到处逛    时间: 2021-5-2 20:48
刚好要用到,谢谢楼主了
作者: yygdzjs    时间: 2021-5-9 15:48
关于   最后一句 OLED_WrCmd((x&0x0f)|0x01);  引起的第1竖显示问题解决了.
未解决问题点:  全部点显示  后 ,再全部灭  有 操作时留有  "锯齿余晖"  问题, 请教一下大家

解决问题点:
//问题点1: OLED12864 无显示
  这个程序是 STC89C52 的程序 ,
  1.1 IO修改
    //-STC89C52
        sbit SCL=P1^3; //串行时钟
        sbit SDA=P1^2; //串行数据
     //-STC8H8K 修改后
        sbit SCL=P5^1; //串行时钟
        sbit SDA=P5^0; //串行数据
    加
        //-STC8H8K   频率设置 5.55296Mhz        
        P5M1 &= 0xFE;   P5M0 &= 0xFE;;   //设置为准双向口  P5.0
        P5M1 &= 0xFD;   P5M0 &= 0xFD;;   //设置为准双向口  P5.1        
  1.2现在测试是 STC8H8K  单片机,烧录时内部晶振  改5.5296Mhz.
  
//问题点2: OLED12864 第1列显示不正常
  2.1 修改  LQ12864.h  3个函数
//        // *********************OLED 设置坐标************************************
//        void OLED_Set_Pos(unsigned char x, unsigned char y)
//        {
//                OLED_WrCmd(0xb0+y);
//                OLED_WrCmd(((x&0xf0)>>4)|0x10);
//        //        OLED_WrCmd((x&0x0f)|0x01);  //列的第1行 错误,无法清零
//                OLED_WrCmd(x&0x0f);        //列的第1行 错误,无法清零  修改
//        }
//        // *********************OLED全屏************************************
//        void OLED_Fill(unsigned char bmp_dat)
//        {
//                unsigned char y,x;
//                for(y=0;y<8;y++)
//                {
//                        OLED_WrCmd(0xb0+y);
//        //                OLED_WrCmd(0x01);  //列的第1行 错误,无法清零  注销
//                        
//                        OLED_WrCmd(0x10);
//                        for(x=0;x<X_WIDTH;x++)
//                        OLED_WrDat(bmp_dat);
//                }
//        }
//        // *********************OLED复位************************************
//        void OLED_CLS(void)
//        {
//                unsigned char y,x;
//                for(y=0;y<8;y++)
//                {
//                        OLED_WrCmd(0xb0+y);
//        //                OLED_WrCmd(0x01);  //列的第1行 错误,无法清零  注销
//                        OLED_WrCmd(0x10);
//                        for(x=0;x<X_WIDTH;x++)
//                        OLED_WrDat(0);
//                }
//        }  
//问题点3: OLED12864 时钟只能6Mhz左右才有显示,修改后 5~35MHz 可以
  3.1 修改  LQ12864.h  3个函数(IO操作加入3个 空操作指令) ,增加系统带头文件
                void IIC_Start();
                void IIC_Stop();
                void Write_IIC_Byte(unsigned char IIC_Byte);

4.未解决问题点:  全部点显示  后 ,再全部灭  有 操作时留有  "锯齿余晖"  问题, 请教一下大家

while(1)
        {
                OLED_Fill(0xff); //屏全亮
                delay(4000);
                OLED_Fill(0x00); //屏全灭  操作时留有  "锯齿余晖"  问题:
                delay(4000);
                OLED_P16x16Ch(24,0,1);
                OLED_P16x16Ch(40,0,2);
                OLED_P16x16Ch(57,0,3);
                OLED_P16x16Ch(74,0,4);
                OLED_P16x16Ch(91,0,5);
                for(i=0; i<8; i++)//通过点整显示汉字 -- i表示字表数组的位置
                {
//                        OLED_P16x16Ch(i*16,0,i);
                         OLED_P16x16Ch(i*16,2,i+8);
                         OLED_P16x16Ch(i*16,4,i+16);
                         OLED_P16x16Ch(i*16,6,i+24);
                }
                delay(4000);
                OLED_CLS();//清屏

                OLED_P8x16Str(0,0,"HelTec");//第一行 -- 8x16的显示单元显示ASCII码
                OLED_P8x16Str(0,2,"OLED Display");
                OLED_P8x16Str(0,4,"helte");
                OLED_P6x8Str(0,6,"12345");
                OLED_P6x8Str(0,7,"heltec");
                delay(4000);
                OLED_CLS();

                Draw_BMP(0,0,128,8,BMP1);  //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)
                delay(8000);
                Draw_BMP(0,0,128,8,BMP2);
                delay(8000);
        }




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1