找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3209|回复: 1
打印 上一主题 下一主题
收起左侧

基于stm32的0.96寸oled SPI例程_反白显示

[复制链接]
跳转到指定楼层
楼主
ID:234247 发表于 2019-1-26 02:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于stm32 的0.96寸oled

单片机源程序如下:
  1. //////////////////////////////////////////////////////////////////////////////////         
  2. //
  3. //  文 件 名   : main.c
  4. //  版 本 号   : v2.0
  5. //  作    者   : HuangKai
  6. //  生成日期   : 2014-0101
  7. //  最近修改   :
  8. //  功能描述   : OLED 4接口演示例程(51系列)
  9. //              说明:
  10. //              ----------------------------------------------------------------
  11. //              GND    电源地
  12. //              VCC  接5V或3.3v电源
  13. //              D0   接PD6(SCL)
  14. //              D1   接PD7(SDA)
  15. //              RES  接PD4
  16. //              DC   接PD5
  17. //              CS   接PD3               
  18. //              ----------------------------------------------------------------
  19. // 修改历史   :
  20. // 日    期   :
  21. // 作    者   : HuangKai
  22. // 修改内容   : 创建文件
  23. //版权所有,盗版必究。
  24. //Copyright(C) 中景园电子2014/3/16
  25. //All rights reserved
  26. //******************************************************************************/

  27. #include "oled.h"
  28. #include "stdlib.h"
  29. #include "oledfont.h"           
  30. #include "delay.h"
  31. //OLED的显存
  32. //存放格式如下.
  33. //[0]0 1 2 3 ... 127        
  34. //[1]0 1 2 3 ... 127        
  35. //[2]0 1 2 3 ... 127        
  36. //[3]0 1 2 3 ... 127        
  37. //[4]0 1 2 3 ... 127        
  38. //[5]0 1 2 3 ... 127        
  39. //[6]0 1 2 3 ... 127        
  40. //[7]0 1 2 3 ... 127                           

  41. #if OLED_MODE==1
  42. //向SSD1106写入一个字节。
  43. //dat:要写入的数据/命令
  44. //cmd:数据/命令标志 0,表示命令;1,表示数据;
  45. void OLED_WR_Byte(u8 dat,u8 cmd)
  46. {
  47.         DATAOUT(dat);            
  48.         if(cmd)
  49.           OLED_DC_Set();
  50.         else
  51.           OLED_DC_Clr();                  
  52.         OLED_CS_Clr();
  53.         OLED_WR_Clr();         
  54.         OLED_WR_Set();
  55.         OLED_CS_Set();         
  56.         OLED_DC_Set();         
  57. }                        
  58. #else
  59. //向SSD1106写入一个字节。
  60. //dat:要写入的数据/命令
  61. //cmd:数据/命令标志 0,表示命令;1,表示数据;
  62. void OLED_WR_Byte(u8 dat,u8 cmd)
  63. {        
  64.         u8 i;                          
  65.         if(cmd)
  66.           OLED_DC_Set();
  67.         else
  68.           OLED_DC_Clr();                  
  69.         OLED_CS_Clr();
  70.         for(i=0;i<8;i++)
  71.         {                          
  72.                 OLED_SCLK_Clr();
  73.                 if(dat&0x80)
  74.                    OLED_SDIN_Set();
  75.                 else
  76.                    OLED_SDIN_Clr();
  77.                 OLED_SCLK_Set();
  78.                 dat<<=1;   
  79.         }                                                   
  80.         OLED_CS_Set();
  81.         OLED_DC_Set();            
  82. }

  83. void OLED_WR_Byte2(u8 dat,u8 cmd)
  84. {        
  85.         u8 i;                          
  86.         if(cmd)
  87.           OLED_DC_Set();
  88.         else
  89.           OLED_DC_Clr();                  
  90.         OLED_CS_Clr();
  91.         for(i=0;i<8;i++)
  92.         {                          
  93.                 OLED_SCLK_Clr();
  94.                 if(dat&0x80)
  95.                         OLED_SDIN_Clr();
  96.                   
  97.                 else
  98.                     OLED_SDIN_Set();
  99.                 OLED_SCLK_Set();
  100.                 dat<<=1;   
  101.         }                                                   
  102.         OLED_CS_Set();
  103.         OLED_DC_Set();            
  104. }
  105. #endif
  106.         void OLED_Set_Pos(unsigned char x, unsigned char y)
  107. {
  108.         OLED_WR_Byte(0xb0+y,OLED_CMD);
  109.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  110.         OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
  111. }            
  112. //开启OLED显示   
  113. void OLED_Display_On(void)
  114. {
  115.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  116.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  117.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  118. }
  119. //关闭OLED显示     
  120. void OLED_Display_Off(void)
  121. {
  122.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  123.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  124.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  125. }                                            
  126. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!         
  127. void OLED_Clear(void)  
  128. {  
  129.         u8 i,n;                    
  130.         for(i=0;i<8;i++)  
  131.         {  
  132.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  133.                 OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  134.                 OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  135.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  136.         } //更新显示
  137. }


  138. //在指定位置显示一个字符,包括部分字符
  139. //x:0~127
  140. //y:0~63
  141. //反白显示;         
  142. //size:选择字体 16/12
  143. void OLED_ShowChar(u8 x,u8 y,u8 chr)
  144. {              
  145.         unsigned char c=0,i=0;        
  146.                 c=chr-' ';//得到偏移后的值                        
  147.                 if(x>Max_Column-1){x=0;y=y+2;}
  148.                 if(SIZE ==16)
  149.                         {
  150.                         OLED_Set_Pos(x,y);        
  151.                         for(i=0;i<8;i++)
  152.                         OLED_WR_Byte2(F8X16[c*16+i],OLED_DATA);
  153.                         OLED_Set_Pos(x,y+1);
  154.                         for(i=0;i<8;i++)
  155.                         OLED_WR_Byte2(F8X16[c*16+i+8],OLED_DATA);
  156.                         }
  157.                         else {        
  158.                                 OLED_Set_Pos(x,y+1);
  159.                                 for(i=0;i<6;i++)
  160.                                 OLED_WR_Byte2(F6x8[c][i],OLED_DATA);
  161.                                 
  162.                         }
  163. }
  164. //m^n函数
  165. u32 oled_pow(u8 m,u8 n)
  166. {
  167.         u32 result=1;         
  168.         while(n--)result*=m;   
  169.         return result;
  170. }                                 
  171. //显示2个数字
  172. //x,y :起点坐标         
  173. //len :数字的位数
  174. //size:字体大小
  175. //mode:模式        0,填充模式;1,叠加模式
  176. //num:数值(0~4294967295);                           
  177. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
  178. {                 
  179.         u8 t,temp;
  180.         u8 enshow=0;                                                   
  181.         for(t=0;t<len;t++)
  182.         {
  183.                 temp=(num/oled_pow(10,len-t-1))%10;
  184.                 if(enshow==0&&t<(len-1))
  185.                 {
  186.                         if(temp==0)
  187.                         {
  188.                                 OLED_ShowChar(x+(size/2)*t,y,' ');
  189.                                 continue;
  190.                         }else enshow=1;
  191.                           
  192.                 }
  193.                  OLED_ShowChar(x+(size/2)*t,y,temp+'0');
  194.         }
  195. }
  196. //显示一个字符号串
  197. void OLED_ShowString(u8 x,u8 y,u8 *chr)
  198. {
  199.         unsigned char j=0;
  200.         while (chr[j]!='\0')
  201.         {                OLED_ShowChar(x,y,chr[j]);
  202.                         x+=8;
  203.                 if(x>120){x=0;y+=2;}
  204.                         j++;
  205.         }
  206. }
  207. //显示汉字反白显示
  208. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  209. {                                 
  210.         u8 t,adder=0;
  211.         OLED_Set_Pos(x,y);        
  212.     for(t=0;t<16;t++)
  213.                 {
  214.                                 OLED_WR_Byte2(Hzk[2*no][t],OLED_DATA);
  215.                                 adder+=1;
  216.      }        
  217.                 OLED_Set_Pos(x,y+1);        
  218.     for(t=0;t<16;t++)
  219.                         {        
  220.                                 OLED_WR_Byte2(Hzk[2*no+1][t],OLED_DATA);
  221.                                 adder+=1;
  222.       }                                       
  223. }
  224. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  225. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  226. {         
  227. unsigned int j=0;
  228. unsigned char x,y;
  229.   
  230.   if(y1%8==0) y=y1/8;      
  231.   else y=y1/8+1;
  232.         for(y=y0;y<y1;y++)
  233.         {
  234.                 OLED_Set_Pos(x0,y);
  235.     for(x=x0;x<x1;x++)
  236.             {      
  237.                     OLED_WR_Byte(BMP[j++],OLED_DATA);                    
  238.             }
  239.         }
  240. }


  241. //初始化SSD1306                                            
  242. void OLED_Init(void)
  243. {         

  244.          
  245.          GPIO_InitTypeDef  GPIO_InitStructure;
  246.          
  247.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);         //使能PC,D,G端口时钟

  248.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8;         //PD3,PD6推挽输出  
  249.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  250.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  251.          GPIO_Init(GPIOD, &GPIO_InitStructure);          //初始化GPIOD3,6
  252.          GPIO_SetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_3|GPIO_Pin_8);        //PD3,PD6 输出高
  253.         
  254.         
  255.         //
  256.         

  257.         //

  258. #if OLED_MODE==1

  259.          GPIO_InitStructure.GPIO_Pin =0xFF; //PC0~7 OUT推挽输出
  260.          GPIO_Init(GPIOC, &GPIO_InitStructure);
  261.          GPIO_SetBits(GPIOC,0xFF); //PC0~7输出高

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

  265. #else
  266.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;                                 //PC0,1 OUT推挽输出
  267.          GPIO_Init(GPIOC, &GPIO_InitStructure);
  268.          GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1);                                                 //PC0,1 OUT  输出高

  269.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                                 //PG15 OUT推挽输出          RST
  270.          GPIO_Init(GPIOG, &GPIO_InitStructure);
  271.          GPIO_SetBits(GPIOG,GPIO_Pin_15);                                                 //PG15 OUT  输出高


  272. #endif



  273.   OLED_RST_Set();
  274.         delay_ms(100);
  275.         OLED_RST_Clr();
  276. ……………………

  277. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
中景园电子0.96OLED显示屏_STM32ZET系列_SPI_例程_反白显示.7z (193.47 KB, 下载次数: 35)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-1-26 03:07 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表