找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1587|回复: 2
收起左侧

0.96寸OLED模块4针-SSD1306 Keil代码分享给需要的人 STM32F103C8T6单片机

[复制链接]
ID:504613 发表于 2023-3-12 08:05 | 显示全部楼层 |阅读模式
     这样技术才能有新发展,每个人思路不一样说不定调出的代码会更好。这是买屏的时候附带的资料分享给需要的人他们家的屏质量不错哦不知道能不能买屏自己把电路设计到板子上,单片机用的是STM32F103C8T6

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

  5. u8 OLED_GRAM[144][8];

  6. //反显函数
  7. void OLED_ColorTurn(u8 i)
  8. {
  9.         if(i==0)
  10.                 {
  11.                         OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
  12.                 }
  13.         if(i==1)
  14.                 {
  15.                         OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
  16.                 }
  17. }

  18. //屏幕旋转180度
  19. void OLED_DisplayTurn(u8 i)
  20. {
  21.         if(i==0)
  22.                 {
  23.                         OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
  24.                         OLED_WR_Byte(0xA1,OLED_CMD);
  25.                 }
  26.         if(i==1)
  27.                 {
  28.                         OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
  29.                         OLED_WR_Byte(0xA0,OLED_CMD);
  30.                 }
  31. }

  32. //延时
  33. void IIC_delay(void)
  34. {
  35.         u8 t=3;
  36.         while(t--);
  37. }

  38. //起始信号
  39. void I2C_Start(void)
  40. {
  41.         OLED_SDA_Set();
  42.         OLED_SCL_Set();
  43.         IIC_delay();
  44.         OLED_SDA_Clr();
  45.         IIC_delay();
  46.         OLED_SCL_Clr();
  47.         IIC_delay();
  48. }

  49. //结束信号
  50. void I2C_Stop(void)
  51. {
  52.         OLED_SDA_Clr();
  53.         OLED_SCL_Set();
  54.         IIC_delay();
  55.         OLED_SDA_Set();
  56. }

  57. //等待信号响应
  58. void I2C_WaitAck(void) //测数据信号的电平
  59. {
  60.         OLED_SDA_Set();
  61.         IIC_delay();
  62.         OLED_SCL_Set();
  63.         IIC_delay();
  64.         OLED_SCL_Clr();
  65.         IIC_delay();
  66. }

  67. //写入一个字节
  68. void Send_Byte(u8 dat)
  69. {
  70.         u8 i;
  71.         for(i=0;i<8;i++)
  72.         {
  73.                 if(dat&0x80)//将dat的8位从最高位依次写入
  74.                 {
  75.                         OLED_SDA_Set();
  76.     }
  77.                 else
  78.                 {
  79.                         OLED_SDA_Clr();
  80.     }
  81.                 IIC_delay();
  82.                 OLED_SCL_Set();
  83.                 IIC_delay();
  84.                 OLED_SCL_Clr();//将时钟信号设置为低电平
  85.                 dat<<=1;
  86.   }
  87. }

  88. //发送一个字节
  89. //mode:数据/命令标志 0,表示命令;1,表示数据;
  90. void OLED_WR_Byte(u8 dat,u8 mode)
  91. {
  92.         I2C_Start();
  93.         Send_Byte(0x78);
  94.         I2C_WaitAck();
  95.         if(mode){Send_Byte(0x40);}
  96.   else{Send_Byte(0x00);}
  97.         I2C_WaitAck();
  98.         Send_Byte(dat);
  99.         I2C_WaitAck();
  100.         I2C_Stop();
  101. }

  102. //开启OLED显示
  103. void OLED_DisPlay_On(void)
  104. {
  105.         OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
  106.         OLED_WR_Byte(0x14,OLED_CMD);//开启电荷泵
  107.         OLED_WR_Byte(0xAF,OLED_CMD);//点亮屏幕
  108. }

  109. //关闭OLED显示
  110. void OLED_DisPlay_Off(void)
  111. {
  112.         OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
  113.         OLED_WR_Byte(0x10,OLED_CMD);//关闭电荷泵
  114.         OLED_WR_Byte(0xAE,OLED_CMD);//关闭屏幕
  115. }

  116. //更新显存到OLED        
  117. void OLED_Refresh(void)
  118. {
  119.         u8 i,n;
  120.         for(i=0;i<8;i++)
  121.         {
  122.                 OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
  123.                 OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
  124.                 OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
  125.                 I2C_Start();
  126.                 Send_Byte(0x78);
  127.                 I2C_WaitAck();
  128.                 Send_Byte(0x40);
  129.                 I2C_WaitAck();
  130.                 for(n=0;n<128;n++)
  131.                 {
  132.                         Send_Byte(OLED_GRAM[n][i]);
  133.                         I2C_WaitAck();
  134.                 }
  135.                 I2C_Stop();
  136.   }
  137. }
  138. //清屏函数
  139. void OLED_Clear(void)
  140. {
  141.         u8 i,n;
  142.         for(i=0;i<8;i++)
  143.         {
  144.            for(n=0;n<128;n++)
  145.                         {
  146.                          OLED_GRAM[n][i]=0;//清除所有数据
  147.                         }
  148.   }
  149.         OLED_Refresh();//更新显示
  150. }

  151. //画点
  152. //x:0~127
  153. //y:0~63
  154. //t:1 填充 0,清空        
  155. void OLED_DrawPoint(u8 x,u8 y,u8 t)
  156. {
  157.         u8 i,m,n;
  158.         i=y/8;
  159.         m=y%8;
  160.         n=1<<m;
  161.         if(t){OLED_GRAM[x][i]|=n;}
  162.         else
  163.         {
  164.                 OLED_GRAM[x][i]=~OLED_GRAM[x][i];
  165.                 OLED_GRAM[x][i]|=n;
  166.                 OLED_GRAM[x][i]=~OLED_GRAM[x][i];
  167.         }
  168. }

  169. //画线
  170. //x1,y1:起点坐标
  171. //x2,y2:结束坐标
  172. void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
  173. {
  174.         u16 t;
  175.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  176.         int incx,incy,uRow,uCol;
  177.         delta_x=x2-x1; //计算坐标增量
  178.         delta_y=y2-y1;
  179.         uRow=x1;//画线起点坐标
  180.         uCol=y1;
  181.         if(delta_x>0)incx=1; //设置单步方向
  182.         else if (delta_x==0)incx=0;//垂直线
  183.         else {incx=-1;delta_x=-delta_x;}
  184.         if(delta_y>0)incy=1;
  185.         else if (delta_y==0)incy=0;//水平线
  186.         else {incy=-1;delta_y=-delta_x;}
  187.         if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  188.         else distance=delta_y;
  189.         for(t=0;t<distance+1;t++)
  190.         {
  191.                 OLED_DrawPoint(uRow,uCol,mode);//画点
  192.                 xerr+=delta_x;
  193.                 yerr+=delta_y;
  194.                 if(xerr>distance)
  195.                 {
  196.                         xerr-=distance;
  197.                         uRow+=incx;
  198.                 }
  199.                 if(yerr>distance)
  200.                 {
  201.                         yerr-=distance;
  202.                         uCol+=incy;
  203.                 }
  204.         }
  205. }
  206. //x,y:圆心坐标
  207. //r:圆的半径
  208. void OLED_DrawCircle(u8 x,u8 y,u8 r)
  209. {
  210.         int a, b,num;
  211.     a = 0;
  212.     b = r;
  213.     while(2 * b * b >= r * r)      
  214.     {
  215.         OLED_DrawPoint(x + a, y - b,1);
  216.         OLED_DrawPoint(x - a, y - b,1);
  217.         OLED_DrawPoint(x - a, y + b,1);
  218.         OLED_DrawPoint(x + a, y + b,1);

  219.         OLED_DrawPoint(x + b, y + a,1);
  220.         OLED_DrawPoint(x + b, y - a,1);
  221.         OLED_DrawPoint(x - b, y - a,1);
  222.         OLED_DrawPoint(x - b, y + a,1);
  223.         
  224.         a++;
  225.         num = (a * a + b * b) - r*r;//计算画的点离圆心的距离
  226.         if(num > 0)
  227.         {
  228.             b--;
  229.             a--;
  230.         }
  231.     }
  232. }
复制代码

Keil代码下载:
Keil代码.7z (196.81 KB, 下载次数: 99)

评分

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

查看全部评分

回复

使用道具 举报

ID:1034178 发表于 2023-10-19 13:23 来自手机 | 显示全部楼层
有单独卖屏的,不过软排线不太好焊接
回复

使用道具 举报

ID:1093842 发表于 2024-1-25 15:55 | 显示全部楼层
有stc8h单片机的吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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