找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4473|回复: 1
收起左侧

0.96寸OLED驱动程序 驱动IC为SH1106G

[复制链接]
ID:241105 发表于 2019-4-9 08:16 | 显示全部楼层 |阅读模式
进来项目需要进行了0.96寸OLED的驱动调试,驱动IC为SH1106G

该OLED接线方式为:8080接口/SPI接口/IIC接口

建议初学者采用SPI比较容易上手,谢谢!现将

资料上传,希望对你们有帮助!谢谢了!
0.png 0.png

单片机源程序如下:
  1. /**
  2. ---------------------------------------------------------------------
  3. **
  4. **  This device driver was created by
  5. **  8-Bit Single-Chip Microcontrollers
  6. **
  7. **  Copyright(C) visionox display Corporation 2002 - 2009
  8. **  All rights reserved by Kunshan visionox display Corporation.
  9. **
  10. **  This program should be used on your own responsibility.
  11. **
  12. **  Filename :        SSD1305_Init.c
  13. **  Abstract :        This file implements device driver for Initial SSD1306 IC function.
  14. **
  15. **  Device :        STC89LE516RD
  16. **
  17. **  Compiler :        KEIL uVision2
  18. **
  19. **  Module
  20. **
  21. **  Dot Matrix: 128*64
  22. **
  23. **  Display Color:
  24. **
  25. **  Driver IC:
  26. **
  27. **  Edit :
  28. **
  29. **  Creation date:        
  30. ---------------------------------------------------------------------
  31. **/
  32. //
  33. //

  34. /****************************包含头文件***************************/
  35. #include "reg52.h"
  36. #include "intrins.h"
  37. #include "IC.h"
  38. #include "Delay.h"

  39. #define Slave_Address        0x78  //0X3C  部分IIC主控会自动左移一位地址
  40. #define OP_Data                0x40
  41. #define OP_Command        0x00


  42. //
  43. //
  44. #define Interface_IIC   //定义通信方式接口8080、IIC、SPI
  45. //
  46. //


  47. void Clear_Screen();

  48. #ifdef  Interface_8080

  49. /**********************************************
  50. //
  51. //写命令函数

  52. **********************************************/
  53. //
  54. //

  55. void Write_Command(uchar command)
  56. {
  57.    CS=low;
  58.    DC=low;
  59.    WR=low;
  60.    _nop_();_nop_();
  61.    P0=command;
  62.    WR=high;
  63.    _nop_();_nop_();
  64.    CS=high;
  65. }

  66. //
  67. //
  68. //
  69. /**********************************************
  70. //
  71. //写数据函数
  72. //
  73. **********************************************/
  74. //
  75. //
  76. void Write_Data(uchar date)
  77. {
  78.    CS=low;
  79.    DC=high;
  80.    WR=low;
  81.    _nop_();_nop_();
  82.    P0=date;
  83.    WR=high;
  84.    _nop_();_nop_();
  85.    CS=high;
  86. }

  87. #endif

  88. #ifdef  Interface_IIC

  89. /**********************************************
  90. //
  91. //IIC通信开始函数
  92. //
  93. **********************************************/

  94. void IC_IIC_Start()
  95. {
  96.    SDA = high;
  97.    SCL = high;
  98.    _nop_();
  99.    SDA = low;
  100.    _nop_();_nop_();
  101.    SCL = low;
  102. }

  103. /**********************************************
  104. //
  105. //IIC通信停止函数
  106. //
  107. **********************************************/

  108. void IC_IIC_Stop()
  109. {
  110.    SDA = low;
  111.    _nop_();
  112.    SCL = high;
  113.    _nop_();_nop_();
  114.    SDA = high;
  115. }

  116. /**********************************************
  117. //
  118. //向IIC写数据函数
  119. //返回值为acknowledgement位信号
  120. //
  121. **********************************************/

  122. bit Write_IIC_Data(uchar Data)
  123. {
  124.         unsigned char i;
  125.         bit Ack_Bit;                    //应答信号
  126.         for(i = 0; i < 8; i++)               
  127.         {
  128.                 SDA = (bit)(Data & 0x80);
  129.                 _nop_();
  130.                 SCL = high;
  131.                 _nop_();_nop_();
  132.                 SCL = low;
  133.                 Data = _crol_(Data,1);
  134.         }
  135.         SDA = high;                                //释放IIC SDA总线为主器件接收从器件产生应答信号        
  136.         _nop_();_nop_();
  137.         SCL = high;                     //第9个时钟周期
  138.         _nop_();_nop_();
  139.         Ack_Bit = SDA;                            //读取应答信号
  140.         SCL = low;
  141.         return Ack_Bit;               
  142. }

  143. /**********************************************
  144. //
  145. //写命令函数

  146. **********************************************/
  147. //
  148. //

  149. void Write_Command(uchar command)
  150. {
  151.    IC_IIC_Start();
  152.    Write_IIC_Data(Slave_Address);                //Salve Adress
  153.    Write_IIC_Data(OP_Command);                   //写命令
  154.    Write_IIC_Data(command);
  155.    IC_IIC_Stop();
  156. }

  157. /**********************************************
  158. //
  159. //写数据函数
  160. //
  161. **********************************************/
  162. //
  163. //

  164. void Write_Data(uchar date)
  165. {
  166.    IC_IIC_Start();
  167.    Write_IIC_Data(Slave_Address);                //Salve Adress
  168.    Write_IIC_Data(OP_Data);                      //写数据
  169.    Write_IIC_Data(date);
  170.    IC_IIC_Stop();
  171. }


  172. #endif

  173. #ifdef  Interface_SPI

  174. /**********************************************
  175. //
  176. //写命令函数

  177. **********************************************/
  178. //
  179. //

  180. void Write_Command(uchar command)
  181. {
  182.    uchar i,value;
  183.    value = command;
  184.    CS = low;
  185.    DC = low;
  186.    for(i=0;i<8;i++)
  187.    {
  188.      SCL = low;
  189.          _nop_(); _nop_();
  190.      if(value & 0x80) SI = high;
  191.          else  SI = low;
  192.          SCL = high;
  193.          _nop_(); _nop_();
  194.         value =  _crol_(value, 1);
  195.    }
  196.    CS = high;
  197. }

  198. //
  199. //

  200. /**********************************************
  201. //
  202. //写命令函数

  203. **********************************************/
  204. //
  205. //

  206. void Write_Data(uchar date)
  207. {
  208.    uchar i,value;
  209.    value = date;
  210.    CS = low;
  211.    DC = high;
  212.    for(i=0;i<8;i++)
  213.    {
  214.      SCL = low;
  215.          _nop_(); _nop_();
  216.      if(value & 0x80) SI = high;
  217.          else  SI = low;
  218.          SCL = high;
  219.          _nop_(); _nop_();
  220.         value =  _crol_(value, 1);
  221.    }
  222.    CS = high;
  223. }

  224. #endif
  225. /******************************************************
  226. //
  227. //复位IC函数
  228. //
  229. ******************************************************/
  230. //
  231. //

  232. void Reset_IC()
  233. {
  234.    Delay_Ms(10);
  235.    RES = low;
  236.    Delay_Ms(50);
  237.    RES = high;
  238.    Delay_Ms(100);

  239. }

  240. /******************************************************
  241. //
  242. //初始化IC函数
  243. //
  244. ******************************************************/
  245. void init_ic()
  246. {
  247. Write_Command(0xAE); //Set Display Off
  248. Write_Command(0xD5); //Display divide ratio/osc. freq. mode
  249. Write_Command(0x80); //
  250. Write_Command(0xA8); //Multiplex ration mode:63
  251. Write_Command(0x3F);
  252. Write_Command(0xD3); //Set Display Offset
  253. Write_Command(0x00);
  254. Write_Command(0x40); //Set Display Start Line
  255. Write_Command(0xAD); //DC-DC Control Mode Set
  256. Write_Command(0x8B); //8A:External 8b:Built-in DC-DC is used
  257. Write_Command(0x32); //Set Pump voltage value
  258. Write_Command(0xA1); //Segment Remap
  259. Write_Command(0xC8); //Set COM Output Scan Direction
  260. Write_Command(0xDA); //Common pads hardware: alternative
  261. Write_Command(0x12);
  262. Write_Command(0x81); //Contrast control
  263. Write_Command(0x40);
  264. Write_Command(0xD9); //Set pre-charge period
  265. Write_Command(0x1F);
  266. Write_Command(0xDB); //VCOM deselect level mode
  267. Write_Command(0x40);
  268. Write_Command(0xA4); //Set Entire Display On/Off
  269. Write_Command(0xA6); //Set Normal Display
  270. Clear_Screen();
  271. Write_Command(0xAF); //Set Display On
  272.    



  273. }
  274. }
  275. }


  276. }

  277. void Clear_Screen()
  278. {
  279.    uchar page_number,column_number;
  280.    for(page_number=0;page_number<8;page_number++)
  281.    {
  282.      Write_Command(0xb0+page_number);
  283.      Write_Command(0x10);
  284.      Write_Command(0x02);
  285.      for(column_number=0;column_number<128;column_number++)
  286.      {
  287.         Write_Data(0x00);
  288.      }
  289.    }
  290. }

  291. void All_Screen()
  292. {
  293.    uchar page_number,column_number;
  294.    for(page_number=0;page_number<8;page_number++)
  295.    {
  296.      Write_Command(0xb0+page_number);
  297.      Write_Command(0x10);
  298.      Write_Command(0x02);
  299.      for(column_number=0;column_number<128;column_number++)
  300.      {
  301.         Write_Data(0xFF);
  302.      }
  303.    }
  304. }

  305. void main()
  306. {
  307.         Reset_IC();
  308.         init_ic();
  309.         All_Screen();
  310.         
  311. }
复制代码

回复

使用道具 举报

ID:796531 发表于 2021-3-23 10:36 | 显示全部楼层
好东西,找了半天SH1106的驱动总算找到了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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