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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2552|回復: 1
收起左側

基于STM32F103ZET6的OLED顯示代碼

[復制鏈接]
ID:899790 發表于 2022-7-28 22:07 | 顯示全部樓層 |閱讀模式
OLED為0.96寸四針腳的IIC接口方式
適用于STM32F103ZET6
接線說明:
VCC —— 3.3V
GND —— GND
SCL  —— PB6
SDA  —— PB7
注意VCC不要接到5V上,容易燒壞屏幕。

單片機源程序如下:
  1. #include "oled.h"
  2. #include "myiic.h"
  3. #include "delay.h"
  4. #include "oledfont.h"  

  5. //OLED初始化
  6. void OLED_Init(void)
  7. {
  8.         IIC_Init();
  9.         delay_ms(200);
  10.         OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  11.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address0
  12.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address16
  13.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  14.         OLED_WR_Byte(0xB0,OLED_CMD);//--set page address176
  15.         OLED_WR_Byte(0x81,OLED_CMD); // contract control
  16.         OLED_WR_Byte(0x08,OLED_CMD);//--128   
  17.         OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  18.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  19.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  20.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  21.         OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  22.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  23.         OLED_WR_Byte(0x00,OLED_CMD);//
  24.        
  25.         OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  26.         OLED_WR_Byte(0x80,OLED_CMD);//
  27.        
  28.        
  29.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  30.         OLED_WR_Byte(0x05,OLED_CMD);//
  31.        
  32.         OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  33.         OLED_WR_Byte(0xF1,OLED_CMD);//
  34.        
  35.         OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  36.         OLED_WR_Byte(0x12,OLED_CMD);//
  37.        
  38.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  39.         OLED_WR_Byte(0x30,OLED_CMD);//
  40.        
  41.         OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  42.         OLED_WR_Byte(0x14,OLED_CMD);//
  43.        
  44.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  45. }

  46. //OLED寫命令
  47. void Write_OLED_Command(unsigned char OLED_Command)
  48. {
  49.         IIC_Start();
  50.         IIC_Send_Byte(0x78);            //Slave address,SA0=0
  51.         IIC_Wait_Ack();       
  52.         IIC_Send_Byte(0x00);                        //write command
  53.         IIC_Wait_Ack();       
  54.         IIC_Send_Byte(OLED_Command);
  55.         IIC_Wait_Ack();       
  56.         IIC_Stop();
  57. }

  58. //OLED寫數據,這個寫數據是指要傳輸數據
  59. void Write_OLED_Data(unsigned char OLED_Data)
  60. {
  61.         IIC_Start();
  62.         IIC_Send_Byte(0x78);                        //D/C#=0; R/W#=0
  63.         IIC_Wait_Ack();       
  64.         IIC_Send_Byte(0x40);                        //write data
  65.         IIC_Wait_Ack();       
  66.         IIC_Send_Byte(OLED_Data);
  67.         IIC_Wait_Ack();       
  68.         IIC_Stop();
  69. }

  70. //OLED寫函數,在總線上往OLED寫數據
  71. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  72. {
  73.         if(cmd)
  74.         {
  75.                 Write_OLED_Data(dat);
  76.         }
  77.         else
  78.         {
  79.                 Write_OLED_Command(dat);       
  80.         }
  81. }

  82. //fill_picture
  83. void fill_picture(unsigned char fill_Data)
  84. {
  85.         unsigned char m,n;
  86.         for(m=0;m<8;m++)
  87.         {
  88.                 OLED_WR_Byte(0xb0+m,0);                //page0-page1
  89.                 OLED_WR_Byte(0x00,0);                //low column start address
  90.                 OLED_WR_Byte(0x10,0);                //high column start address
  91.                 for(n=0;n<128;n++)
  92.                         {
  93.                                 OLED_WR_Byte(fill_Data,1);
  94.                         }
  95.         }
  96. }

  97. //坐標設置
  98. void OLED_Set_Pos(unsigned char x, unsigned char y)
  99. {
  100.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  101.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  102.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  103. }

  104. //開啟OLED顯示   
  105. void OLED_Display_On(void)
  106. {
  107.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  108.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  109.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  110. }

  111. //關閉OLED顯示     
  112. void OLED_Display_Off(void)
  113. {
  114.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  115.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  116.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  117. }                          

  118. //清屏函數,清完屏,整個屏幕是黑色的!和沒點亮一樣!!!          
  119. void OLED_Clear(void)  
  120. {  
  121.         u8 i,n;                    
  122.         for(i=0;i<8;i++)  
  123.         {  
  124.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //設置頁地址(0~7)
  125.                 OLED_WR_Byte (0x00,OLED_CMD);      //設置顯示位置—列低地址
  126.                 OLED_WR_Byte (0x10,OLED_CMD);      //設置顯示位置—列高地址   
  127.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  128.         } //更新顯示
  129. }

  130. void OLED_On(void)  
  131. {  
  132.         u8 i,n;                    
  133.         for(i=0;i<8;i++)  
  134.         {  
  135.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //設置頁地址(0~7)
  136.                 OLED_WR_Byte (0x00,OLED_CMD);      //設置顯示位置—列低地址
  137.                 OLED_WR_Byte (0x10,OLED_CMD);      //設置顯示位置—列高地址   
  138.                 for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
  139.         } //更新顯示
  140. }

  141. //在指定位置顯示一個字符,包括部分字符
  142. //x:0~127
  143. //y:0~63
  144. //mode:0,反白顯示;1,正常顯示                                 
  145. //size:選擇字體 16/12
  146. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  147. {             
  148.         unsigned char c=0,i=0;       
  149.         c=chr-' ';//c就是庫里的偏移值,看F8X16的取模庫,輸入chr是個字符的ascii碼,減去空格32,得到庫里的的所要顯示數字的位置               
  150.         if(x>Max_Column-1){x=0;y=y+2;}//如果超出了128列就從0列開始并換到下面數第二頁,中間空了一頁
  151.         if(Char_Size ==16) //char_size是描述行的,size=16,說明寫了2頁,8列,標準的英文格式
  152.         {
  153.                 OLED_Set_Pos(x,y);        //設置從x列,y頁開始寫,是從上往下寫的,并且是低位在前
  154.                 for(i=0;i<8;i++)   
  155.                 OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); //這是寫所選擇的第一頁
  156.                 OLED_Set_Pos(x,y+1);
  157.                 for(i=0;i<8;i++)
  158.                 OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  159.         }
  160.         else
  161.         {       
  162.                 OLED_Set_Pos(x,y);  //重新設置頁,開始寫的列不變
  163.                 for(i=0;i<6;i++)
  164.                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);  //寫一個
  165.         }
  166. }

  167. //m^n函數 這是拆分數字中的每一位使用的,就是找數字中的每一位
  168. u32 oled_pow(u8 m,u8 n)
  169. {
  170.         u32 result=1;         
  171.         while(n--)result*=m;   
  172.         return result;
  173. }       

  174. //x,y :起點坐標         
  175. //len :數字的位數
  176. //size:字體大小,大小指的其實是字體高度
  177. //num:數值(0~4294967295);                           
  178. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  179. {                
  180.         u8 t,temp;
  181.         u8 enshow=0;                                                  
  182.         for(t=0;t<len;t++)
  183.         {
  184.                 temp=(num/oled_pow(10,len-t-1))%10;//算出顯示數字的高位
  185.                 if(enshow==0&&t<(len-1))
  186.                 {
  187.                         if(temp==0)
  188.                         {
  189.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2); //如果說數字高位是0的話,顯示空格,知道碰見數字為止
  190.                                 continue;
  191.                         }
  192.                         else enshow=1;                           
  193.                 }
  194.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);  //顯示數字
  195.         }
  196. }

  197. //顯示一個字符號串
  198. void OLED_ShowString(u8 x,u8 y,u8 chr[],u8 Char_Size)
  199. {
  200.         unsigned char j=0;
  201.         while (chr[j]!='\0')
  202.         {               
  203.                 OLED_ShowChar(x,y,chr[j],Char_Size); //顯示字符串,拆分成一個一個的字符
  204.                 x+=8;
  205.                 if(x>120){x=0;y+=2;}
  206.                 j++;
  207.         }
  208. }

  209. //顯示漢字 要取模,取模軟件及其操作在文件夾中,一般漢字顯示區域是16*16
  210. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  211. {                                  
  212.         u8 t,adder=0;
  213.         OLED_Set_Pos(x,y);
  214.        
  215.         for(t=0;t<16;t++)
  216.         {
  217.                 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  218.                 adder+=1;
  219.         }       
  220.         OLED_Set_Pos(x,y+1);       
  221.         for(t=0;t<16;t++)
  222.         {       
  223.                 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  224.                 adder+=1;
  225.         }                                       
  226. }

  227. /***********功能描述:顯示顯示BMP圖片128×64起始點坐標(x,y),x的范圍0~127,y為頁的范圍0~7*****************/
  228. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  229. {        
  230.         unsigned int j=0;
  231.         unsigned char x,y;

  232.         if(y1%8==0) y=y1/8;      
  233.         else y=y1/8+1;
  234.        
  235.         for(y=y0;y<y1;y++)
  236.         {
  237.                 OLED_Set_Pos(x0,y);
  238.                 for(x=x0;x<x1;x++)
  239.                 {      
  240.                         OLED_WR_Byte(BMP[j++],OLED_DATA);           //先把y頁寫滿,然后頁數加一,繼續寫該頁       
  241.                 }
  242.         }
  243. }
