找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9906|回复: 22
打印 上一主题 下一主题
收起左侧

51单片机0.96寸OLED12864(IIC接口和SPI接口)模块测试程序

  [复制链接]
跳转到指定楼层
楼主
模块如图


压缩包中共有三个程序:
分别为:软件IIC,软件SPI和硬件SPI

软件IIC用于IIC接口的OLED模块
使用STC89C516单片机和STC12C5A60S2单片机,12MHz晶振,测试通过

软件SPI和硬件SPI用于SPI接口的OLED模块
软件SPI使用STC89C516单片机和STC12C5A60S2单片机,12MHz晶振,测试通过
硬件SPI使STC12C5A60S2单片机,12MHz晶振,测试通过
注意:在用硬件SPI程序时留意单片机是否有硬件SPI(STC89C516单片机无硬件SPI)

程序功能:
1.显示128*64图片,图片可以列行取模和列取模,可反色显示
2.支持汉字英文混合显示,汉字应先用取模软件取模,,可反色显示
注意:汉字只可以用列行取模,取模后数据存放在OLED文件夹中的text.h文件中





单片机源程序如下:
  1. #include <intrins.h>
  2. #include "public.h"
  3. #include "OLED.h"
  4. #include "ASCII.h"
  5. #include "text.h"
  6. #include "port.h"

  7. //使用位操作加快SPI读写速度
  8. u8 bdata Byte_data;
  9. sbit Byte_data7=Byte_data^7;
  10. sbit Byte_data6=Byte_data^6;
  11. sbit Byte_data5=Byte_data^5;
  12. sbit Byte_data4=Byte_data^4;
  13. sbit Byte_data3=Byte_data^3;
  14. sbit Byte_data2=Byte_data^2;
  15. sbit Byte_data1=Byte_data^1;
  16. sbit Byte_data0=Byte_data^0;

  17. void OLED_delay500ms()//12.000MHz
  18. {
  19.         u8 i,j,k;

  20.         i=23;
  21.         j=205;
  22.         k=120;
  23.         do
  24.         {
  25.                 do
  26.                 {
  27.                         while (--k);
  28.                 }while (--j);
  29.         }while (--i);
  30. }

  31. //MCU向OLED写入一个字节(字节数据,选择字节为命令还是数据)
  32. void MCU_write_OLED_Byte(u8 Byte,u8 command_or_data)
  33. {
  34.         OLED_DC=command_or_data;
  35.         OLED_CS=0;
  36.         OLED_MOSI=1;
  37.         Byte_data=Byte;
  38.         OLED_CLK=0;OLED_MOSI=Byte_data7;OLED_CLK=1;
  39.         OLED_CLK=0;OLED_MOSI=Byte_data6;OLED_CLK=1;
  40.         OLED_CLK=0;OLED_MOSI=Byte_data5;OLED_CLK=1;
  41.         OLED_CLK=0;OLED_MOSI=Byte_data4;OLED_CLK=1;
  42.         OLED_CLK=0;OLED_MOSI=Byte_data3;OLED_CLK=1;
  43.         OLED_CLK=0;OLED_MOSI=Byte_data2;OLED_CLK=1;
  44.         OLED_CLK=0;OLED_MOSI=Byte_data1;OLED_CLK=1;
  45.         OLED_CLK=0;OLED_MOSI=Byte_data0;OLED_CLK=1;
  46.         OLED_MOSI=1;
  47.         OLED_CS=1;
  48. }

  49. //光标的位置,0到7行,0到127列(行,列)
  50. void OLED_cursor_location(u8 row,u8 column)
  51. {
  52.         MCU_write_OLED_Byte(0xB0+row,OLED_COMMAND);//设置行(0~7)
  53.         MCU_write_OLED_Byte(0x10|(column&0xF0)>>4,OLED_COMMAND);//设置显示位置大列(0~7)
  54.         MCU_write_OLED_Byte(0x00|(column&0x0F),OLED_COMMAND);//设置显示位置小列(0~7)
  55. }

  56. //设置内存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  57. void OLED_set_memory_address_mode(u8 mode)
  58. {
  59.         MCU_write_OLED_Byte(0x20,OLED_COMMAND);//设置内存地址模式(使用水平地址模式或垂直地址模式)
  60.         MCU_write_OLED_Byte(mode,OLED_COMMAND);//水平地址模式:0x00,垂直地址模式:0x01,页地址模式:0x02
  61.         MCU_write_OLED_Byte(0x21,OLED_COMMAND);//设置显示位置列初始地址和终止地址
  62.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//列初始地址
  63.         MCU_write_OLED_Byte(0x7F,OLED_COMMAND);//列终止地址
  64.         MCU_write_OLED_Byte(0x22,OLED_COMMAND);//设置显示位置页初始地址和终止地址
  65.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//页初始地址
  66.         MCU_write_OLED_Byte(0x07,OLED_COMMAND);//页终止地址
  67. }

  68. //清屏
  69. void OLED_clear()
  70. {  
  71.         u16 i;
  72.         for(i=0;i<1024;++i) MCU_write_OLED_Byte(0x00,OLED_DATA);
  73. }

  74. //打印BMP图片(图片数组,选择图片的取模方式(水平取模:0x00或垂直取模:0x01),是否反色(填0或1))
  75. void OLED_print_BMP(u8 *p,u8 mode,u8 invert_color)
  76. {
  77.         u16 i;
  78.         OLED_set_memory_address_mode(mode);
  79.         if(invert_color) for(i=0;i<1024;++i) MCU_write_OLED_Byte(~*(p+i),OLED_DATA);
  80.         else for(i=0;i<1024;++i) MCU_write_OLED_Byte(*(p+i),OLED_DATA);
  81. }

  82. //OLED打印单个字符(行(0到3),列(0到15),字符,是否反色(填0或1))
  83. void OLED_print_char(u8 row,u8 column,u8 _char,u8 invert_color)
  84. {
  85.         u8 i;
  86.         if(invert_color)
  87.         {
  88.                 //光标的位置,0到7行,0到127列(行,列)
  89.                 OLED_cursor_location(2*row,8*column);
  90.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(~ASCII[_char-32][i],OLED_DATA);//因为ASCII码0到31位去除了,所以减32
  91.                 //光标的位置,0到7行,0到127列(行,列)
  92.                 OLED_cursor_location(2*row+1,8*column);
  93.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(~ASCII[_char-32][i+8],OLED_DATA);//因为ASCII码0到31位去除了,所以减32
  94.         }
  95.         else
  96.         {
  97.                 //光标的位置,0到7行,0到127列(行,列)
  98.                 OLED_cursor_location(2*row,8*column);
  99.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(ASCII[_char-32][i],OLED_DATA);//因为ASCII码0到31位去除了,所以减32
  100.                 //光标的位置,0到7行,0到127列(行,列)
  101.                 OLED_cursor_location(2*row+1,8*column);
  102.                 for(i=0;i<8;++i) MCU_write_OLED_Byte(ASCII[_char-32][i+8],OLED_DATA);//因为ASCII码0到31位去除了,所以减32
  103.         }
  104. }

  105. //OLED打印单个文字(行(0到3),列(0到15),单个所在文字的数组,是否反色(填0或1))
  106. void OLED_print_single_word(u8 row,u8 column,u8 *word,u8 invert_color)
  107. {
  108.         u16 i;
  109.         u8 j;
  110.         for(i=0;i<(sizeof(text))/35;++i)
  111.         {
  112.                 if((*word==text[i].name[0])&&(*(word+1)==text[i].name[1]))//对比汉字区码位码
  113.                 {
  114.                         //光标的位置,0到7行,0到127列(行,列)
  115.                         OLED_cursor_location(2*row,8*column);
  116.                         for(j=0;j<32;++j)
  117.                         {
  118.                                 if(j==16) OLED_cursor_location(2*row+1,8*column);//光标的位置,0到7行,0到127列(行,列)
  119.                                 if(invert_color) MCU_write_OLED_Byte(~text[i].array[j],OLED_DATA);
  120.                                 else MCU_write_OLED_Byte(text[i].array[j],OLED_DATA);
  121.                         }
  122.                 }
  123.         }
  124. }

  125. //OLED打印文本(行(0到3),列(0到15),所打印的文本,是否反色(填0或1))
  126. void OLED_print_text(u8 row,u8 column,u8 *p,u8 invert_color)
  127. {
  128.         //设置内存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  129.         OLED_set_memory_address_mode(0x00);
  130.         while(*p!='\0')
  131.         {
  132.                 if(*p&0x80)//判断是否为汉字
  133.                 {
  134.                         //OLED打印单个文字(行(0到3),列(0到15),单个所在文字的数组,是否反色(填0或1))
  135.                         OLED_print_single_word(row,column,p,invert_color);
  136.                         p=p+2;
  137.                         column=column+2;
  138.                 }
  139.                 else
  140.                 {
  141.                         //OLED打印单个字符(行(0到3),列(0到15),字符,是否反色(填0或1))
  142.                         OLED_print_char(row,column,*p,invert_color);
  143.                         ++p;
  144.                         ++column;
  145.                 }
  146.                
  147.                 if(*p&0x80)//判断下一个字符是中文还是英文,防止在末尾显示的位置不够
  148.                 {
  149.                         if(column>=15)
  150.                         {
  151.                                 ++row;
  152.                                 column=0;
  153.                         }
  154.                 }
  155.                 else
  156.                 {
  157.                         if(column==16)
  158.                         {
  159.                                 ++row;
  160.                                 column=0;
  161.                         }
  162.                 }
  163.                
  164.                 if(row==4) return;//第四行不存在,显示到第四行直接退出(从第零行开始算)
  165.         }
  166. }

  167. //初始化OLED(内存地址模式默认使用水平地址模式,可在初始化程序中更改)
  168. void OLED_init()
  169. {
  170.         OLED_RES=1;
  171.         OLED_delay500ms();//延时函数
  172.         OLED_RES=0;
  173.         OLED_delay500ms();//延时函数
  174.         OLED_RES=1;
  175.         
  176.         MCU_write_OLED_Byte(0xAE,OLED_COMMAND);//关闭显示
  177.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//设置低列地址
  178.         MCU_write_OLED_Byte(0x10,OLED_COMMAND);//设置高列地址
  179.         MCU_write_OLED_Byte(0x40,OLED_COMMAND);//设置显示起始行
  180.         
  181.         MCU_write_OLED_Byte(0xB0,OLED_COMMAND);//设置页地址
  182.         MCU_write_OLED_Byte(0x81,OLED_COMMAND);//
  183.         MCU_write_OLED_Byte(0xFF,OLED_COMMAND);//
  184.         
  185.         MCU_write_OLED_Byte(0xA1,OLED_COMMAND);//设置细分重映射(0xA1正常,0xA0左右反置)
  186.         MCU_write_OLED_Byte(0xA6,OLED_COMMAND);//设置正常/反向(0xA6正常显示,0xA7反向显示)
  187.         MCU_write_OLED_Byte(0xA8,OLED_COMMAND);//设置多路比率
  188.         MCU_write_OLED_Byte(0x3F,OLED_COMMAND);
  189.         MCU_write_OLED_Byte(0xC8,OLED_COMMAND);//设置列输出扫描方向(0xC8正常,0xC0上下反置)
  190.         MCU_write_OLED_Byte(0xD3,OLED_COMMAND);//设置显示偏移(垂直偏移)
  191.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);
  192.         MCU_write_OLED_Byte(0xD5,OLED_COMMAND);//设置显示时钟分频
  193.         MCU_write_OLED_Byte(0x80,OLED_COMMAND);
  194.         MCU_write_OLED_Byte(0xD9,OLED_COMMAND);//设置预充电周期
  195.         MCU_write_OLED_Byte(0xF1,OLED_COMMAND);//将预充电设置为15个时钟加上其放电设置为1个时钟
  196.         MCU_write_OLED_Byte(0xDA,OLED_COMMAND);//设置COM口硬件配置
  197.         MCU_write_OLED_Byte(0x12,OLED_COMMAND);//启用备用COM向导配置
  198.         MCU_write_OLED_Byte(0xDB,OLED_COMMAND);//设置Vcomh取消选择等级
  199.         MCU_write_OLED_Byte(0x30,OLED_COMMAND);//
  200.         MCU_write_OLED_Byte(0x8D,OLED_COMMAND);//充电凹凸设置
  201.         MCU_write_OLED_Byte(0x14,OLED_COMMAND);//在显示期间启用血浆泵
  202.         
  203.         //光标的位置,0到7行,0到127列(行,列)
  204.         OLED_cursor_location(0,0);
  205.         
  206.         //设置内存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  207.         OLED_set_memory_address_mode(0x00);
  208.         
  209.         //清屏
  210.         OLED_clear();
  211.         
  212.         MCU_write_OLED_Byte(0xAF,OLED_COMMAND);//开启显示
  213. }
