你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F103系列控制的OLED经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 18:38
最近在研究四针的OLED 先上个效果图
总工程文件评论区留下邮箱我会发送


20201202085725528.jpg


硬件部分
有开发板的直接用开发板就好 没有的去某宝买一块STM32F103C8T6(10元左右)
类似这种


20201202090344787.jpg


接线部分
OLED一共有四个接口 本别是SCL(时钟),SDA(数据),GND(电源负),VCC3.3(注意是接3.3V, 5V会烧坏)
电源正负随便接是3.3V就OK SCL,SDA接单片机IO口 具体配置看原理图 我这个芯片的对应的是PB6,7用排线连接就好


硬件部分结束。


软件部分
源码是借鉴的 亲测能用 不得不说 站在巨人的肩膀上真的很舒服 现在分享主和OLED C文件 总工程文件评论区留下邮箱我会发送
  1. //主c文件
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "oled.h"
  5. #include "bmp.h"
  6. int main(void)
  7.   {        u8 t;
  8.                 delay_init();                     //延时函数初始化         
  9.                 NVIC_Configuration();          //设置NVIC中断        
  10.         //        delay_ms(8000);
  11.                 OLED_Init();                        
  12.                 OLED_Clear()          ;
  13.         
  14.                 t=' ';
  15.                 //显示汉字
  16.                 OLED_ShowCHinese(18,0,0);//
  17.                 OLED_ShowCHinese(36,0,1);//
  18.                 OLED_ShowCHinese(72,0,2);//
  19.                 OLED_ShowCHinese(90,0,3);//

  20.         while(1)
  21.         {               
  22.                 OLED_Clear();
  23.                 OLED_ShowCHinese(18,0,0);
  24.                 OLED_ShowCHinese(36,0,1);
  25.                 OLED_ShowCHinese(72,0,2);
  26.                 OLED_ShowCHinese(90,0,3);
  27.                 OLED_ShowString(6,3,"0.96' OLED TEST",16);

  28.                 OLED_ShowString(0,6,"ASCII:",16);  
  29.                 OLED_ShowString(63,6,"CODE:",16);  
  30.                 OLED_ShowChar(48,6,t,16);//显示字符   
  31.                 t++;
  32.                 if(t>'~')t=' ';
  33.                 OLED_ShowNum(103,6,t,3,16);
  34.                 delay_ms(8000);
  35.                 delay_ms(8000);
  36.                 delay_ms(8000);
  37.                 delay_ms(8000);
  38.                 delay_ms(8000);
  39.                 OLED_DrawBMP(0,0,128,8,BMP1);  //显示图片
  40.                 delay_ms(8000);
  41.                 delay_ms(8000);
  42.                 delay_ms(8000);
  43.                 delay_ms(8000);
  44.                 OLED_DrawBMP(0,0,128,8,BMP1);
  45.                 delay_ms(8000);
  46.                 delay_ms(8000);
  47.                 delay_ms(8000);
  48.                 delay_ms(8000);
  49.         }         
  50.         
  51. }
  52. //oled c文件
  53. void IIC_Start()
  54. {

  55.         OLED_SCLK_Set() ;
  56.         OLED_SDIN_Set();
  57.         OLED_SDIN_Clr();
  58.         OLED_SCLK_Clr();
  59. }

  60. /**********************************************
  61. //IIC Stop
  62. **********************************************/
  63. void IIC_Stop()
  64. {
  65. OLED_SCLK_Set() ;
  66. //        OLED_SCLK_Clr();
  67.         OLED_SDIN_Clr();
  68.         OLED_SDIN_Set();
  69.         
  70. }

  71. void IIC_Wait_Ack()
  72. {

  73.         //GPIOB->CRH &= 0XFFF0FFFF;        //设置PB12为上拉输入
  74.         //GPIOB->CRH |= 0x00080000;
  75. //        OLED_SDA = 1;
  76. //        delay_us(1);
  77.         //OLED_SCL = 1;
  78.         //delay_us(50000);
  79. /*        while(1)
  80.         {
  81.                 if(!OLED_SDA)                                //判断是否接收到应答
  82.                 {
  83.                         //GPIOB->CRH &= 0XFFF0FFFF;        //设置PB12为推挽输出
  84.                         //GPIOB->CRH |= 0x00030000;
  85.                         return;
  86.                 }
  87.         }
  88. */
  89.         OLED_SCLK_Set() ;
  90.         OLED_SCLK_Clr();
  91. }
  92. /**********************************************
  93. // IIC Write byte
  94. **********************************************/

  95. void Write_IIC_Byte(unsigned char IIC_Byte)
  96. {
  97.         unsigned char i;
  98.         unsigned char m,da;
  99.         da=IIC_Byte;
  100.         OLED_SCLK_Clr();
  101.         for(i=0;i<8;i++)               
  102.         {
  103.                         m=da;
  104.                 //        OLED_SCLK_Clr();
  105.                 m=m&0x80;
  106.                 if(m==0x80)
  107.                 {OLED_SDIN_Set();}
  108.                 else OLED_SDIN_Clr();
  109.                         da=da<<1;
  110.                 OLED_SCLK_Set();
  111.                 OLED_SCLK_Clr();
  112.                 }


  113. }

  114. void Write_IIC_Command(unsigned char IIC_Command)
  115. {
  116.    IIC_Start();
  117.    Write_IIC_Byte(0x78);            //Slave address,SA0=0
  118.         IIC_Wait_Ack();        
  119.    Write_IIC_Byte(0x00);                        //write command
  120.         IIC_Wait_Ack();        
  121.    Write_IIC_Byte(IIC_Command);
  122.         IIC_Wait_Ack();        
  123.    IIC_Stop();
  124. }
  125. /**********************************************
  126. // IIC Write Data
  127. **********************************************/
  128. void Write_IIC_Data(unsigned char IIC_Data)
  129. {
  130.    IIC_Start();
  131.    Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0
  132.         IIC_Wait_Ack();        
  133.    Write_IIC_Byte(0x40);                        //write data
  134.         IIC_Wait_Ack();        
  135.    Write_IIC_Byte(IIC_Data);
  136.         IIC_Wait_Ack();        
  137.    IIC_Stop();
  138. }
  139. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  140. {
  141.         if(cmd)
  142.                         {

  143.    Write_IIC_Data(dat);
  144.    
  145.                 }
  146.         else {
  147.    Write_IIC_Command(dat);
  148.                
  149.         }


  150. }


  151. /********************************************
  152. // fill_Picture
  153. ********************************************/
  154. void fill_picture(unsigned char fill_Data)
  155. {
  156.         unsigned char m,n;
  157.         for(m=0;m<8;m++)
  158.         {
  159.                 OLED_WR_Byte(0xb0+m,0);                //page0-page1
  160.                 OLED_WR_Byte(0x00,0);                //low column start address
  161.                 OLED_WR_Byte(0x10,0);                //high column start address
  162.                 for(n=0;n<128;n++)
  163.                         {
  164.                                 OLED_WR_Byte(fill_Data,1);
  165.                         }
  166.         }
  167. }


  168. /***********************Delay****************************************/
  169. void Delay_50ms(unsigned int Del_50ms)
  170. {
  171.         unsigned int m;
  172.         for(;Del_50ms>0;Del_50ms--)
  173.                 for(m=6245;m>0;m--);
  174. }

  175. void Delay_1ms(unsigned int Del_1ms)
  176. {
  177.         unsigned char j;
  178.         while(Del_1ms--)
  179.         {        
  180.                 for(j=0;j<123;j++);
  181.         }
  182. }

  183. //坐标显示

  184.         void OLED_Set_Pos(unsigned char x, unsigned char y)
  185. {         OLED_WR_Byte(0xb0+y,OLED_CMD);
  186.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  187.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  188. }            
  189. //开启OLED显示   
  190. void OLED_Display_On(void)
  191. {
  192.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDCÃüÁî
  193.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  194.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  195. }
  196. //关闭OLED显示   
  197. void OLED_Display_Off(void)
  198. {
  199.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDCÃüÁî
  200.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  201.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  202. }                                            
  203. //清屏函数  
  204. void OLED_Clear(void)  
  205. {  
  206.         u8 i,n;                    
  207.         for(i=0;i<8;i++)  
  208.         {  
  209.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //ÉèÖÃÒ³µØÖ·£¨0~7£©
  210.                 OLED_WR_Byte (0x00,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
  211.                 OLED_WR_Byte (0x10,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·   
  212.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  213.         } //更新显示
  214. }
  215. void OLED_On(void)  
  216. {  
  217.         u8 i,n;                    
  218.         for(i=0;i<8;i++)  
  219.         {  
  220.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //ÉèÖÃÒ³µØÖ·£¨0~7£©
  221.                 OLED_WR_Byte (0x00,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
  222.                 OLED_WR_Byte (0x10,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·   
  223.                 for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
  224.         } //更新显示
  225. }
  226. //在指定位置显示一个字符
  227. //x:0~127
  228. //y:0~63
  229. //mode: 0反白显示 1正常显示                 
  230. //size:选择字体16/12
  231. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  232. {              
  233.         unsigned char c=0,i=0;        
  234.                 c=chr-' ';//得到偏移后的值                        
  235.                 if(x>Max_Column-1){x=0;y=y+2;}
  236.                 if(Char_Size ==16)
  237.                         {
  238.                         OLED_Set_Pos(x,y);        
  239.                         for(i=0;i<8;i++)
  240.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  241.                         OLED_Set_Pos(x,y+1);
  242.                         for(i=0;i<8;i++)
  243.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  244.                         }
  245.                         else {        
  246.                                 OLED_Set_Pos(x,y);
  247.                                 for(i=0;i<6;i++)
  248.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  249.                                 
  250.                         }
  251. }
  252. //m^n函数
  253. u32 oled_pow(u8 m,u8 n)
  254. {
  255.         u32 result=1;         
  256.         while(n--)result*=m;   
  257.         return result;
  258. }                                 
  259. //显示两个数字
  260. //x,y :起点坐标         
  261. //len :数字的位数
  262. //size:字体的大小
  263. //mode:0填充模式 1叠加模式
  264. //num:数值(0~4294967295);                           
  265. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  266. {                 
  267.         u8 t,temp;
  268.         u8 enshow=0;                                                   
  269.         for(t=0;t<len;t++)
  270.         {
  271.                 temp=(num/oled_pow(10,len-t-1))%10;
  272.                 if(enshow==0&&t<(len-1))
  273.                 {
  274.                         if(temp==0)
  275.                         {
  276.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  277.                                 continue;
  278.                         }else enshow=1;
  279.                           
  280.                 }
  281.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  282.         }
  283. }
  284. //显示一个字符
  285. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  286. {
  287.         unsigned char j=0;
  288.         while (chr[j]!='\0')
  289.         {                OLED_ShowChar(x,y,chr[j],Char_Size);
  290.                         x+=8;
  291.                 if(x>120){x=0;y+=2;}
  292.                         j++;
  293.         }
  294. }
  295. //显示汉字
  296. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  297. {                                 
  298.         u8 t,adder=0;
  299.         OLED_Set_Pos(x,y);        
  300.     for(t=0;t<16;t++)
  301.                 {
  302.                                 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  303.                                 adder+=1;
  304.      }        
  305.                 OLED_Set_Pos(x,y+1);        
  306.     for(t=0;t<16;t++)
  307.                         {        
  308.                                 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  309.                                 adder+=1;
  310.       }                                       
  311. }
  312. /***********显示BMP图片*****************/
  313. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  314. {         
  315. unsigned int j=0;
  316. unsigned char x,y;
  317.   
  318.   if(y1%8==0) y=y1/8;      
  319.   else y=y1/8+1;
  320.         for(y=y0;y<y1;y++)
  321.         {
  322.                 OLED_Set_Pos(x0,y);
  323.     for(x=x0;x<x1;x++)
  324.             {      
  325.                     OLED_WR_Byte(BMP[j++],OLED_DATA);                    
  326.             }
  327.         }
  328. }

  329. //初始化SSD1306                                            
  330. void OLED_Init(void)
  331. {         

  332.          
  333.          GPIO_InitTypeDef  GPIO_InitStructure;
  334.          
  335.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);         //ʹÄÜPC,D,G¶Ë¿ÚʱÖÓ

  336.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8;         //PD3,PD6ÍÆÍìÊä³ö  
  337.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  338.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50HZ
  339.          GPIO_Init(GPIOD, &GPIO_InitStructure);          //初始化GPIOD3,6
  340.          GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8);        //PD3,PD6 Êä³ö¸ß

  341. #if OLED_MODE==1

  342.          GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 推挽输出
  343.          GPIO_Init(GPIOC, &GPIO_InitStructure);
  344.          GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高

  345.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                 //PG13,14,15 OUT推挽输出
  346.          GPIO_Init(GPIOG, &GPIO_InitStructure);
  347.          GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);                                                 //PG13,14,15 OUT  输出高

  348. #else
  349.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;                                 //PC0,1 OUT推挽输出
  350.          GPIO_Init(GPIOC, &GPIO_InitStructure);
  351.          GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1);                                                 //PC0,1 OUT  输出高

  352.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                                 //PG15 OUT 推挽输出          RST
  353.          GPIO_Init(GPIOG, &GPIO_InitStructure);
  354.          GPIO_SetBits(GPIOG,GPIO_Pin_15);                                                 //PG15 OUT  输出高


  355. #endif
  356. delay_ms(200);

  357. OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  358.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  359.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  360.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  361.         OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  362.         OLED_WR_Byte(0x81,OLED_CMD); // contract control
  363.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  364.         OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  365.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  366.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  367.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  368.         OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  369.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  370.         OLED_WR_Byte(0x00,OLED_CMD);//
  371.         
  372.         OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  373.         OLED_WR_Byte(0x80,OLED_CMD);//
  374.         
  375.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  376.         OLED_WR_Byte(0x05,OLED_CMD);//
  377.         
  378.         OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  379.         OLED_WR_Byte(0xF1,OLED_CMD);//
  380.         
  381.         OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  382.         OLED_WR_Byte(0x12,OLED_CMD);//
  383.         
  384.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  385.         OLED_WR_Byte(0x30,OLED_CMD);//
  386.         
  387.         OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  388.         OLED_WR_Byte(0x14,OLED_CMD);//
  389.         
  390.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  391. }  


