久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2895|回復: 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, 下載次數: 110)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品香蕉一区二区三区 | 黄色片在线免费看 | 91视频免费视频 | 色综久久 | 精品入口麻豆88视频 | 欧美精品在线一区二区三区 | 久久精品国产99国产精品 | 中文字幕亚洲视频 | 91看片在线观看 | 亚洲自拍偷拍av | 成人精品国产免费网站 | 亚洲精品自拍 | 国产免费一区二区三区网站免费 | 国产精品国产三级国产aⅴ中文 | 欧美激情综合五月色丁香小说 | 亚洲精品电影 | 日本韩国电影免费观看 | 91人人在线 | 国产亚洲精品久久久久久牛牛 | 欧美激情一区二区 | 免费午夜视频在线观看 | 色婷婷亚洲一区二区三区 | 日韩在线小视频 | 精品日韩一区 | 精品久久久久久亚洲精品 | 久久免费香蕉视频 | 国产精品一区二区在线免费观看 | 亚洲综合大片69999 | 日韩欧美中文在线 | 国产精品777一区二区 | 久久在线看 | 五月婷婷 六月丁香 | 日韩亚洲欧美一区 | 羞羞的视频免费观看 | 久久久久久久一区 | 国产成人a亚洲精品 | 欧美一区二区三区小说 | 欧美一级在线观看 | 一级午夜aaa免费看三区 | 精品久久一区二区三区 | 免费在线看黄视频 |