复制代码

所有资料51hei提供下载:
0.96寸12864OLED(SSD1306)模块.rar (313.5 KB, 下载次数: 413)

链接:
游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0


今天闲逛帖子,无意之中找到上述问题解决方法,实测有效

http://www.51hei.com/bbs/dpj-42047-1.html
http://www.51hei.com/bbs/dpj-5399-1.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏25 分享淘帖 顶1 踩
回复

使用道具 举报

来自 2#
ID:658665 发表于 2020-7-24 20:01 | 只看该作者
OLED模块测试程序V1.1
1.合并了模拟I2C和模拟SPI,在OLED.h文件中选择
2.其他细微调整
0.96寸OLED模块V1.1.rar (97.31 KB, 下载次数: 95)
链接:https://pan.baidu.com/s/1St3LAFnIHSbK2ZxEOaD-fA
提取码:peng


0.96寸OLED模块.rar

97.31 KB, 下载次数: 57, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:430492 发表于 2020-4-28 19:33 | 只看该作者
支持一下分享!!
回复

使用道具 举报

地板
ID:688460 发表于 2020-5-2 11:03 | 只看该作者
感谢楼主的无私奉献!谢谢了!
回复

使用道具 举报

5#
ID:748788 发表于 2020-12-12 10:35 | 只看该作者
下载测试了iic的程序,效果不错
回复

