找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32F103ZE单片机芯片,IIC驱动oled显示图片代码

[复制链接]
跳转到指定楼层
楼主
程序代码在附件中,取模软件来自正点原子免费学习资料,本人接触这行不久代码有不足之处可以自行探索修改。因为我是照着正点原子学习的,所以工程文件也是照着正点原子弄的,制作比较简单适合新手学习。

运行结果如下图


取模设置如图:



图片取模软件是Image2Lcd 2.9,请百度自行获取

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

  5. u8 OLED_GRAM[128][8];        
  6. /*引脚初始化*/
  7. void OLED_I2C_Init(void)
  8. {
  9.         GPIO_InitTypeDef GPIO_InitStruct;
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  11.         

  12.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
  13.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  14.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  15.         GPIO_Init(GPIOB, &GPIO_InitStruct);
  16.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
  17.         GPIO_Init(GPIOB, &GPIO_InitStruct);
  18.         
  19.         OLED_W_SCL(1);
  20.         OLED_W_SDA(1);
  21. }

  22. /**
  23.   * @brief  I2C开始
  24.   * @param  无
  25.   * @retval 无
  26.   */
  27. void OLED_I2C_Start(void)
  28. {
  29.         OLED_W_SDA(1);
  30.         OLED_W_SCL(1);
  31.         OLED_W_SDA(0);
  32.         OLED_W_SCL(0);
  33. }

  34. /**
  35.   * @brief  I2C停止
  36.   * @param  无
  37.   * @retval 无
  38.   */
  39. void OLED_I2C_Stop(void)
  40. {
  41.         OLED_W_SDA(0);
  42.         OLED_W_SCL(1);
  43.         OLED_W_SDA(1);
  44. }

  45. /**
  46.   * @brief  I2C发送一个字节
  47.   * @param  Byte 要发送的一个字节
  48.   * @retval 无
  49.   */
  50. void OLED_I2C_SendByte(uint8_t Byte)
  51. {
  52.         uint8_t i;
  53.         for (i = 0; i < 8; i++)
  54.         {
  55.                 OLED_W_SDA(Byte & (0x80 >> i));
  56.                 OLED_W_SCL(1);
  57.                 OLED_W_SCL(0);
  58.         }
  59.         OLED_W_SCL(1);        //额外的一个时钟,不处理应答信号
  60.         OLED_W_SCL(0);
  61. }

  62. /**
  63.   * @brief  OLED写命令
  64.   * @param  Command 要写入的命令
  65.   * @retval 无
  66.   */
  67. void OLED_WriteCommand(uint8_t Command)
  68. {
  69.         OLED_I2C_Start();
  70.         OLED_I2C_SendByte(0x78);                //从机地址
  71.         OLED_I2C_SendByte(0x00);                //写命令
  72.         OLED_I2C_SendByte(Command);
  73.         OLED_I2C_Stop();
  74. }

  75. /**
  76.   * @brief  OLED写数据
  77.   * @param  Data 要写入的数据
  78.   * @retval 无
  79.   */
  80. void OLED_WriteData(uint8_t Data)
  81. {
  82.         OLED_I2C_Start();
  83.         OLED_I2C_SendByte(0x78);                //从机地址
  84.         OLED_I2C_SendByte(0x40);                //写数据
  85.         OLED_I2C_SendByte(Data);
  86.         OLED_I2C_Stop();
  87. }

  88. //更新显存到OLED         
  89. void OLED_Refresh_Gram(void)
  90. {
  91.         u8 i,n;                    
  92.         for(i=0;i<8;i++)  
  93.         {  
  94.                         OLED_WriteCommand(0xB0+i);                                        //设置Y位置
  95.                         OLED_WriteCommand(0x10);        //设置X位置高4位
  96.                         OLED_WriteCommand(0x00);                        //设置X位置低4位
  97.                 for(n=0;n<128;n++)
  98.                 {
  99.                         OLED_WriteData(OLED_GRAM[n][i]);
  100.                 }
  101.         }   
  102. }

  103. //画点
  104. //x:0~127
  105. //y:0~63
  106. //t:1 填充 0,清空                                   
  107. void OLED_DrawPoint(u8 x,u8 y,u8 t)
  108. {
  109.         u8 pos,bx,temp=0;
  110.         if(x>127||y>63)
  111.         {
  112.                 return;//超出范围了.
  113.         }
  114.         pos=7-y/8;
  115.         bx=y%8;
  116.         temp=1<<(7-bx);
  117.         if(t)
  118.         {
  119.                 OLED_GRAM[x][pos]|=temp;
  120.         }
  121.         else OLED_GRAM[x][pos]&=~temp;            
  122. }

  123. //m^n函数
  124. u32 mypow(u8 m,u8 n)
  125. {
  126.         u32 result=1;         
  127.         while(n--)result*=m;   
  128.         return result;
  129. }        



  130. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!         
  131. void OLED_Clear(void)  
  132. {  
  133.         u8 i,n;  
  134.         for(i=0;i<8;i++)
  135.         {
  136.                 for(n=0;n<128;n++)
  137.                 {
  138.                         OLED_GRAM[n][i]=0X00;  
  139.                 }
  140.         }
  141.         OLED_Refresh_Gram();//更新显示
  142. }

  143. /**
  144.   * @brief  OLED设置光标位置
  145.   * @param  Y 以左上角为原点,向下方向的坐标,范围:0~7
  146.   * @param  X 以左上角为原点,向右方向的坐标,范围:0~127
  147.   * @retval 无
  148.   */
  149. void OLED_SetCursor(uint8_t Y, uint8_t X)
  150. {
  151.         OLED_WriteCommand(0xB0 | Y);                                        //设置Y位置
  152.         OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));        //设置X位置低4位
  153.         OLED_WriteCommand(0x00 | (X & 0x0F));                        //设置X位置高4位
  154. }

  155. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  156. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char PI[])
  157. {         
  158. unsigned int j=0;
  159. unsigned char x,y;
  160.   
  161. // if(y1%8==0) y=y1/8;      
  162. // else y=y1/8+1;
  163.         for(y=y0;y<y1;y++)
  164.         {
  165.                 OLED_SetCursor(y,x0);  //第一个设置y,第二个设置x//设置光标位置左上角(0,0) 往下0-7 , 往右0-127
  166.     for(x=x0;x<x1;x++)
  167.             {      
  168.                     OLED_WriteData(PI[j++]);                    //写数据
  169.             }
  170.         }
  171. }

  172. void OLED_BMP(void)
  173. {        
  174.                  OLED_Clear();
  175.                  OLED_DrawBMP(0,0,127,0,(unsigned char *)gImage_1);
  176.                  OLED_DrawBMP(0,0,127,1,(unsigned char *)gImage_1);
  177.                  OLED_DrawBMP(0,0,127,2,(unsigned char *)gImage_1);
  178.                  OLED_DrawBMP(0,0,127,3,(unsigned char *)gImage_1);
  179.                  OLED_DrawBMP(0,0,127,4,(unsigned char *)gImage_1);
  180.                  OLED_DrawBMP(0,0,127,5,(unsigned char *)gImage_1);
  181.                  OLED_DrawBMP(0,0,127,6,(unsigned char *)gImage_1);
  182.                  OLED_DrawBMP(0,0,127,7,(unsigned char *)gImage_1);
  183. }


  184. /**
  185.   * @brief  OLED初始化
  186.   * @param  无
  187.   * @retval 无
  188.   */
  189. void OLED_Init(void)
  190. {
  191.         uint32_t i, j;
  192.         
  193.         for (i = 0; i < 1000; i++)                        //上电延时
  194.         {
  195.                 for (j = 0; j < 1000; j++);
  196.         }
  197.         
  198.         OLED_I2C_Init();                        //端口初始化
  199.         
  200.         OLED_WriteCommand(0xAE);        //关闭显示
  201.         
  202.         OLED_WriteCommand(0xD5);        //设置显示时钟分频比/振荡器频率
  203.         OLED_WriteCommand(0x80);
  204.         
  205.         OLED_WriteCommand(0xA8);        //设置多路复用率
  206.         OLED_WriteCommand(0x3F);
  207.         
  208.         OLED_WriteCommand(0xD3);        //设置显示偏移
  209.         OLED_WriteCommand(0x00);
  210.         
  211.         OLED_WriteCommand(0x40);        //设置显示开始行
  212.         
  213.         OLED_WriteCommand(0xA1);        //设置左右方向,0xA1正常 0xA0左右反置
  214.         
  215.         OLED_WriteCommand(0xC0);        //设置上下方向,0xC8正常 0xC0上下反置

  216.         OLED_WriteCommand(0xDA);        //设置COM引脚硬件配置
  217.         OLED_WriteCommand(0x12);
  218.         
  219.         OLED_WriteCommand(0x81);        //设置对比度控制
  220.         OLED_WriteCommand(0xCF);

  221.         OLED_WriteCommand(0xD9);        //设置预充电周期
  222.         OLED_WriteCommand(0xF1);

  223.         OLED_WriteCommand(0xDB);        //设置VCOMH取消选择级别
  224.         OLED_WriteCommand(0x30);

  225.         OLED_WriteCommand(0xA4);        //设置整个显示打开/关闭

  226.         OLED_WriteCommand(0xA6);        //设置正常/倒转显示

  227.         OLED_WriteCommand(0x8D);        //设置充电泵
  228.         OLED_WriteCommand(0x14);

  229.         OLED_WriteCommand(0xAF);        //开启显示
  230.                
  231.         OLED_Clear();                                //OLED清屏
  232. }
复制代码

Keil代码下载: Keil代码和图片.7z (205.79 KB, 下载次数: 45)

评分

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

查看全部评分

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

使用道具 举报

来自 2#
ID:1044904 发表于 2022-10-9 22:09 | 只看该作者
确实是高质量的总结
回复

使用道具 举报

板凳
ID:1042277 发表于 2022-10-8 15:36 | 只看该作者
取模取反了,图片黑白颠倒了,自己弄的时候调一下
回复

使用道具 举报

地板
ID:1042277 发表于 2022-10-8 15:41 | 只看该作者
真的裂开,我想看看我自己放的啥,忘了下自己的东西也扣币,连下了两次扣了十个币。裂开裂开
回复

使用道具 举报

5#
ID:852577 发表于 2022-10-31 20:02 | 只看该作者
2906452929 发表于 2022-10-8 15:36
取模取反了,图片黑白颠倒了,自己弄的时候调一下

技术小吴6666666
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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