找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32驱动I2C OLED程序源码

  [复制链接]
跳转到指定楼层
楼主
ID:306762 发表于 2018-9-2 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该实验是用stm32f103c8t6驱动I2C方式的OLED屏幕,可以显示数字,符号,英文字符串,中文字符串(需要自己做字库)以及BMP图片(需要自己符库)  (如果对大家有帮助的话,麻烦在论坛里按一下支持给我点点鼓励,谢谢)

stm32单片机源程序如下:
  1. #include "oled.h"
  2. #include "codetab.h"
  3. #include "delay.h"
  4. #include "myiic.h"

  5. ///**********************************************
  6. //// 通过I2C总线写一个字节
  7. //**********************************************/
  8. void Write_IIC_Byte(unsigned char IIC_Byte)
  9. {
  10.         unsigned char i;
  11.   for(i=0;i<8;i++)
  12.         {
  13.                 if(IIC_Byte & 0x80)
  14.                         IIC_SDA=1;
  15.                 else
  16.                         IIC_SDA=0;
  17.                 IIC_SCL=high;
  18.         delay_us(4);  
  19.                 IIC_SCL=0;
  20.                 IIC_Byte<<=1;
  21.         }
  22.     IIC_SDA = 1; //原程序这里有一个拉高SDA,根据OLED的DATASHEET,此句必须去掉。
  23.                 IIC_SCL=1;
  24.     delay_us(4);
  25.                 IIC_SCL=0;
  26. }

  27. /*********************OLED写数据************************************/
  28. void OLED_WrDat(unsigned char IIC_Data)
  29. {
  30.         IIC_Start();
  31.    IIC_Send_Byte(0x78);                        //D/C#=0; R/W#=0
  32.         IIC_Wait_Ack();       
  33.    IIC_Send_Byte(0x40);                        //write data
  34.         IIC_Wait_Ack();       
  35.    IIC_Send_Byte(IIC_Data);
  36.         IIC_Wait_Ack();
  37.         IIC_Stop();
  38. }
  39. /*********************OLED写命令************************************/
  40. void OLED_WrCmd(unsigned char IIC_Command)
  41. {
  42.         IIC_Start();
  43.    IIC_Send_Byte(0x78);            //Slave address,SA0=0
  44.         if(IIC_Wait_Ack())
  45.         {
  46.                 while(1);
  47.         }
  48.    IIC_Send_Byte(0x00);                        //write command
  49.         IIC_Wait_Ack();       
  50.    IIC_Send_Byte(IIC_Command);
  51.         IIC_Wait_Ack();
  52.         IIC_Stop();
  53. }
  54. /*********************OLED 设置坐标************************************/
  55. void OLED_Set_Pos(unsigned char x, unsigned char y)
  56. {
  57.         OLED_WrCmd(0xb0+y);
  58.         OLED_WrCmd(((x&0xf0)>>4)|0x10);
  59.         OLED_WrCmd((x&0x0f)|0x01);
  60. }
  61. /*********************OLED全屏************************************/
  62. void OLED_Fill(unsigned char bmp_dat)
  63. {
  64.         unsigned char y,x;
  65.         for(y=0;y<8;y++)
  66.         {
  67.                 OLED_WrCmd(0xb0+y);
  68.                 OLED_WrCmd(0x01);
  69.                 OLED_WrCmd(0x10);
  70.                 for(x=0;x<X_WIDTH;x++)
  71.                 OLED_WrDat(bmp_dat);
  72.         }
  73. }
  74. /*********************OLED复位************************************/
  75. void OLED_CLS(void)
  76. {
  77.         unsigned char y,x;
  78.         for(y=0;y<8;y++)
  79.         {
  80.                 OLED_WrCmd(0xb0+y);
  81.                 OLED_WrCmd(0x01);
  82.                 OLED_WrCmd(0x10);
  83.                 for(x=0;x<X_WIDTH;x++)
  84.                 OLED_WrDat(0);
  85.         }
  86. }
  87. /*********************OLED初始化************************************/
  88. void OLED_Init(void)
  89. {
  90.         delay_ms(500);//初始化之前的延时很重要!
  91.         OLED_WrCmd(0xae);//--turn off oled panel
  92.         OLED_WrCmd(0x00);//---set low column address
  93.         OLED_WrCmd(0x10);//---set high column address
  94.         OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  95.         OLED_WrCmd(0x81);//--set contrast control register
  96.         OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
  97.         OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  98.         OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  99.         OLED_WrCmd(0xa6);//--set normal display
  100.         OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  101.         OLED_WrCmd(0x3f);//--1/64 duty
  102.         OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  103.         OLED_WrCmd(0x00);//-not offset
  104.         OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  105.         OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  106.         OLED_WrCmd(0xd9);//--set pre-charge period
  107.         OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock   
  108.         OLED_WrCmd(0xda);//--set com pins hardware configuration
  109.         OLED_WrCmd(0x12);
  110.         OLED_WrCmd(0xdb);//--set vcomh
  111.         OLED_WrCmd(0x40);//Set VCOM Deselect Level
  112.         OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  113.         OLED_WrCmd(0x02);//
  114.         OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  115.         OLED_WrCmd(0x14);//--set(0x10) disable
  116.         OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  117.         OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  118.         OLED_WrCmd(0xaf);//--turn on oled panel
  119.         OLED_Fill(0x00); //初始清屏
  120.         OLED_Set_Pos(0,0);
  121. }
  122. /***************功能描述:显示6*8一组标准ASCII字符串        显示的坐标(x,y),y为页范围0~7****************/
  123. void OLED_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[])
  124. {
  125.         unsigned char c=0,i=0,j=0;
  126.         while (ch[j]!='\0')
  127.         {
  128.                 c =ch[j]-32;
  129.                 if(x>126){x=0;y++;}
  130.                 OLED_Set_Pos(x,y);
  131.                 for(i=0;i<6;i++)
  132.                 OLED_WrDat(F6x8[c][i]);
  133.                 x+=6;
  134.                 j++;
  135.         }
  136. }
  137. /*******************功能描述:显示8*16一组标准ASCII字符串         显示的坐标(x,y),y为页范围0~7****************/
  138. void OLED_P8x16Str(unsigned char x,unsigned  char y,unsigned char ch[])
  139. {
  140.         unsigned char c=0,i=0,j=0;
  141.         while (ch[j]!='\0')
  142.         {
  143.                 c =ch[j]-32;
  144.                 if(x>120){x=0;y++;}
  145.                 OLED_Set_Pos(x,y);
  146.                 for(i=0;i<8;i++)
  147.                 OLED_WrDat(F8X16[c*16+i]);
  148.                 OLED_Set_Pos(x,y+1);
  149.                 for(i=0;i<8;i++)
  150.                 OLED_WrDat(F8X16[c*16+i+8]);
  151.                 x+=8;
  152.                 j++;
  153.         }
  154. }
  155. /*****************功能描述:显示16*16点阵  显示的坐标(x,y),y为页范围0~7****************************/
  156. void OLED_P16x16Ch(unsigned char x,unsigned char y,unsigned char N)
  157. {
  158.         unsigned char wm=0;
  159.         unsigned int adder=32*N;
  160.         OLED_Set_Pos(x , y);
  161.         for(wm = 0;wm < 16;wm++)
  162.         {
  163.                 OLED_WrDat(F16x16[adder]);
  164.                 adder += 1;
  165.         }
  166.         OLED_Set_Pos(x,y + 1);
  167.         for(wm = 0;wm < 16;wm++)
  168.         {
  169.                 OLED_WrDat(F16x16[adder]);
  170.                 adder += 1;
  171.         }                  
  172. }
  173. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  174. void Draw_BMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
  175. {
  176.         unsigned int j=0;
  177.         unsigned char x,y;

  178.   if(y1%8==0) y=y1/8;      
  179.   else y=y1/8+1;
  180.         for(y=y0;y<y1;y++)
  181.         {
  182.                 OLED_Set_Pos(x0,y);
  183.     for(x=x0;x<x1;x++)
  184.             {      
  185.                     OLED_WrDat(BMP[j++]);
  186.             }
  187.         }
  188. }