使用道具 举报

6#
ID:582255 发表于 2021-1-30 21:21 | 只看该作者
有仿真或实物就好了
回复

使用道具 举报

7#
ID:605142 发表于 2021-2-1 14:34 | 只看该作者
刚开始刷新好慢,我也没动哪里,现在发疯了,刷得飞快
回复

使用道具 举报

8#
ID:372579 发表于 2021-2-12 18:07 来自手机 | 只看该作者
收藏一下备用
回复

使用道具 举报

9#
ID:835142 发表于 2021-2-13 01:51 来自手机 | 只看该作者
实在是太感谢楼主的分享了  本来学习就是一件需要恒心与毅力的过程,在学习过程中 我个人觉得  还是要有好的例程来帮助研究,学习无数前辈在研究过程中的经验,加快了学习的进度,在理解完之后,获得了继续下去的动力,楼主这样的 真的太好了,谢谢楼主无私的分享!
回复

使用道具 举报

10#
ID:835142 发表于 2021-2-15 02:37 来自手机 | 只看该作者
hefq 发表于 2021-2-1 14:34
刚开始刷新好慢,我也没动哪里,现在发疯了,刷得飞快

请问一下 你的OLED仿真是怎么来的呀 我的protuce 中没有oled的仿真
回复

使用道具 举报

