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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2439|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

來自 4#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 艹逼网| 自拍视频精品 | 成年人在线观看 | 成人在线欧美 | 可以免费看的毛片 | 欧美日韩专区 | 亚洲国产精品福利 | 久久综合国产 | 成人二区 | 国产欧美在线视频 | 久久伊人精品一区二区三区 | 风间由美一区二区三区在线观看 | 玖玖精品| 激情在线视频 | 在线视频一区二区三区 | 欧美视频三区 | 91精品久久久久久久久 | 欧美日韩亚洲系列 | 色综合天天网 | 一区二区三区国产好的精 | 日韩国产中文字幕 | 超碰人人艹 | 91aiai| 视频在线一区二区 | 久久久久国产一区二区三区 | 欧美精品在线播放 | 丝袜美腿一区二区三区动态图 | 91社区在线观看 | a在线视频 | 欧美高清视频一区 | 国产精品一区二区av | 最新日韩在线 | 国产精品久久久久久久午夜片 | 最新国产精品 | 91精品在线观看入口 | 希岛爱理在线 | 天天久 | av一区二区三区四区 | 人人干视频在线 | 成人性生交大片免费看中文带字幕 | 日韩在线视频免费观看 |