复制代码

代码部分结束 总工程文件评论区留下邮箱我会发送
2020.12.3
又针对代码做出了一些改良 实现了通过按键实现翻页 按键部分是搬运的正点原子的代码 现贴出主函数
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "oled.h"
  4. #include "key.h"
  5. int main(void)
  6.   {        
  7.                 u8 key=0;
  8.                 delay_init();                    //延时函数初始化         
  9.                 NVIC_Configuration();         //设置nvic中断                     
  10.                 OLED_Init();                        //oled初始化
  11.                 OLED_Clear();           //清屏  
  12.                 KEY_Init();             //按键初始化  
  13.         
  14.                
  15.                 OLED_ShowCHinese(18,0,0);//
  16.                 OLED_ShowCHinese(36,0,1);//
  17.                 OLED_ShowCHinese(72,0,0);//
  18.                 OLED_ShowCHinese(90,0,1);//
  19.    
  20.                 while(1)
  21.         {
  22.                    key=KEY_Scan(0);        //µÃµ½¼üÖµ
  23. //              if(key)
  24. //                {                                                   
  25.                         switch(key)
  26.                         {                                 
  27.                         case WKUP_PRES:                                       
  28.                         OLED_Init();        
  29.                         OLED_Clear();
  30.                     OLED_ShowCHinese(18,0,2);
  31.                     OLED_ShowCHinese(36,0,3);
  32.                     OLED_ShowCHinese(72,0,4);
  33.                     OLED_ShowCHinese(90,0,5);
  34.                         break;
  35.                         case KEY1_PRES:         
  36.                         OLED_Init();        
  37.                         OLED_Clear();
  38.                     OLED_ShowCHinese(18,0,7);
  39.                     OLED_ShowCHinese(36,0,8);
  40.                     OLED_ShowCHinese(72,0,9);
  41.                     OLED_ShowCHinese(90,0,10);
  42.                         break;
  43.                         case KEY0_PRES:        
  44.                         break;
  45.                         }
  46. //                }else delay_ms(10);
  47.         }         
  48. }
  49.         
复制代码

效果如图


20201203084731650.jpg

20201203084743485.jpg

20201203084800539.jpg


完结
————————————————
版权声明:文某9
如有侵权请联系删除


收藏 评论0 发布时间:2023-5-1 18:38

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版