单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

IIC-OLED显示屏资料(SSD1306) 用51单片机和stm32 Arduino驱动oled的例程

  [复制链接]
跳转到指定楼层
楼主
里面还有stm32的例程.


IIC方式的OLED显示屏资料(SSD1306),里面有 用51单片机和stm32单片机还有Arduino驱动oled的例程:
IIC-OLED显示屏资料(SSD1306).rar (7.84 MB, 下载次数: 554)

部分程序预览51的:
  1. /************************************************************************************
  2. *  Copyright (c), 2013, HelTec Automatic Technology co.,LTD.
  3. *            All rights reserved.
  4. * Email:   cn.heltec@gmail.com
  5. * WebShop: heltec.taobao.com
  6. *
  7. * File name: LQ12864.h
  8. * Project  : OLED
  9. * Processor: STC89C52
  10. * Compiler : Keil C51 Compiler
  11. *
  12. * Author : 小林
  13. * Version: 1.00
  14. * Date   : 2013.8.8
  15. * Email  : hello14blog@gmail.com
  16. * Modification: none
  17. *
  18. * Description:128*64点整OLED模块驱动文件
  19. *
  20. * Others: none;
  21. *
  22. * Function List:
  23. *
  24. * 1. void delay(unsigned int z) -- 延时函数,毫秒
  25. * 2. void IIC_Start() -- 开启I2C总线
  26. * 3. void IIC_Stop() -- 关闭I2C总线
  27. * 4. void Write_IIC_Byte(unsigned char IIC_Byte) -- 通过I2C总线写一个byte的数据
  28. * 5. void OLED_WrDat(unsigned char dat) -- 向OLED屏写数据
  29. * 6. void OLED_WrCmd(unsigned char cmd) -- 向OLED屏写命令
  30. * 7. void OLED_Set_Pos(unsigned char x, unsigned char y) -- 设置显示坐标
  31. * 8. void OLED_Fill(unsigned char bmp_dat) -- 全屏显示(显示BMP图片时才会用到此功能)
  32. * 9. void OLED_CLS(void) -- 复位/清屏
  33. * 10. void OLED_Init(void) -- OLED屏初始化程序,此函数应在操作屏幕之前最先调用
  34. * 11. void OLED_P6x8Str(unsigned char x, y,unsigned char ch[]) -- 6x8点整,用于显示ASCII码的最小阵列,不太清晰
  35. * 12. void OLED_P8x16Str(unsigned char x, y,unsigned char ch[]) -- 8x16点整,用于显示ASCII码,非常清晰
  36. * 13.void OLED_P16x16Ch(unsigned char x, y, N) -- 16x16点整,用于显示汉字的最小阵列,可设置各种字体、加粗、倾斜、下划线等
  37. * 14.void Draw_BMP(unsigned char x0, y0,x1, y1,unsigned char BMP[]) -- 将128x64像素的BMP位图在取字软件中算出字表,然后复制到codetab中,此函数调用即可
  38. *
  39. * History: none;
  40. *
  41. *************************************************************************************/

  42. #include "reg51.h"

  43. // ------------------------------------------------------------
  44. // IO口模拟I2C通信
  45. // SCL接P1^3
  46. // SDA接P1^2
  47. // ------------------------------------------------------------
  48. sbit SCL=P1^1; //串行时钟
  49. sbit SDA=P1^0; //串行数据

  50. #define high 1
  51. #define low 0

  52. #define        Brightness        0xCF
  53. #define X_WIDTH         128
  54. #define Y_WIDTH         64
  55. /*********************OLED驱动程序用的延时程序************************************/
  56. void delay(unsigned int z)
  57. {
  58.         unsigned int x,y;
  59.         for(x=z;x>0;x--)
  60.                 for(y=110;y>0;y--);
  61. }

  62. /**********************************************
  63. //IIC Start
  64. **********************************************/
  65. void IIC_Start()
  66. {
  67.    SCL = high;               
  68.    SDA = high;
  69.    SDA = low;
  70.    SCL = low;
  71. }

  72. /**********************************************
  73. //IIC Stop
  74. **********************************************/
  75. void IIC_Stop()
  76. {
  77.    SCL = low;
  78.    SDA = low;
  79.    SCL = high;
  80.    SDA = high;
  81. }

  82. /**********************************************
  83. // 通过I2C总线写一个字节
  84. **********************************************/
  85. void Write_IIC_Byte(unsigned char IIC_Byte)
  86. {
  87.         unsigned char i;
  88.         for(i=0;i<8;i++)
  89.         {
  90.                 if(IIC_Byte & 0x80)
  91.                         SDA=high;
  92.                 else
  93.                         SDA=low;
  94.                 SCL=high;
  95.                 SCL=low;
  96.                 IIC_Byte<<=1;
  97.         }
  98.         SDA=1;
  99.         SCL=1;
  100.         SCL=0;
  101. }

  102. /*********************OLED写数据************************************/
  103. void OLED_WrDat(unsigned char IIC_Data)
  104. {
  105.         IIC_Start();
  106.         Write_IIC_Byte(0x78);
  107.         Write_IIC_Byte(0x40);                        //write data
  108.         Write_IIC_Byte(IIC_Data);
  109.         IIC_Stop();
  110. }
  111. /*********************OLED写命令************************************/
  112. void OLED_WrCmd(unsigned char IIC_Command)
  113. {
  114.         IIC_Start();
  115.         Write_IIC_Byte(0x78);            //Slave address,SA0=0
  116.         Write_IIC_Byte(0x00);                        //write command
  117.         Write_IIC_Byte(IIC_Command);
  118.         IIC_Stop();
  119. }
  120. /*********************OLED 设置坐标************************************/
  121. void OLED_Set_Pos(unsigned char x, unsigned char y)
  122. {
  123.         OLED_WrCmd(0xb0+y);
  124.         OLED_WrCmd(((x&0xf0)>>4)|0x10);
  125.         OLED_WrCmd((x&0x0f)|0x01);
  126. }
  127. /*********************OLED全屏************************************/
  128. void OLED_Fill(unsigned char bmp_dat)
  129. {
  130.         unsigned char y,x;
  131.         for(y=0;y<8;y++)
  132.         {
  133.                 OLED_WrCmd(0xb0+y);
  134.                 OLED_WrCmd(0x01);
  135.                 OLED_WrCmd(0x10);
  136.                 for(x=0;x<X_WIDTH;x++)
  137.                 OLED_WrDat(bmp_dat);
  138.         }
  139. }
  140. /*********************OLED复位************************************/
  141. void OLED_CLS(void)
  142. {
  143.         unsigned char y,x;
  144.         for(y=0;y<8;y++)
  145.         {
  146.                 OLED_WrCmd(0xb0+y);
  147.                 OLED_WrCmd(0x01);
  148.                 OLED_WrCmd(0x10);
  149.                 for(x=0;x<X_WIDTH;x++)
  150.                 OLED_WrDat(0);
  151.         }
  152. }
  153. /*********************OLED初始化************************************/
  154. void OLED_Init(void)
  155. {
  156.         delay(500);//初始化之前的延时很重要!
  157.         OLED_WrCmd(0xae);//--turn off oled panel
  158.         OLED_WrCmd(0x00);//---set low column address
  159.         OLED_WrCmd(0x10);//---set high column address
  160.         OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  161.         OLED_WrCmd(0x81);//--set contrast control register
  162.         OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
  163.         OLED_WrCmd(0xa0);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  164.         OLED_WrCmd(0xc0);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  165.         OLED_WrCmd(0xa6);//--set normal display
  166.         OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  167.         OLED_WrCmd(0x3f);//--1/64 duty
  168.         OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  169.         OLED_WrCmd(0x00);//-not offset
  170.         OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  171.         OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  172.         OLED_WrCmd(0xd9);//--set pre-charge period
  173.         OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  174.         OLED_WrCmd(0xda);//--set com pins hardware configuration
  175.         OLED_WrCmd(0x12);
  176.         OLED_WrCmd(0xdb);//--set vcomh
  177.         OLED_WrCmd(0x40);//Set VCOM Deselect Level
  178.         OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  179.         OLED_WrCmd(0x02);//
  180.         OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  181.         OLED_WrCmd(0x14);//--set(0x10) disable
  182.         OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  183.         OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  184.         OLED_WrCmd(0xaf);//--turn on oled panel
  185.         OLED_Fill(0x00); //初始清屏
  186.         OLED_Set_Pos(0,0);
  187. }
  188. /***************功能描述:显示6*8一组标准ASCII字符串        显示的坐标(x,y),y为页范围0~7****************/
  189. void OLED_P6x8Str(unsigned char x, y,unsigned char ch[])
  190. {
  191.         unsigned char c=0,i=0,j=0;
  192.         while (ch[j]!='\0')
  193.         {
  194.                 c =ch[j]-32;
  195.                 if(x>126){x=0;y++;}
  196.                 OLED_Set_Pos(x,y);
  197.                 for(i=0;i<6;i++)
  198.                 OLED_WrDat(F6x8[c][i]);
  199.                 x+=6;
  200.                 j++;
  201.         }
  202. }
  203. /*******************功能描述:显示8*16一组标准ASCII字符串         显示的坐标(x,y),y为页范围0~7****************/
  204. void OLED_P8x16Str(unsigned char x, y,unsigned char ch[])
  205. {
  206.         unsigned char c=0,i=0,j=0;
  207.         while (ch[j]!='\0')
  208.         {
  209.                 c =ch[j]-32;
  210.                 if(x>120){x=0;y++;}
  211.                 OLED_Set_Pos(x,y);
  212.                 for(i=0;i<8;i++)
  213.                 OLED_WrDat(F8X16[c*16+i]);
  214.                 OLED_Set_Pos(x,y+1);
  215.                 for(i=0;i<8;i++)
  216.                 OLED_WrDat(F8X16[c*16+i+8]);
  217.                 x+=8;
  218.                 j++;
  219.         }
  220. }
  221. /*****************功能描述:显示16*16点阵  显示的坐标(x,y),y为页范围0~7****************************/
  222. void OLED_P16x16Ch(unsigned char x, y, N)
  223. {
  224.         unsigned char wm=0;
  225.         unsigned int adder=32*N;
  226.         OLED_Set_Pos(x , y);
  227.         for(wm = 0;wm < 16;wm++)
  228.         {
  229.                 OLED_WrDat(F16x16[adder]);
  230.                 adder += 1;
  231.         }
  232.         OLED_Set_Pos(x,y + 1);
  233.         for(wm = 0;wm < 16;wm++)
  234.         {
  235.                 OLED_WrDat(F16x16[adder]);
  236.                 adder += 1;
  237.         }                  
  238. }
  239. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  240. void Draw_BMP(unsigned char x0, y0,x1, y1,unsigned char BMP[])
  241. {
  242.         unsigned int j=0;
  243.         unsigned char x,y;

  244.   if(y1%8==0) y=y1/8;      
  245.   else y=y1/8+1;
  246.         for(y=y0;y<y1;y++)
  247.         {
  248.                 OLED_Set_Pos(x0,y);
  249.     for(x=x0;x<x1;x++)
  250.             {      
  251.                     OLED_WrDat(BMP[j++]);
  252.             }
  253.         }
  254. }
