找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32F1之4线IIC_OLED源程序

[复制链接]
ID:663607 发表于 2021-8-2 01:34 | 显示全部楼层 |阅读模式
修改对应端口即可
  1. #include "oled.h"
  2. #include "codetab.h"
  3. #include "delay.h"

  4. /**************************实现函数********************************************
  5. *函数原型:                void IIC_Start(void)
  6. *功  能:                产生IIC起始信号
  7. *******************************************************************************/
  8. void OLED_IIC_Start(void)
  9. {

  10.         OLED_IIC_SDA=1;
  11.         OLED_IIC_SCL=1;
  12.         delay_us(1);
  13.         OLED_IIC_SDA=0;
  14.         delay_us(1);
  15.         OLED_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  16. }


  17. /**************************实现函数********************************************
  18. *函数原型:                void IIC_Stop(void)
  19. *功  能:            //产生IIC停止信号
  20. *******************************************************************************/          
  21. void  OLED_IIC_Stop(void)
  22. {

  23.         OLED_IIC_SCL=0;
  24.         OLED_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  25.         delay_us(1);
  26.         OLED_IIC_SCL=1;
  27.         OLED_IIC_SDA=1;//发送I2C总线结束信号
  28.         delay_us(1);                                                                  
  29. }


  30. void Write_IIC_Byte(unsigned char IIC_Byte)
  31. {
  32.         unsigned char i;
  33.   for(i=0;i<8;i++)
  34.         {
  35.                 if(IIC_Byte & 0x80)
  36.                         OLED_IIC_SDA=1;
  37.                 else
  38.                         OLED_IIC_SDA=0;
  39.                         OLED_IIC_SCL=1;
  40.       delay_us(1);  //必须有保持SCL脉冲的延时
  41.                         OLED_IIC_SCL=0;
  42.                         IIC_Byte<<=1;
  43.         }
  44.                         OLED_IIC_SDA = 1;//原程序这里有一个拉高SDA,根据OLED的DATASHEET,此句必须去掉。
  45.                         OLED_IIC_SCL=1;
  46.                         delay_us(1);
  47.                         OLED_IIC_SCL=0;
  48. }


  49. /*********************OLED写数据************************************/
  50. void OLED_WrDat(unsigned char IIC_Data)
  51. {
  52.         OLED_IIC_Start();
  53.         Write_IIC_Byte(0x78);
  54.         Write_IIC_Byte(0x40);                        //write data
  55.         Write_IIC_Byte(IIC_Data);
  56.         OLED_IIC_Stop();
  57. }
  58. /*********************OLED写命令************************************/
  59. void OLED_WrCmd(unsigned char IIC_Command)
  60. {
  61.         OLED_IIC_Start();
  62.         Write_IIC_Byte(0x78);            //Slave address,SA0=0
  63.         Write_IIC_Byte(0x00);                        //write command
  64.         Write_IIC_Byte(IIC_Command);
  65.         OLED_IIC_Stop();
  66. }
  67. /*********************OLED 设置坐标************************************/
  68. void OLED_Set_Pos(unsigned char x, unsigned char y)
  69. {
  70.         OLED_WrCmd(0xb0+y);
  71.         OLED_WrCmd(((x&0xf0)>>4)|0x10);
  72.         OLED_WrCmd((x&0x0f)|0x01);
  73. }
  74. /*********************OLED全屏************************************/
  75. void OLED_Fill(unsigned char bmp_dat)
  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(bmp_dat);
  85.         }
  86. }
  87. /*********************OLED复位************************************/
  88. void OLED_CLS(void)
  89. {
  90.         unsigned char y,x;
  91.         for(y=0;y<8;y++)
  92.         {
  93.                 OLED_WrCmd(0xb0+y);
  94.                 OLED_WrCmd(0x01);
  95.                 OLED_WrCmd(0x10);
  96.                 for(x=0;x<X_WIDTH;x++)
  97.                 OLED_WrDat(0);
  98.         }
  99. }

  100. //--------------------------------------------------------------
  101. // Prototype      : void OLED_OFF(void)
  102. // Calls          :
  103. // Parameters     : none
  104. // Description    : 让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
  105. //--------------------------------------------------------------
  106. void OLED_OFF(void)
  107. {
  108.         OLED_WrCmd(0X8D);  //设置电荷泵
  109.         OLED_WrCmd(0X10);  //关闭电荷泵
  110.         OLED_WrCmd(0XAE);  //OLED休眠
  111. }


  112. //--------------------------------------------------------------
  113. // Prototype      : void OLED_ON(void)
  114. // Calls          :
  115. // Parameters     : none
  116. // Description    : 将OLED从休眠中唤醒
  117. //--------------------------------------------------------------
  118. void OLED_ON(void)
  119. {
  120.         OLED_WrCmd(0X8D);  //设置电荷泵
  121.         OLED_WrCmd(0X14);  //开启电荷泵
  122.         OLED_WrCmd(0XAF);  //OLED唤醒
  123. }


  124. /*********************OLED初始化************************************/
  125. void OLED_IIC_Init(void)
  126. {
  127.         GPIO_InitTypeDef GPIO_InitStructure;
  128.        
  129.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
  130.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  131.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
  132.        
  133.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;        //端口配置
  134.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
  135.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
  136.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  137.        
  138.         delay_ms(500);//       
  139.         OLED_WrCmd(0xae);//--turn off oled panel
  140.         OLED_WrCmd(0x00);//---set low column address
  141.         OLED_WrCmd(0x10);//---set high column address
  142.         OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  143.         OLED_WrCmd(0x81);//--set contrast control register
  144.         OLED_WrCmd(0xFF); // Set SEG Output Current Brightness 亮度调节 0x00~0xff
  145.         OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  146.         OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  147.         OLED_WrCmd(0xa6);//--set normal display
  148.         OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  149.         OLED_WrCmd(0x3f);//--1/64 duty
  150.         OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  151.         OLED_WrCmd(0x00);//-not offset
  152.         OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  153.         OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  154.         OLED_WrCmd(0xd9);//--set pre-charge period
  155.         OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  156.         OLED_WrCmd(0xda);//--set com pins hardware configuration
  157.         OLED_WrCmd(0x12);
  158.        
  159.         OLED_WrCmd(0xdb);//--set vcomh
  160.         OLED_WrCmd(0x40);//Set VCOM Deselect Level
  161.         OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  162.         OLED_WrCmd(0x02);//
  163.         OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  164.         OLED_WrCmd(0x14);//--set(0x10) disable
  165.        
  166.         OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  167.         OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  168.         OLED_WrCmd(0xaf);//--turn on oled panel
  169.        
  170.         OLED_Fill(0x00); //初始清屏
  171.         OLED_Set_Pos(0,0);
  172. }

  173. //在指定位置显示一个字符,包括部分字符
  174. //x:0~127
  175. //y:0~63
  176. //mode:0,反白显示;1,正常显示                                 
  177. //size:选择字体 16/12
  178. void OLED_ShowChar(u8 x,u8 y,u8 chr)
  179. {             
  180.         unsigned char c=0,i=0;       
  181.                 c=chr-' ';//得到偏移后的值                       
  182.                 if(x>Max_Column-1)
  183.                 {
  184.                         x=0;y=y+2;
  185.                 }
  186.                 OLED_Set_Pos(x,y+1);
  187.                 for(i=0;i<6;i++)
  188.                 OLED_WrDat(F6x8[c][i]);
  189. }
  190. /***************功能描述:显示6*8一组标准ASCII字符串        显示的坐标(x,y),y为页范围0~7****************/
  191. void OLED_P6x8Str(unsigned char x,unsigned char 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,unsigned  char 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. }

复制代码

代码工程: IIC_OLED.7z (200.52 KB, 下载次数: 46)

评分

参与人数 1黑币 +10 收起 理由
xjx51 + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:584195 发表于 2021-8-6 18:14 | 显示全部楼层
学习了,感觉楼主分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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