11#
ID:759755 发表于 2021-2-19 11:56 | 只看该作者
有bad apple的动画程序吗?
回复

使用道具 举报

12#
ID:605142 发表于 2021-2-22 15:26 | 只看该作者
君陌233 发表于 2021-2-15 02:37
请问一下 你的OLED仿真是怎么来的呀 我的protuce 中没有oled的仿真

可能版本不同,下8.11
回复

使用道具 举报

13#
ID:605142 发表于 2021-2-22 15:46 | 只看该作者

SPI测试也是可以的,刚开始连错线,以为D/C是MISO,
回复

使用道具 举报

14#
ID:605142 发表于 2021-2-23 16:56 | 只看该作者

回复

使用道具 举报

15#
ID:766985 发表于 2021-2-26 15:19 | 只看该作者
收藏了,谢谢楼主分享
回复

使用道具 举报

16#
ID:856401 发表于 2021-3-26 12:29 来自手机 | 只看该作者
已经调试成功,谢谢
回复

使用道具 举报

17#
ID:143767 发表于 2021-3-27 12:10 | 只看该作者
hefq 发表于 2021-2-1 14:34
刚开始刷新好慢,我也没动哪里,现在发疯了,刷得飞快

请问,IIC的OLED在Proteus到哪里找?
回复

使用道具 举报

18#
ID:958215 发表于 2021-8-2 02:03 | 只看该作者
感谢楼主的无私奉献!谢谢了!
回复

使用道具 举报

19#
ID:924711 发表于 2021-10-7 17:55 来自手机 | 只看该作者
hefq 发表于 2021-2-23 16:56

请问一下你这个oled屏在proteus上是叫什么,输入什么名称来搜的?
回复

使用道具 举报

20#
ID:935610 发表于 2021-10-9 15:58 | 只看该作者
OLED编程还真有一些难度,需要搞懂里面的时序才行。
回复

使用道具 举报

21#
ID:582255 发表于 2022-6-17 11:20 | 只看该作者
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
size啊,这个怎么解决啊
回复

使用道具 举报

22#
ID:907675 发表于 2022-7-9 19:25 | 只看该作者
aktuan007 发表于 2022-6-17 11:20
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
size啊,这个怎么解决啊

应该是代码大小的限制吧
回复

使用道具 举报

23#
ID:66287 发表于 2022-7-12 10:01 | 只看该作者
感谢楼主的无私奉献!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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