复制代码


评分

参与人数 3黑币 +21 收起 理由
溯行 + 6 赞一个!
609763691 + 10 很给力!
simonliu009 + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
猜猜me 发表于 2017-10-29 14:47 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
dulai 发表于 2018-1-28 08:52 | 只看该作者
想要学习,刚入门。看看怎么弄!!!!
回复

使用道具 举报

地板
後輪追前輪 发表于 2018-2-3 21:37 | 只看该作者
刚好需要学习下
回复

使用道具 举报

5#
rockze 发表于 2018-5-2 17:34 | 只看该作者
支持一下啦!!!
回复

使用道具 举报

6#
nb44444 发表于 2018-7-19 11:22 | 只看该作者
很好,来看看这屏幕
回复

使用道具 举报

7#
hahaqinyou 发表于 2018-7-22 16:19 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

8#
拖拉机战士 发表于 2018-7-31 16:35 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

9#
singasin 发表于 2018-10-29 23:27 | 只看该作者
xiexiefenxiang
回复

使用道具 举报

10#
mtk1625 发表于 2019-2-12 11:35 | 只看该作者
很棒的  谢谢
回复

使用道具 举报

11#
shijimiaopu 发表于 2019-3-4 20:49 | 只看该作者
分不够啊
回复

使用道具 举报