复制代码

所有资料51hei提供下载:
I2C_OLED.rar (280.29 KB, 下载次数: 230)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:299929 发表于 2018-10-17 17:20 | 只看该作者
先下载下来看下
回复

使用道具 举报

板凳
ID:452451 发表于 2019-1-2 20:31 | 只看该作者
编译没问题,下载完没反应灯也不亮
回复

使用道具 举报

地板
ID:460567 发表于 2019-1-3 06:18 来自手机 | 只看该作者
感觉程序有问题,编译有错误
回复

使用道具 举报

5#
ID:473192 发表于 2019-7-2 16:02 | 只看该作者
挺好的,可以实现功能
回复

使用道具 举报

6#
ID:222621 发表于 2019-8-26 09:10 | 只看该作者
先下载下来学习一下i2c的用法
回复

使用道具 举报

7#
ID:129244 发表于 2019-9-26 19:20 | 只看该作者
谢谢楼主分享!!
回复

使用道具 举报

8#
ID:129244 发表于 2019-9-26 19:20 | 只看该作者
谢谢楼主分享,学习一下!哈哈
回复

使用道具 举报

9#
ID:597087 发表于 2019-10-25 08:26 | 只看该作者
非常好!!!
回复

使用道具 举报

10#
ID:597087 发表于 2019-10-25 08:26 | 只看该作者
谢谢楼主
回复

使用道具 举报

11#
ID:39072 发表于 2019-10-25 15:05 | 只看该作者
刚学32!可以学习一下!谢
回复

使用道具 举报

12#
ID:631361 发表于 2019-10-28 13:44 | 只看该作者
下载看看
回复

使用道具 举报

13#
ID:686384 发表于 2020-2-18 17:25 | 只看该作者
下载来学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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