復制代碼

Keil代碼下載:
程序.7z (187.82 KB, 下載次數: 52)

評分

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

查看全部評分

回復

使用道具 舉報

ID:701637 發表于 2022-8-13 12:54 | 顯示全部樓層
不知道為什么,我的OLED已經寫入數據了,但是無法正常顯示,不知道是哪個步驟錯了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕国产视频 | 五月精品视频 | 久久精品免费 | 中文字幕一区在线 | 色婷婷久久久久swag精品 | 欧美视频一区二区三区 | 一级黄色片在线免费观看 | 99亚洲综合 | 亚洲国产精品一区二区三区 | 国产一区二区三区久久久久久久久 | 91九色麻豆 | 午夜爽爽爽男女免费观看影院 | 日本久久精品 | 中文字幕一区二区三区四区 | 国产精品一区二区电影 | 日韩久久久久久 | 国产男女猛烈无遮掩视频免费网站 | 久久久久国产精品一区二区 | 色约约视频 | 国产福利在线小视频 | 精品久久久一区二区 | 日韩成人av在线 | 国产精品视频二区三区 | 免费黄色成人 | 亚洲国产二区 | 日韩欧美一级 | 欧美国产日韩在线观看成人 | www成人免费视频 | 天天操综合网站 | 四虎影视1304t | 久久国产一区二区三区 | 最新国产精品精品视频 | 国产精品久久久久久久免费观看 | 91精品国产综合久久香蕉922 | 亚洲视频二区 | 欧美一区二区在线播放 | 久久久久久久久久久久久九 | 国产成人艳妇aa视频在线 | 亚洲国产精品激情在线观看 | 亚洲福利一区二区 | 毛片免费观看 |