找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2481|回復(fù): 4
收起左側(cè)

STM32F103ZE單片機(jī)芯片,IIC驅(qū)動(dòng)oled顯示圖片代碼

[復(fù)制鏈接]
ID:1042277 發(fā)表于 2022-9-15 18:15 | 顯示全部樓層 |閱讀模式
程序代碼在附件中,取模軟件來(lái)自正點(diǎn)原子免費(fèi)學(xué)習(xí)資料,本人接觸這行不久代碼有不足之處可以自行探索修改。因?yàn)槲沂钦罩c(diǎn)原子學(xué)習(xí)的,所以工程文件也是照著正點(diǎn)原子弄的,制作比較簡(jiǎn)單適合新手學(xué)習(xí)。

運(yùn)行結(jié)果如下圖

最終結(jié)果

最終結(jié)果


取模設(shè)置如圖:

取模

取模


圖片取模軟件是Image2Lcd 2.9,請(qǐng)百度自行獲取

STM32單片機(jī)源程序如下:
  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  無(wú)
  25.   * @retval 無(wú)
  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  無(wú)
  37.   * @retval 無(wú)
  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發(fā)送一個(gè)字節(jié)
  47.   * @param  Byte 要發(fā)送的一個(gè)字節(jié)
  48.   * @retval 無(wú)
  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);        //額外的一個(gè)時(shí)鐘,不處理應(yīng)答信號(hào)
  60.         OLED_W_SCL(0);
  61. }

  62. /**
  63.   * @brief  OLED寫命令
  64.   * @param  Command 要寫入的命令
  65.   * @retval 無(wú)
  66.   */
  67. void OLED_WriteCommand(uint8_t Command)
  68. {
  69.         OLED_I2C_Start();
  70.         OLED_I2C_SendByte(0x78);                //從機(jī)地址
  71.         OLED_I2C_SendByte(0x00);                //寫命令
  72.         OLED_I2C_SendByte(Command);
  73.         OLED_I2C_Stop();
  74. }

  75. /**
  76.   * @brief  OLED寫數(shù)據(jù)
  77.   * @param  Data 要寫入的數(shù)據(jù)
  78.   * @retval 無(wú)
  79.   */
  80. void OLED_WriteData(uint8_t Data)
  81. {
  82.         OLED_I2C_Start();
  83.         OLED_I2C_SendByte(0x78);                //從機(jī)地址
  84.         OLED_I2C_SendByte(0x40);                //寫數(shù)據(jù)
  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);                                        //設(shè)置Y位置
  95.                         OLED_WriteCommand(0x10);        //設(shè)置X位置高4位
  96.                         OLED_WriteCommand(0x00);                        //設(shè)置X位置低4位
  97.                 for(n=0;n<128;n++)
  98.                 {
  99.                         OLED_WriteData(OLED_GRAM[n][i]);
  100.                 }
  101.         }   
  102. }

  103. //畫點(diǎn)
  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函數(shù)
  124. u32 mypow(u8 m,u8 n)
  125. {
  126.         u32 result=1;         
  127.         while(n--)result*=m;   
  128.         return result;
  129. }        



  130. //清屏函數(shù),清完屏,整個(gè)屏幕是黑色的!和沒(méi)點(diǎn)亮一樣!!!         
  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設(shè)置光標(biāo)位置
  145.   * @param  Y 以左上角為原點(diǎn),向下方向的坐標(biāo),范圍:0~7
  146.   * @param  X 以左上角為原點(diǎn),向右方向的坐標(biāo),范圍:0~127
  147.   * @retval 無(wú)
  148.   */
  149. void OLED_SetCursor(uint8_t Y, uint8_t X)
  150. {
  151.         OLED_WriteCommand(0xB0 | Y);                                        //設(shè)置Y位置
  152.         OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));        //設(shè)置X位置低4位
  153.         OLED_WriteCommand(0x00 | (X & 0x0F));                        //設(shè)置X位置高4位
  154. }

  155. /***********功能描述:顯示顯示BMP圖片128×64起始點(diǎn)坐標(biāo)(x,y),x的范圍0~127,y為頁(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);  //第一個(gè)設(shè)置y,第二個(gè)設(shè)置x//設(shè)置光標(biāo)位置左上角(0,0) 往下0-7 , 往右0-127
  166.     for(x=x0;x<x1;x++)
  167.             {      
  168.                     OLED_WriteData(PI[j++]);                    //寫數(shù)據(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  無(wú)
  187.   * @retval 無(wú)
  188.   */
  189. void OLED_Init(void)
  190. {
  191.         uint32_t i, j;
  192.         
  193.         for (i = 0; i < 1000; i++)                        //上電延時(shí)
  194.         {
  195.                 for (j = 0; j < 1000; j++);
  196.         }
  197.         
  198.         OLED_I2C_Init();                        //端口初始化
  199.         
  200.         OLED_WriteCommand(0xAE);        //關(guān)閉顯示
  201.         
  202.         OLED_WriteCommand(0xD5);        //設(shè)置顯示時(shí)鐘分頻比/振蕩器頻率
  203.         OLED_WriteCommand(0x80);
  204.         
  205.         OLED_WriteCommand(0xA8);        //設(shè)置多路復(fù)用率
  206.         OLED_WriteCommand(0x3F);
  207.         
  208.         OLED_WriteCommand(0xD3);        //設(shè)置顯示偏移
  209.         OLED_WriteCommand(0x00);
  210.         
  211.         OLED_WriteCommand(0x40);        //設(shè)置顯示開始行
  212.         
  213.         OLED_WriteCommand(0xA1);        //設(shè)置左右方向,0xA1正常 0xA0左右反置
  214.         
  215.         OLED_WriteCommand(0xC0);        //設(shè)置上下方向,0xC8正常 0xC0上下反置

  216.         OLED_WriteCommand(0xDA);        //設(shè)置COM引腳硬件配置
  217.         OLED_WriteCommand(0x12);
  218.         
  219.         OLED_WriteCommand(0x81);        //設(shè)置對(duì)比度控制
  220.         OLED_WriteCommand(0xCF);

  221.         OLED_WriteCommand(0xD9);        //設(shè)置預(yù)充電周期
  222.         OLED_WriteCommand(0xF1);

  223.         OLED_WriteCommand(0xDB);        //設(shè)置VCOMH取消選擇級(jí)別
  224.         OLED_WriteCommand(0x30);

  225.         OLED_WriteCommand(0xA4);        //設(shè)置整個(gè)顯示打開/關(guān)閉

  226.         OLED_WriteCommand(0xA6);        //設(shè)置正常/倒轉(zhuǎn)顯示

  227.         OLED_WriteCommand(0x8D);        //設(shè)置充電泵
  228.         OLED_WriteCommand(0x14);

  229.         OLED_WriteCommand(0xAF);        //開啟顯示
  230.                
  231.         OLED_Clear();                                //OLED清屏
  232. }
復(fù)制代碼

Keil代碼下載: Keil代碼和圖片.7z (205.79 KB, 下載次數(shù): 45)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1044904 發(fā)表于 2022-10-9 22:09 | 顯示全部樓層
確實(shí)是高質(zhì)量的總結(jié)
回復(fù)

使用道具 舉報(bào)

ID:1042277 發(fā)表于 2022-10-8 15:36 | 顯示全部樓層
取模取反了,圖片黑白顛倒了,自己弄的時(shí)候調(diào)一下
回復(fù)

使用道具 舉報(bào)

ID:1042277 發(fā)表于 2022-10-8 15:41 | 顯示全部樓層
真的裂開,我想看看我自己放的啥,忘了下自己的東西也扣幣,連下了兩次扣了十個(gè)幣。裂開裂開
回復(fù)

使用道具 舉報(bào)

ID:852577 發(fā)表于 2022-10-31 20:02 | 顯示全部樓層
2906452929 發(fā)表于 2022-10-8 15:36
取模取反了,圖片黑白顛倒了,自己弄的時(shí)候調(diào)一下

技術(shù)小吳6666666
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表