单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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


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

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

  44. #include "reg51.h"

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

  52. #define high 1
  53. #define low 0

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

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

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

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

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

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


评分

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

查看全部评分

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

使用道具 举报

沙发
猜猜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 | 只看该作者
很棒的  谢谢
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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