12#
asd2002061 发表于 2019-3-18 00:21 | 只看该作者
非常有用,谢谢分享
回复

使用道具 举报

13#
诚兴通讯电器 发表于 2019-3-18 14:48 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
123wer烦 发表于 2019-3-28 14:07 | 只看该作者
1306怎么与51单片机连线呢
回复

使用道具 举报

15#
kangcy 发表于 2019-4-11 17:53 | 只看该作者
谢谢分享
回复

使用道具 举报

16#
lgspace 发表于 2019-5-16 17:01 | 只看该作者
这个好啊,很详细,厉害
回复

使用道具 举报

17#
azi197417 发表于 2019-6-3 18:35 | 只看该作者
这个要赞!
回复

使用道具 举报

18#
zhongzl728 发表于 2019-7-20 18:46 | 只看该作者

赞一个!
回复

使用道具 举报

19#
Lenv 发表于 2019-7-23 19:34 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

20#
mobicity 发表于 2019-9-30 22:04 | 只看该作者
学习下,感谢
回复

使用道具 举报

21#
18982855587 发表于 2019-11-22 16:39 | 只看该作者

学习下,感谢
回复

使用道具 举报

22#
邰夏留 发表于 2019-11-23 23:33 | 只看该作者
刚好需要,感谢楼主
回复

使用道具 举报

23#
jovew 发表于 2019-12-8 14:45 | 只看该作者
好东西!值得学习。
回复

使用道具 举报

24#
917106794 发表于 2019-12-13 15:10 | 只看该作者
刚好需要,谢谢楼主分享
回复

使用道具 举报

25#
zmz_0312 发表于 2020-1-9 17:56 | 只看该作者
谢谢分享!正好需要这方面的资料!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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